[Script] Transports Ile de France - IDFM

Discussion et échanges de scripts pour la box eedomus

[Script] Transports Ile de France - IDFM

Messagepar SoicnarfB » 14 Fév 2023 19:25

Bonjour à tous,

une contribution d'un script car l'API Transilien va être bientôt décomissionnée (en mars normalement) et remplacée par l'API d'IDF Mobilité.
Il faut tout d'abord une clé API en s'inscrivant sur le site:
https://prim.iledefrance-mobilites.fr/
(explication: https://prim.iledefrance-mobilites.fr/content/files/2023/02/Documentation-fonctionnelle-PRIM--Fevrier2023--5.pdf)

Puis prendre le script ci-dessous
Code : Tout sélectionner
<?
// appel de eedomus http://localhost/script/script_transilien_new.php&APIkey=[VAR1]&lignestation=[VAR2]&mission=[VAR3]
// lignestation est le code de la ligne et le code de la station séparés par ":" (ex: C01728:412815 -> RERD:Chatelet )
// reference code: https://prim.iledefrance-mobilites.fr/content/files/2023/02/Documentation-fonctionnelle-PRIM--Fevrier2023--5.pdf
// reference des codes STIF lignes: https://data.iledefrance-mobilites.fr/explore/dataset/referentiel-des-lignes/table/?disjunctive.transportmode&disjunctive.transportsubmode&disjunctive.operatorname&disjunctive.networkname
// reference des codes STIF stations/gares: ??? trouvé une référence annexe, plus compréhensible: https://github.com/kalon33/GtfsToSql/blob/master/perimetre_tr_plateforme_stif.txt
// v1
// v1.1: meilleur traitement des suppressions et des retards, integration CET (merci opa95)
// v1.2: intégration "pas de trains prévus (màj $heure)"
// v1.3: 31/05/2023 résolution d'un bug des trains affichés en double

$APIkey = getArg('APIkey');
$lignestation = getArg('lignestation');
$parcours = explode(":",$lignestation);
$ligne = "STIF:Line::".$parcours[0].":"; //ref STIF de la ligne recherchée (ex: )
$station = "STIF:StopPoint:Q:".$parcours[1].":"; // ref STIF de la gare recherchée (ex: STIF:StopPoint:Q:412815 = Chatelet)
$request= getArg('mission'); //mission 4 lettres (ex: DICA) ou 2 dernières lettres (ex: CA pour inclure DICA, FACA, UACA...)

$CET = 1+date('I'); //heure d'hiver 1 ou heure d'éte 2 car horaires en GMT

//pour filtre des horaires et des missions
$heure_actuelle= intval(date("H",time()));
$minute_actuelle =intval(date("m",time()));
$request_length = strlen($request);

//construction requête
$header = array(
    "Accept: application/json" . "\r\n" .
    "apikey: ". $APIkey. "\r\n"
    );

$url="https://prim.iledefrance-mobilites.fr/marketplace/stop-monitoring?MonitoringRef=".$station."&LineRef=".$ligne;

$http_result = httpQuery($url, 'GET', NULL, NULL, $header);
$sortie = jsonToXML($http_result);

//construction réponse xml
@sdk_header('text/xml');
$xml = '<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL;
$xml .= '<root>'.PHP_EOL;
$xmlvide = $xml;
$comparaisonold = $request;

for($i=1;$i<100;$i++){
    $mission = xpath($sortie,"/root/Siri/ServiceDelivery/StopMonitoringDelivery/StopMonitoringDelivery/MonitoredStopVisit/StopMonitoringDelivery[$i]/MonitoredVehicleJourney/JourneyNote/StopMonitoringDelivery/value/text()");
   
    if ($request_length == 2){
        if (substr($mission, -2) == $request)  {
            $horaire = xpath($sortie,"substring-before(substring-after(/root/Siri/ServiceDelivery/StopMonitoringDelivery/StopMonitoringDelivery/MonitoredStopVisit/StopMonitoringDelivery[$i]/MonitoredVehicleJourney/MonitoredCall/AimedDepartureTime/text(),'T'),'.')");
            $calcul = explode(":", $horaire);
            $delai = xpath($sortie,"/root/Siri/ServiceDelivery/StopMonitoringDelivery/StopMonitoringDelivery/MonitoredStopVisit/StopMonitoringDelivery[$i]/MonitoredVehicleJourney/MonitoredCall/ArrivalStatus/text()");
            if(intval(($calcul[0])+intval($CET) >= $heure_actuelle) && (intval($calcul[1]) >= $minute_actuelle)){
                $comparaison =  substr($mission,0,2).($calcul[0]+intval($CET)).":".$calcul[1];
                if ($comparaison <> $comparaisonold) {
                $xml .= '<train>'.'<mission>'." ".substr($mission,0,2).'</mission>'.PHP_EOL;
                $xml .= '<horaire>'.($calcul[0]+intval($CET)).":".$calcul[1].'</horaire>'.PHP_EOL;
                    if(($delai <> "onTime") && $delai <> "0"){
                        if($delai == "cancelled"){
                            $xml .= '<delai>'."Sup".'</delai>'.PHP_EOL;
                        } else {
                        $xml .= '<delai>'."R".$delai." ".'</delai>'.PHP_EOL;
                        }
                    }
                  $xml .= '</train>'.PHP_EOL;
                $comparaisonold = $comparaison;
                }
             
            }
             
        }
     }elseif ($request_length == 4){
         if ($mission == $request)  {
            $horaire = xpath($sortie,"substring-before(substring-after(/root/Siri/ServiceDelivery/StopMonitoringDelivery/StopMonitoringDelivery/MonitoredStopVisit/StopMonitoringDelivery[$i]/MonitoredVehicleJourney/MonitoredCall/AimedDepartureTime/text(),'T'),'.')");
            $calcul = explode(":", $horaire);
            $delai = xpath($sortie,"/root/Siri/ServiceDelivery/StopMonitoringDelivery/StopMonitoringDelivery/MonitoredStopVisit/StopMonitoringDelivery[$i]/MonitoredVehicleJourney/MonitoredCall/ArrivalStatus/text()");
            if(intval(($calcul[0])+intval($CET) >= $heure_actuelle) && (intval($calcul[1]) >= $minute_actuelle)){
                $comparaison =  $mission.($calcul[0]+intval($CET)).":".$calcul[1];
                if ($comparaison <> $comparaisonold) {
                $xml .= '<train>'.'<mission>'.$mission.'</mission>'.PHP_EOL;
                $xml .= '<horaire>'.($calcul[0]+intval($CET)).":".$calcul[1].'</horaire>'." ".PHP_EOL;
                    if(($delai <> "onTime") && $delai <> "0"){
                        if($delai == "cancelled"){
                            $xml .= '<delai>'."Sup".'</delai>'.PHP_EOL;
                        } else {
                        $xml .= '<delai>'."R".$delai." ".'</delai>'.PHP_EOL;
                        }
                    }
                $xml .= '</train>'.PHP_EOL;
                $comparaisonold = $comparaison;
                }
            }
          }
      }
}
if ($xml == $xmlvide){$xml .="pas de trains prévus (màj ".date("H:m",time()).")";} //sortie vide donc pas de trains

$xml .= '</root>'.PHP_EOL;
echo $xml;
//echo $sortie; // debug

?>


Pour l'utiliser, il faut créer un capteur http (texte) avec les paramètres suivant:
Code : Tout sélectionner
http://localhost/script/?exec=script_transilien_new.php&APIkey=[VAR1]&lignestation=[VAR2]&mission=[VAR3]

  • en VAR1= votre clé API ou Token
  • en VAR2= le code de la ligne et le code de la station séparés par ":" (ex: C01728:412815 -> RERD:Chatelet(RER)) (cf. commentaires en début du script pour trouver votre code gare et code ligne, attention le code gare Gare du nord - RER D n'est pas le même que le code Gare du Nord - métro)
  • en VAR3= la mission du train demandé (exemple pour les RERs: soit "CA" qui va inclure FACA, DICA, UACA, ou soit directement le nom complet de la mission "FACA")

Avec une mission en CO (incluant ZACO, ZICO, ZUCO.. tout en *CO) on obtient le résultat suivant:
ZA 19:06 ZI 19:12 0 ZA 19:21 ZA 19:36 ZA 19:51 ZA 20:06 ZA 20:21 ZA 20:36 ZA 20:51

Avec une mission unique ZICO on obtient le résultat suivant:
ZICO 19:12
(ici parce qu'il n'y a plus qu'un seul ZICO de prévu, sinon cela affiche tous les ZICO)

En théorie ce script doit pouvoir marcher pour les métros, les bus et tous les transports exploités par IDFM mais je n'ai testé qu'avec les RER.
Cela doit pouvoir donner une bonne base pour un développement plus général ;)

v1: 14/02/2023 version initiale
v1.1: 15/02/2023 : meilleur traitement des suppressions et des retards, integration CET (merci opa95)
v1.2: 07/03/2023 intégration "pas de trains prévus"
v1.3: 31/05/2023 résolution d'un bug des trains affichés en double
++
F.
Dernière édition par SoicnarfB le 31 Mai 2023 16:30, édité 5 fois.
SoicnarfB
 
Messages : 40
Inscription : 27 Juil 2016

Re: [Script] Transports Ile de France - IDFM

Messagepar opa95 » 15 Fév 2023 09:58

Bonjour SoicnarfB
SoicnarfB a écrit:Bonjour à tous,complet de la mission "FACA")
- notez le dernier paramètre (CET=1) qui devra être changé à chaque changement d'heure: 1 en hiver, 2 en été (parce qu'IDFM donne des horaires en GMT, va comprendre Charles..., et je n'ai pas trouvé mieux avec le php eedomus, sorry)
++
F.

Tu peux récupérer l'info directement avec
date('I') qui renvoie 0 en hiver et 1 en été donc CET = 1+date('I');
ou bien si tu veux l'adapter à n'importe quel pays avec date(P)
qui renvoie +01:00 actuellement sur eedomus à Paris
ou date(Z) qui renvoie la valeur en secondes 3600 ou...
regarde le manuel PHP
https://www.php.net/manual/fr/datetime.format.php
:)
eedomus+, Zibase V1, RFP1000, RFXcom, RadioDriver CPL 630 X2D, capteurs puissance OWL, thermometres Oregon, téléinfo (USB Linky), detecteurs ouverture X2D, pilotage chauffage X2D, Ecoflow River PRO, PAC Shogun (Atlantic-Cozytouch)
opa95
 
