<?
/************************************************************************************/
/* ### Recuperation des horaires de train de la Gare SNCF ### */
/* */
/* Version 2.0 Developpement par eedomusbox@gmail.com */
/* Version 2.1 27/10/20 modification par merguez07 */
/* */
/************************************************************************************/
/* [VAR1]- Cle API SCNF (https://data.sncf.com/api/fr/documentation)
[VAR2]- Id de la gare de depart
[VAR3]- Id de la gare d'arrivee
lien pour trouver les id:
https://api.sncf.com/v1/coverage/sncf/places?q=LYON
/*************************************** API eedomus ********************************/
// import des arguments
$api_sncf_user = getArg('token', true , NULL); // [VAR1]=cle API
$id_departure_city = getArg('dep' , true , NULL); // [VAR2]=id gare depart ex : 26198 (Montelimar)
$id_arrival_city = getArg('arr' , true , NULL); // [VAR3]=id gare arrivee ex : 38185 (Grenoble)
// Remanence xml
$id_query = $id_departure_city.$id_arrival_city;
$CACHE_DURATION = 1; // minutes
$last_xml_success = loadVariable($id_query.'last_xml_success');
if ((time() - $last_xml_success) / 60 < $CACHE_DURATION){
sdk_header('text/xml');
$cached_xml = loadVariable($id_query.'cached_xml');
echo $cached_xml;
die();
}
// Initialiation des variables
$api_sncf_pwd = '';
$query_date = date("Ymd\TH:i"); //date de la requête
$query_time = date("dmY à H:i");
$nb_train = 4;// nombre de train après la date de requête
$query = 'https://'.$api_sncf_user.'@api.sncf.com/v1/coverage/sncf/journeys?from=admin:fr:'.$id_departure_city.'&to=admin:fr:'.$id_arrival_city.'&datetime='.$query_date.'&datetime_represents=departure&min_nb_journeys='.$nb_train;
//requête
$json = httpQuery($query);
$Trains = sdk_json_decode($json, true);
//xml construct
sdk_header('text/xml');
foreach($Trains['journeys'] as $key => $trains) // Lecture des trajets
{
$departure_time = sdk_time($trains['departure_date_time']); //heure du depart (ex:18:02)
$arrival_time = sdk_time($trains['arrival_date_time']); //heure d'arrivee (ex:20:52)
$duration = sdk_diff_time($arrival_time,$departure_time); //durée du trajet (ex:02:50)
$status = $trains['status']; //status du trajet (ok,annulé,en retard )
if ($status=="") $status=" ";
$status = sdk_Message_status($status);
$delay="00:00"; //retard HH:mm
$nb_of_change=0; //nombre de changement de train durant le trajet
foreach($trains['sections'] as $section)
{
if ($section['type']==='public_transport') {
$departure_station_name[$nb_of_change] = sdk_station_name($section['from']['name']); //nom de la gare de depart sur la section (ex:Montelimar)
$arrival_station_name[$nb_of_change] = sdk_station_name($section['to']['name']); //nom de la gare d'arrivee sur la section (ex :valence-ville)
$time_departure[$nb_of_change] = sdk_time($section['departure_date_time']); //heure de depart sur la section (ex:18:02)
$time_arrival[$nb_of_change] = sdk_time($section['base_arrival_date_time']); //heure d'arrivee sur la section (ex:18:32)
$train_number[$nb_of_change] = $section['display_informations']['headsign']; //numero du train sur la section
$nb_of_change++;
}
}
$nb_of_change--;
$label_change =' Direct';
if ($nb_of_change==1) $label_change = ' 1 changement';
if ($nb_of_change>>1) $label_change = ' '.$nb_of_change.' changements';
$departure_name = $departure_station_name[0]; // nom de la gare de depart sur le trajet (ex: Montelimar)
$arrival_name = $arrival_station_name[$nb_of_change]; // nom de la gare d'arrivee sur le trajet (ex : Grenoble)
$number_train="";
if ($nb_of_change==0) $number_train=" train N°:".$train_number[0];
$name_trip ="trajet ".$departure_name." à ".$departure_time."-->".$arrival_name." à ".$arrival_time."(".$duration."/".$label_change.")".$number_train;
$xml .= " <result".($key+1).">" ."\n";
$xml .= " <libelle>" .$name_trip .'</libelle>' ."\n";
$xml .= " <changement>" .$nb_of_change .'</changement>' ."\n";
$xml .= " <ville_depart>" .$departure_name .'</ville_depart>' ."\n";
$xml .= " <ville_arrive>" .$arrival_name .'</ville_arrive>' ."\n";
$xml .= " <heure_depart>" .$departure_time .'</heure_depart>' ."\n";
if ( $status != "aucune anomalie" ) { // Cas d'un probleme avec le trajet (retard, annulation,...)
$retard = '';$text = '';
$numdisrup = $trains['sections'][1]['display_informations']['links'][0]['id']; //id du retard
$retards = $Trains['disruptions'];
//Recherche des retards
foreach($retards as $retard) {
if ( $retard['disruption_id']== $numdisrup ) {
foreach($retard['impacted_objects'][0]['impacted_stops'] as $impactStop) {
$scheduled_departure_time=sdk_time("xxxxxxxxx".$impactStop['base_departure_time']);
if ( $scheduled_departure_time ==$departure_time ) { // Recherche du lieu que l'on veut
$amended_departure_time = sdk_time("xxxxxxxxx".$impactStop['amended_departure_time']); // Nouvel Horaire
$delay = sdk_diff_time($amended_departure_time,$scheduled_departure_time) ;
break;
}
}
}
}
}
$xml .= " <heure_nouveau_depart>" .$amended_departure_time .'</heure_nouveau_depart>' ."\n";
$xml .= " <heure_arrive>" .$arrival_time .'</heure_arrive>' ."\n";
$xml .= " <duree>" .$duration .'</duree>' ."\n";
$xml .= " <status>" .$status .'</status>' ."\n";
$xml .= " <retard>" .$delay .'</retard>' ."\n";
if ($nb_of_change >0) {
for ($a=0;$a<$nb_of_change+1;$a++) {
$name_section = $departure_station_name[$a]." à ".$time_departure[$a]."-->".$arrival_station_name[$a]." à ".$time_arrival[$a]." (train N°:".$train_number[$a].")";
$xml .= " <section".($a+1).">".$name_section."</section".($a+1).">" ."\n";
}
}
$xml .= " </result".($key+1).">" ."\n";
}
$cached_xml = '<?xml version="1.0" encoding="utf8" ?>'."\n";
$cached_xml .= '<result>'."\n";
$cached_xml .= '<cache>0</cache>'."\n";
$cached_xml .= '<duree_cache>'.$CACHE_DURATION.'</duree_cache>'."\n";
$cached_xml .= '<date_requete>'.$query_time.'</date_requete>'."\n";
$cached_xml .= $xml;
$cached_xml .= '</result>'."\n";
echo $cached_xml;
if ($xml != '') {// non vide
$cached_xml = str_replace('<cache>0</cache>', '<cache>1</cache>', $cached_xml);
saveVariable($id_query.'cached_xml', $cached_xml);
saveVariable($id_query.'last_xml_success', time());
}
die;
function sdk_time ($heure_sncf){
$heure=substr($heure_sncf,9,4);
$heure=substr($heure,0,2).':'.substr($heure,2,2);
return $heure;
}
function sdk_station_name($nomgare_sncf){
$nom_gare= sdk_Utf8_ansi($nomgare_sncf);
$nom_gare=substr( $nom_gare,0,strpos( $nom_gare,'(')-1);
return $nom_gare;
}
function sdk_Utf8_ansi($valor='') {
$utf8_ansi2 = array(
"\u00c0" =>"À",
"\u00c1" =>"Á",
"\u00c2" =>"Â",
"\u00c3" =>"Ã",
"\u00c4" =>"Ä",
"\u00c5" =>"Å",
"\u00c6" =>"Æ",
"\u00c7" =>"Ç",
"\u00c8" =>"È",
"\u00c9" =>"É",
"\u00ca" =>"Ê",
"\u00cb" =>"Ë",
"\u00cc" =>"Ì",
"\u00cd" =>"Í",
"\u00ce" =>"Î",
"\u00cf" =>"Ï",
"\u00d1" =>"Ñ",
"\u00d2" =>"Ò",
"\u00d3" =>"Ó",
"\u00d4" =>"Ô",
"\u00d5" =>"Õ",
"\u00d6" =>"Ö",
"\u00d8" =>"Ø",
"\u00d9" =>"Ù",
"\u00da" =>"Ú",
"\u00db" =>"Û",
"\u00dc" =>"Ü",
"\u00dd" =>"Ý",
"\u00df" =>"ß",
"\u00e0" =>"à",
"\u00e1" =>"á",
"\u00e2" =>"â",
"\u00e3" =>"ã",
"\u00e4" =>"ä",
"\u00e5" =>"å",
"\u00e6" =>"æ",
"\u00e7" =>"ç",
"\u00e8" =>"è",
"\u00e9" =>"é",
"\u00ea" =>"ê",
"\u00eb" =>"ë",
"\u00ec" =>"ì",
"\u00ed" =>"í",
"\u00ee" =>"î",
"\u00ef" =>"ï",
"\u00f0" =>"ð",
"\u00f1" =>"ñ",
"\u00f2" =>"ò",
"\u00f3" =>"ó",
"\u00f4" =>"ô",
"\u00f5" =>"õ",
"\u00f6" =>"ö",
"\u00f8" =>"ø",
"\u00f9" =>"ù",
"\u00fa" =>"ú",
"\u00fb" =>"û",
"\u00fc" =>"ü",
"\u00fd" =>"ý",
"\u00ff" =>"ÿ");
return strtr($valor, $utf8_ansi2);
}
function sdk_Message_status($message) {
$message_status = array(
"NO_SERVICE" =>"train supprimé",
"REDUCED_SERVICE" =>"service réduit",
"SIGNIFICANT_DELAYS"=>"retard",
"DETOUR" =>"itinéraire détourné",
"ADDITIONAL_SERVICE"=>"arrêt supplémentaire",
"MODIFIED_SERVICE" =>"trajet modifié",
"OTHER_EFFECT" =>"autre",
"UNKNOWN_EFFECT" =>"inconnu",
"STOP_MOVED" =>"arrêt supprimé",
" " =>"aucune anomalie");
return strtr($message, $message_status);
}
function sdk_diff_time($time_arrival, $time_departure){
//Heures au format (hh:mm) la plus grande puis le plus petite
$tab=explode(":", $time_arrival);
$tab2=explode(":", $time_departure);
$h=$tab[0];
$m=$tab[1];
$h2=$tab2[0];
$m2=$tab2[1];
if ($h2>$h) $h=$h+24;
if ($m2>$m) {
$m=$m+60;
$h2++;
}
$ht=$h-$h2;
$mt=$m-$m2;
if (strlen($ht)==1) $ht="0".$ht;
if (strlen($mt)==1) $mt="0".$mt;
return $ht.":".$mt;
}
?>
<result3>
<libelle>trajet Grenoble à 09:20--> à 10:07(00:47/ Direct) train N°:17614</libelle>
<changement>0</changement>
<ville_depart>Grenoble</ville_depart>
<ville_arrive/>
<heure_depart>09:20</heure_depart>
<heure_arrive>10:07</heure_arrive>
<duree>00:47</duree>
<status>NO_SERVICE</status>
<retard>0</retard>
</result3>
Senateur a écrit:Je ne sais pas comment lier le script à un état avec variables, je l'ai donc lancé dans mon navigateur internet avec l'URL qui va bien. Ca marche très bien en passant les paramètres à l'URL
Senateur a écrit:d'ailleurs, on voit ton token de l'API SNCF dans la capture d'écran en plus de celui que tu as masqué
Senateur a écrit:Un bug sur la ville d'arrivée qui n'apparait pas dans le XML
Senateur a écrit:Donc, idéalement il faudrait effectivement disposer en plus de la gare d'arrivée, de la gare de départ, de l'heure de départ, du retard en mn le cas échéant, d'une variable avec le statut du train (à l'heure, en retard ou supprimé).
Senateur a écrit:- Pour mon usage (et probablement celui de ceux qui prennent le train quotidiennement), je prends un train bien précis le matin.
Pourrait-on imaginer indiquer dans les variables du script une variable horaire qui, si elle est renseignée par l'utilisateur eedomus, va rechercher le train dont l'heure de départ correspond à celle indiquée (ou la plus proche)? Cela permettra en plus d'interroger l'API et de retrouver les informations du train en retard alors que l'heure actuelle a dépassé l'heure à laquelle le train devait initialement desservir la gare de départ.
Senateur a écrit:J'utilise le résultat du script que j'envoie en partie à Jeedom pour faire un TTS Google le matin pour me prévenir des retards. Dans ce cas, il est intéressant d'avoir l'heure dans une version hhmm plutôt que hh:mm (pour l'utiliser dans des règles). Il est également intéressant de l'avoir en format hh:mm pour l'afficher sur un périphérique (ce que je fais avec eedomus à la fois pour l'envoi sur mon Lametric Time ou par SMS sur le trajet du soir du retour).
Senateur a écrit:Je me pose une dernière question. Si je multiplie les capteurs, je multiplie les appels à l'API SNCF (bon on est tout de même limités à 5000 requêtes par jour). Est-ce que cela est possible de stocker en mémoire interne le xml pour renvoyer les valeurs de ce XML, lorsque le dernier appel de l'API est récent?
Senateur a écrit:
Je me pose une dernière question. Si je multiplie les capteurs, je multiplie les appels à l'API SNCF (bon on est tout de même limités à 5000 requêtes par jour). Est-ce que cela est possible de stocker en mémoire interne le xml pour renvoyer les valeurs de ce XML, lorsque le dernier appel de l'API est récent?
merguez07 a écrit:
c'est une bonne remarque et je prevoyais de rajouter effectivement une "remanence xml".
Je m'en occupe
Senateur a écrit:J'ai regardé un peu le code. De ce que je comprends, le cache est de 5 minutes.
Senateur a écrit:En revanche, si j'ai plusieurs trajets implémentés avec différents capteurs HTTP comprenant des gare d'arrivées et de départs différentes, le script risque de retourner les informations de l'autre trajet.
Senateur a écrit:NO_SERVICE : train supprimé
REDUCED_SERVICE : service réduit
SIGNIFICANT_DELAYS : retard
DETOUR : itinéraire détourné
ADDITIONAL_SERVICE : arrêt supplémentaire
MODIFIED_SERVICE : trajet modifié
OTHER_EFFECT : autre
UNKNOWN_EFFECT : inconnu
STOP_MOVED : arrêt supprimé
Et si la balise est vide : aucune anomalie
Senateur a écrit:Dans les options pour la journée souhaitée, il est peut être possible de choisir semaine / we en plus du jour de la semaine ?
Retour vers Scripts & Périphériques du store
Utilisateurs parcourant ce forum : stefane28 et 12 invité(s)