1) demander un accès par mail (!) pour recevoir un login/password d'accès à l'API
https://data.sncf.com/explore/dataset/a ... formation/
2) avoir en local un fichier de correspondance entre les codes gares (UIC) qui sont utilisés par l'API et le nom réel des gares
On trouve ce fichier ici: https://data.sncf.com/explore/dataset/s ... rt=libelle
(onglet export, puis CSV). Dans mon cas, je l'ai mis dans /home/pi mais peu importe, pensez juste à mettre à jour le code qui donne ce chemin (la ligne contenant file '/home/pi/transilien.csv') suivant l'endroit où vous le mettrez dans votre jeedom. On pourrait envisager un code qui va chercher cette correspondance en ligne mais bon c'est une v1
Ensuite on peut faire des requêtes dans jeedom (moi j'utilise Telegram via une interaction) avec le nom réel des gares (ou une sous-partie de ce nom) ce qui est quand même plus simple que de mémoriser les codes UIC. Bien sûr si vous faites toujours la même requête, vous pouvez mettre les code UIC en dur dans le code et vous passer de l'étape 2 mais ce n'est pas mon usage.
Le code a besoin des variables jeedom suivantes:
gareDepart
gareArrivee
nbTrain: nombre de trains dans la réponse
inline: =0 si vous voulez avoir la réponse avec un train par ligne ou =1 pour avoir tout sur la même ligne.
Le inline vient de mon usage car j'affiche la réponse soit sur Telegram (inline = 0 pour que ça soit plus lisible) soit sur un afficheur LED qui fait défiler une seule ligne (inline =1 dans ce cas)
Par ailleurs il faut renseigner dans le code les variables
$outputname: nom de la variable Jeedom qui recevra la réponse
et APIuser / APIpasswd avec les valeurs reçues par mail de Transilien.
Code : Tout sélectionner
$scenario->setLog("Début scénario : Prochains Trains Transilien");
$outputname = "NextTrains";
$APIuser = "XXXX";
$APIpasswd = "XXXX";
$nbTrain = $scenario->getData("nbTrain", false, 5);
$inline = $scenario->getData("inline", false, 0);
$gareDepart = $scenario->getData("gareDepart", false, "Montparnasse");
$searchDepart = "/".$gareDepart."/i";
$gareArrivee = $scenario->getData("gareArrivee", false, "Rambouillet");
$searchArrivee = "/".$gareArrivee."/i";
// Recherche des codes UIC de départ / arrivée
$codeUICdepart = 0;
$codeUICarrive = 0;
$csv = array_map(function($v){return str_getcsv($v, ";");}, file('/home/pi/transilien.csv'));
foreach($csv as $line){
if(preg_match($searchDepart, $line[2]) == 1){
$codeUICdepart = $line[0];
$codeGAREdepart = $line[2];
$scenario->setLog("Trouvé code départ: ".$codeGAREdepart.":".$codeUICdepart);
}
if(preg_match($searchArrivee, $line[2]) == 1){
$codeUICarrive = $line[0];
$codeGAREarrive = $line[2];
$scenario->setLog("Trouvé code arrivée: ".$codeGAREarrive.":".$codeUICarrive);
}
}
if ($codeUICdepart == 0){
$scenario->setData($outputname, "La gare origine ".$gareDepart." n'a pas été trouvée");
return;
}
if ($codeUICarrive == 0) {
$scenario->setData($outputname, "La gare destination ".$gareArrivee." n'a pas été trouvée");
return;
}
$url="http://api.transilien.com/gare/".$codeUICdepart."/depart/".$codeUICarrive;
$scenario->setLog("URL called : ".$url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $APIuser . ':' . $APIpasswd );
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$output = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
if( $info['http_code'] == 200 ) {
$responseXML = simplexml_load_string($output);
} else {
$scenario->setData($outputname, "l'API Transilien a renvoyé une erreur ".$info['http_code']);
return;
}
$listeTrains = "";
$countTrain = 0;
$currTime = strtotime('now');
foreach ($responseXML->train as $train) {
// le format officiel ISO pour les dates Fr doit contenir des "-",
// sinon c'est une date US (avec le mois en premier) qui est interprêtée
$trainTime = strtotime(str_replace('/', '-', $train->date));
$time = date("H:i",$trainTime);
$diff = floor(($trainTime - $currTime) / 60);
if ($inline == 0){
$listeTrains .= "\r\n";
}
if ($train->etat) {
$listeTrains .= "ATTENTION Train ";
$listeTrains .= $train->etat;
$listeTrains .= " ➔ ";
}
$listeTrains .= $time;
$listeTrains .= " - ";
$listeTrains .= $diff;
$listeTrains .= " min";
$listeTrains .= " (";
$listeTrains .= $train->miss;
$listeTrains .= ") ";
$countTrain++;
if ($countTrain == $nbTrain){
break;
}
}
if ($listeTrains == ""){
$listeTrains = "Aucun train";
}
$tts = "Prochains trains de ".$codeGAREdepart." vers ".$codeGAREarrive.": ".$listeTrains;
$scenario->setData($outputname, $tts);
Code : Tout sélectionner
Prochains trains de PARIS MONTPARNASSE (GARE MONTPARNASSE) vers RAMBOUILLET:
15:35 - 18 min (ROPO)
16:09 - 52 min (CAPO)
16:16 - 59 min (RIPI)
16:24 - 67 min (LEPU)
16:31 - 74 min (RIPI)
A noter: le code fait un choix arbitraire quand une des variables d'entrée correspond à un nom de gare ayant plusieurs correspondances possibles dans la base Transilien. C'est la dernière du fichier qui sera retenue. Par exemple si je donne "Michel" comme gare de départ ou d'arrivée, le code va choisir SAINT-MICHELSUR ORGE. Si c'est saint michel notre dame qu'il vous faut, alors il faut être plus explicite en donnant le nom complet ou demander "notre dame" par exemple. En l'occurrence même le seul mot "dame" suffit car c'est la seule gare qui contient ce mot.