Messages : 731
Inscription : 04 Fév 2019
Localisation : Val d'Oise

Re: [Script] Transports Ile de France - IDFM

Messagepar SoicnarfB » 15 Fév 2023 10:31

Super opa95 !
Merci bien, je mets à jour le script et le premier post !
SoicnarfB
 
Messages : 40
Inscription : 27 Juil 2016

Re: [Script] Transports Ile de France - IDFM

Messagepar SoicnarfB » 16 Fév 2023 12:47

re bonjour,

qui peut le plus peut aussi le moins.
Simple infotrafic d'une ligne
Code : Tout sélectionner
<?
// appel de eedomus http://localhost/script/script_transilien_infotrafic.php&APIkey=[VAR1]&ligne=[VAR2]
// lignestation est le code de la ligne (ex: C01728 -> RERD)
// reference code: https://prim.iledefrance-mobilites.fr/content/files/2023/02/Documentation-fonctionnelle-PRIM--Fevrier2023--5.pdf
// reference des codes STIF lignes: https://data.iledefrance-mobilites.fr/explore/dataset/referentiel-des-lignes/table/?disjunctive.transportmode&disjunctive.transportsubmode&disjunctive.operatorname&disjunctive.networkname
// reference des codes STIF stations/gares: ??? trouvé une référence annexe, plus compréhensible: https://github.com/kalon33/GtfsToSql/blob/master/perimetre_tr_plateforme_stif.txt
// v1 version initiale
// v1.1 correction d'un bug dans le message "pas de perturbation", l'horaire ResponseTime est donné en CET (?!?!)
// v1.2 correction des "é"
// v1.3 8/03/20223 correction des E accentué, è

