Je souhaitais partager avec vous mon scénario qui permet de récupérer les horaires de passage des prochains trains Transilien aux gares de votre choix. Il peut être utile par exemple pour annoncer vocalement la liste des prochains trains.
Je l'utilise quotidiennement sur le RER E car il y a souvent des trains supprimés et/ou retardés.
edit : ça y est, il est disponible dans le market des scénarios (faire une recherche sur Transilien pour le trouver).
Documentation :
Ce scénario va chercher les 3 prochains trains Transilien sur le parcours de votre choix
Il initialise une variable "transilienTTS" qui va contenir une phrase indiquant les horaires de passage des prochains trains. Cette phrase est bien entendu modifiable dans le code.
Il annonce aussi les trains en retard ou supprimés.
Pour fonctionner, vous devez trouver le nom de code de votre gare, notamment grâce au site :
https://transilien.mobi/train
Indiquez votre gare de départ ainsi que votre gare d'arrivée et cliquez sur "Partir maintenant". Vous arriverez alors sur une URL du type :
https://transilien.mobi/train/result?id ... idDest=HSL
Ici j'ai mis "Rosa Parks" comme gare de départ et "Haussmann Saint Lazare" comme gare d'arrivée.
- Rosa Parks a donc pour code => RPA
- Haussmann Saint Lazare a donc pour code => HSL
Créer une variable "dataTrain" au format suivant : [station départ]*[station arrivée]*[nombre de trains]
Cela correspond dans notre exemple à : RPA*HSL*3
Méthode alternative
Vous pouvez reporter directement dans le script les codes trouvés dans l'URL
$fromStation => mettre le code de votre gare de départ
$destStation => mettre le code de votre gare d'arrivée
Après l'exécution, une variable "transilienTTS" est généré. Elle contient une phrase qui indique l'heure de passage des prochains trains.
Exemple :
Code : Tout sélectionner
"Prochains trains : 8h15, 8h30 et 8h45 (retardé). Attention : Le train de 8h25 est supprimé !"
Code : Tout sélectionner
$scenario->setLog("Début scénario : Prochains Trains Transilien");
/********************
* Code source publié sous licence GPL V3 :
* http://www.gnu.org/licenses/gpl-3.0.fr.html
*********************/
/**
* Initialisation des variables
*/
$dataTrain = explode("*", $scenario->getData("dataTrain", false, "VFR*HSL*3"));
$nbTrain = $dataTrain[2]; // Nombre de prochains trains à annoncer (ne pas dépasser 9 sinon ça ne marchera pas)
$fromStation = $dataTrain[0]; // Code station de départ
$destStation = $dataTrain[1]; // Code station d'arrivée
$transilienURL = "https://transilien.mobi/train/result?idOrigin=".$fromStation."&idDest=".$destStation;
/**
* CURL INIT
*/
$defaults = array(
CURLOPT_URL => $transilienURL,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_TIMEOUT => 4
);
$curl = curl_init();
curl_setopt_array($curl, $defaults);
$results = curl_exec($curl);
curl_close($curl);
/**
* Fetching JSON data
*/
$html = new DOMDocument();
$html->loadHTML($results);
$html->saveHTML();
$jsonElm = $html->getElementbyId("infos")->getAttribute("value");
$listeTrains = json_decode($jsonElm, TRUE);
$scenario->setLog("Nombre de prochains trains : ".count($listeTrains));
/**
* On récupère la liste des prochains trains
*/
$trainOnTime = new ArrayObject(); // Tableau des trains qui sont à l'heure
$trainDelayed = new ArrayObject(); // Tableau des trains qui sont en retard
$trainDeleted = new ArrayObject(); // Tableau des trains qui sont supprimés
$trainOnTimeAndDelayed = new ArrayObject(); // Tableau des trains qui sont à l'heure ou en retard
for($i=0; $i<count($listeTrains); $i++) {
$train = new ArrayObject();
$train->destination = $listeTrains[$i]['gareArrivee']['name'];
$train->arrivalTime = $listeTrains[$i]['trainHour'];
$train->mentionCode = isset($listeTrains[$i]['codeMention'])?($listeTrains[$i]['codeMention']):"Z";
$train->mentionText = isset($listeTrains[$i]['mention'])?$listeTrains[$i]['mention']:"";
$scenario->setLog("Heure : ".$train->arrivalTime);
switch($train->mentionCode) {
case "N": // le train est à l'heure
case "Z": // code inconnu ou non renseigné
$trainOnTime->append($train);
$trainOnTimeAndDelayed->append($train);
break;
case "S": // le train est supprimé
$trainDeleted->append($train);
break;
case "T": // le train est retardé
$trainDelayed->append($train);
$trainOnTimeAndDelayed->append($train);
break;
}
}
/**
* Construction de la phrase pour synthèse vocale
* Partie à customiser vous-même si vous souhaitez modifier les phrases.
*
* Cette partie génère la phrase suivante (exemple) :
* Prochains trains : 8h15, 8h30 et 8h45 (retardé). Attention : Le train de 8h25 est supprimé !
*/
$tts = "Prochains trains : ";
// Annonce des $nbTrain prochains trains à l'heure et retardés
for($i=0; $i<min($nbTrain, $trainOnTimeAndDelayed->count()); $i++) {
// Détection du séparateur à utiliser
switch($i) {
case 0:
$separator = '';
break;
case $nbTrain-1:
$separator = ' et ';
break;
default:
$separator = ($tts == '')?'':", ";
break;
}
$tts .= $separator;
$tts .= $trainOnTimeAndDelayed[$i]->arrivalTime;
$scenario->setLog("Heure2 : ".$trainOnTimeAndDelayed[$i]->arrivalTime);
// Détection des trains en retard : on rajoute le motif du retard
if($trainOnTimeAndDelayed[$i]->mentionCode == "T") {
$tts .= "(".$trainOnTimeAndDelayed[$i]->mentionText.")";
}
}
$tts .= ". ";
// Annonce des trains supprimés s'il y en a
if($trainDeleted->count() != 0) {
$tts .= "Attention : ";
for($i=0; $i<$trainDeleted->count(); $i++) {
$tts .= "Le train de : ".$trainDeleted[$i]->arrivalTime." est supprimé ! ";
}
}
$scenario->setData("transilienTTS", $tts);
$scenario->setLog("Fin scénario : Prochains trains Transilien");
Exemple d'utilisation du scénario :
Dans mon cas, je me contente d'envoyer une commande à ma tablette domotique (via autoremote) afin de lui faire dire vocalement la phrase générée dans la variable transilienTTS