$APIkey = getArg('APIkey');
$ligne = getArg('ligne');
$line = "STIF:Line::".$ligne.":"; //ref STIF de la ligne recherchée (ex: )


$CET = 1+date('I'); //heure d'hiver 1 ou heure d'éte 2 car horaires en GMT

//pour filtre des horaires et des missions
$heure_actuelle= intval(date("H",time()));
$minute_actuelle =intval(date("m",time()));
$request_length = strlen($request);

//construction requête
$header = array(
    "Accept: application/json" . "\r\n" .
    "apikey: ". $APIkey. "\r\n"
    );

$url="https://prim.iledefrance-mobilites.fr/marketplace/general-message?&LineRef=".$line;

$http_result = httpQuery($url, 'GET', NULL, NULL, $header);
$sortie = jsonToXML($http_result);

//construction réponse xml
@sdk_header('text/xml');
$xml = '<?xml version="1.0" encoding="ISO-8859-1"?>'.PHP_EOL;
$xml .= '<root>'.PHP_EOL;

$InfoChannelRef = xpath($sortie,"//InfoChannelRef/value");

if ($InfoChannelRef == "Perturbation"){
        $heuredebut=xpath($sortie,"substring-before(substring-after(//RecordedAtTime,'T'),'.')");
        $heurefinprevue=xpath($sortie,"substring-before(substring-after(//ValidUntilTime,'T'),'.')");
        $calculheuredebut=explode(":", $heuredebut);
        $calculheuredefin=explode(":",$heurefinprevue);
        $debutincident=($calculheuredebut[0]+intval($CET)).":".$calculheuredebut[1];
        $finincident=($calculheuredefin[0]+intval($CET)).":".$calculheuredefin[1];
        $message = xpath($sortie,"//MessageText/value");
        //Sanitization du message encodé en je-sais-pas-quoi mais pas ISO8859
        $message = str_replace("é","é",$message);
        $message = str_replace("ÃÂ","à",$message);
        $message = str_replace("à‰","E",$message);
        $message = str_replace("à¨","è",$message);
        $xml .= '<message>'.$debutincident." ".$message." jusqu'à ".$finincident.'</message>';
    }else
    {   $ResponseTime = xpath($sortie,"substring-before(substring-after(//ResponseTimestamp,'T'),'.')");
        $xml .= '<message>'."Il n'y a pas de perturbation sur la ligne "."(".$ResponseTime.")".'</message>';
    }
 
$xml .= '</root>'.PHP_EOL;
echo $xml;
//echo $sortie; // debug

?>

Appel par capteur http sous la forme:
Code : Tout sélectionner
http://localhost/script/script_transilien_infotrafic.php&APIkey=[VAR1]&ligne=[VAR2]

avec:
  • en VAR1, l'APIKey ou le token
  • en VAR2, le numéro de la ligne

La sortie donne pour la ligne 1:
Il n'y a pas de perturbation sur la ligne (13:35)

ou pour la ligne 14:
16:53 Ligne fermée jusqu'au jeudi 6 avril, du lundi au jeudi à partir de

(note: en cas de réelle perturbation autre que les fermetures programmées, le message est plus court)

++
F.
SoicnarfB
 
Messages : 40
Inscription : 27 Juil 2016


Retour vers Scripts & Périphériques du store

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 66 invité(s)