Transports en commun dans Jeedom : utilisation de Navitia.io avec Localisation et Trajets

Aujourd’hui, je laisse Me_ du forum Jeedom vous présentez son tuto d’utilisation des transports en commun dans Jeedom. Pour cela, on utilise Localisation et Trajets en plugin qui s’appuie sur les API de Navitia.io.

La structure du plugin a été faite pour permettre de garder la main sur les paramètres de l’API afin de couvrir le maximum des utilisations de chacun, car Navitia est juste une source de données immense et ultra complète. Par contre pas forcément évident de s’y retrouver dans les paramètres à mettre, alors voilà un tuto qui j’espère vous apportera un guide et des lumières sur ce que vous souhaitez faire.

Transports en commun dans Jeedom

Dans le cadre de la création de mon design, j’ai cherché à afficher en permanence les horaires des prochains tramways que mon épouse utilise tous les matins.

Le plugin Localisation et Trajet (geotrav) de Lunarok répond complètement à mon besoin. Cependant, par défaut, le plugin va donner comme informations les horaires de départ et d’arrivée de tous les types de moyens de transport autour de votre domicile et ce dans toutes les directions de chaque ligne de transport en commun trouvée.

Il existe dans le plugin, dans la configuration de l’équipement, un champ « Options de transport » permettant justement de filtrer les résultats qui nous intéressent.

Le plugin s’appuie sur l’API de Navitia, dont on peut trouver la documentation ici

Navitia fourni un playground afin de jouer avec l’API, tester et trouver les détails qui vont nous permettre de configurer le plugin à notre sauce.

Afin d’arriver à obtenir l’affichage des horaires qui nous intéressent, il va falloir suivre différentes étapes qui seront:

1 – configurer le playground ;

2 – trouver les coordonnées (coord) de votre localisation (votre domicile ou votre lieu de travail ou directement celles de l’arrêt utilisé) ;

3 – trouver la région (coverage) à laquelle appartiennent ces coordonnées ;

4 – trouver le type de moyen de transport (physical_modes) que vous souhaitez utiliser ;

5 – trouver la ligne (lines) que vous prenez ;

6 (optionnel) – identifier l’arrêt (stop_areas) où vous montez ;

7 – déterminer le sens (route) qui vous intéresse ;

8 – enfin configurer le plugin.

Pour ce tuto, on va prendre la ligne de bus C26 du réseau TCL de Lyon, au départ de Condorcet et en direction de Grange Blanche.

C’est parti !!!

1 – Configuration du playground

Lorsque vous vous rendez sur http://canaltp.github.io/navitia-playground/play? Pour accéder au playgroud, il faut tout d’abord renseigner le champ « API » avec https://api.navitia.io/v1

et le champ « Token » avec votre clé Navitia que vous avez déjà saisie dans la configuration du plugin :

Si vous n’avez pas encore de clé, il suffit de cliquer sur le lien dans la configuration du plugin et de s’inscrire.

Avec la petite disquette en bout de ligne, vous pouvez enregistrer votre Token afin de ne pas avoir à le ressaisir lors de votre prochaine visite.

2 – Trouver les coordonnées

Plusieurs possibilités dans le plugin, soit vous utilisez la localisation de votre domicile afin que l’API trouve toute seule les stations à proximité, soit vous créez une localisation pour la gare/arrêt que vous utilisez.

Google Maps est votre ami et vous permettra de récupérer les coordonnées : on clique sur la carte là où l’on veut récupérer les coordonnées et elles s’affichent en bas de l’écran au format LAT, LONG.

!!! L’API utilise des coordonnées au format LONG;LAT, il faut donc inverser les coordonnées récupérées sur Google Maps et les séparer par un point-virgule, sans espace !!!

Pour notre cas, Google Maps nous donne 45.778669, 4.866973 qu’il faut transformer en :

4.866973;45.778669

3 – Trouver la région

Nous allons maintenant commencer à utiliser le playground en choisissant coord dans le premier champ vert « Build your path ». On clique sur ADD puis on y colle nos coordonnées.

Il y a un système d’autocomplétion sur cette page lorsque vous remplissez les champs. Utilisez-le, cela évite les erreurs de syntaxe.

Pour le champ coord, l’API est capable de trouver les coordonnées toute seule si vous saisissez directement une adresse.

On peut voir sous « Send the request » que l’API crée automatiquement, en fonction de ce que l’on saisit, une URL correspondant à notre requête. Cliquons sur le gros bouton SUBMIT !

Le résultat de notre requête s’affiche en bas de la page. Pour ces coordonnées, l’API trouve 1 région. Ça tombe bien il va nous falloir cette région pour la suite de notre quête.

À droite, en bout de ligne, il y a deux boutons :

EXT permet d’afficher le contenu du résultat.

{} permet d’afficher le détail du code du résultat.

Si on clique sur les deux accolades, une fenêtre de code s’affiche en dessous. On va pouvoir, dans ce code, récupérer le nom de la région. Ici, c’est [code]fr-se[/code] qui nous intéresse.

!!! L’API a besoin de la région (coverage) (et pas uniquement des coordonnées) afin de trouver les moyens de transports !!!

On va donc pouvoir ajouter coverage à notre requête.

!!! Encore une subtilité, coverage doit se trouver avant coord !!!

Il faut donc modifier notre requête de cette façon :

4 – Trouver le type de moyen de transport

Maintenant que l’API sait où chercher, il va falloir lui dire quoi chercher.

À ces coordonnées, comme on peut le voir sur le plan de la ligne, il y a différentes correspondances tramway et bus.

Il va donc falloir filtrer uniquement les bus.

Pour connaître les différents moyens de transport proposés et surtout leur « id » pour les utiliser dans notre requête, nous allons interroger l’API grâce au champ violet « feature ».

Saisissons physical_modes afin de voir ce que nous propose l’API.

Après un clic sur SUBMIT, nous obtenons en réponse 2 moyens de transport : Bus et Tramway.

Ici, seuls les bus nous intéressent, nous cliquons sur les deux accolades pour récupérer l’id de ce moyen de transport : physical_mode:Bus.

Cet id va être réutilisé dans notre requête en l’ajoutant dans un champ vert :

5 – Trouver la ligne

De la même façon que pour les différents moyens de transport, nous allons interroger l’API afin de connaître les différentes lignes (lines) de bus qui passent ici.

Il faut saisir cette fois-ci [code]lines[/code] dans le champ « feature » puis cliquer sur SUBMIT.

L’API nous propose 4 résultats : 4 lignes de bus passant à proximité des coordonnées que nous avons saisies.

La ligne C26 est celle que nous voulons garder, alors on récupère son id en cliquant sur les deux accolades à droite : line:DGL:C26Ar12.

Encore une fois, cet id doit être ajouté dans un champ vert de notre requête :

6 – Identifier l’arrêt (optionnel)

L’API se basant sur les coordonnées pour travailler, elle va rechercher tous les arrêts/stations autour de celles-ci. Le rayon de recherche peut être un peu large et inclure différents arrêts (stop_areas).

Dans notre cas, avec les coordonnées qu’on lui a passées, elle inclut deux arrêts de bus : Tonkin et Condorcet.

Mais seul Condorcet nous intéresse. Il va donc falloir filtrer la distance de recherche de l’API afin de n’avoir que cet arrêt. Pour cela, on va ajouter un premier paramètre à notre requête grâce au champ bleu « Add parameters ». Nous allons choisir distance comme paramètre et lui passer 100 mètres :

!!! Il semble que la fonction de filtre de l’API soit limitée à un filtre du même type par requête, et ce même si l’interface permet d’en saisir plusieurs. Donc pour ceux qui ont des arrêts de bus d’une même ligne très proches de leur domicile, il va falloir travailler avec les coordonnées de l’arrêt qu’ils utilisent !!!

!!! Nous passons par le paramètre « distance » plutôt qu’un filtre sur l’id de l’arrêt car lorsque l’on met plusieurs filtres différents dans notre requête, celle-ci ne fonctionne plus !!!

7 – Déterminer le sens

La plupart du temps, un arrêt comporte deux routes pour chaque ligne : une dans chaque sens.

Il va donc être nécessaire de trouver la ou les routes qui vont dans la direction que l’on souhaite.

Pour cela, on continue à saisir notre requête en interrogeant l’API sur les différentes routes de cette ligne en saisissant routes dans le champ « feature » :

Nous obtenons 6 résultats :

Il va falloir identifier celle(s) que l’on souhaite garder grâce au plan de la ligne. En effet, la ou les routes que l’on va garder sont celles qui vont dans la bonne direction ET qui passent par l’arrêt auquel on descend !

!!! L’API nous sort 6 routes MAIS si on teste ces routes une part une, on s’aperçoit qu’une seule renvoie des infos. Si l’on utilise celles qui ne renvoient rien, alors nos filtres ne fonctionneront pas !!!

Pour nous les routes [0] à [3] sont celles qui vont dans la bonne direction. Cependant en les testant une part une avec [code]departures[/code] dans le champ « feature », on s’aperçoit que seule la « routes[1] » dont l’id est route:DGL:C26Aa13 donne un résultat sur les départs :

Si on teste la « route[0] » avec son id route:DGL:C26Aa1, le résultat ne donne rien :

On récupère donc l’« external_code » de la routes[1] : DGLC26Aa13

!!! Cet « external_code » est l’identifiant qui va nous permettre de créer un filtre dans le plugin !!!

À partir de là, nous avons normalement tous les éléments pour filtrer nos résultats dans le plugin :

– une distance autour de nos coordonnées ;

– le code de notre route.

On peut donc tester notre requête avant de passer au plugin :

Pour cela, on va ajouter un filtre dans le champ bleu « Add parameters » : filter=route.has_code(external_code,DGLC26Aa13)

Les résultats donnent bien les départs à l’arrêt Condorcet en direction de Grange Blanche.

8 – Configuration du plugin.

Dans le plugin, lors de la création d’un équipement de type « Arrêt de transport », vous devez choisir une « Localisation pour la station » qui devra être un équipement « Localisation » du plugin.

Il reste à remplir le champ « Options de transport » avec les données que nous avons récupérées.

Pour la route le filtre sera : filter=route.has_code(external_code,DGLC26Aa13)

Pour la distance, il sera : distance=100

Afin de pouvoir passer ces deux filtres dans le même champ, on les séparera avec l’opérateur [code]&[/code] afin d’obtenir :

filter=route.has_code(external_code,DGLC26Aa13)&distance=100

Ce qui permet d’afficher :

Conclusion

J’ai utilisé le playground pour le tester sur 3 trajets complètement différents (tramway T2 à Lyon, RER D en Ile-de-France, bus C26 à Lyon) et il a fallu que j’adapte le tuto afin d’avoir, à priori, une large possibilité.

Ainsi, pour certains, il sera possible de simplifier la recherche et pour d’autres il sera nécessaire de creuser un peu plus… Mais une fois qu’on a compris le principe, ça reste relativement simple, bien que chronophage.

Concernant la réactualisation des données, le rafraîchissement est programmé sur le cron15, donc toutes les 15 minutes, ce qui peut être un peu long pour des passages en heure de pointe.

Perso, j’ai ajouté un scénario qui rafraîchi l’équipement à chaque horaire du prochain départ (commande « Départ 1 heure »).

Merci Lunarok pour ce plugin (et tous les autres) et merci de m’avoir fait participer sur ton blog !

27 réflexions au sujet de “Transports en commun dans Jeedom : utilisation de Navitia.io avec Localisation et Trajets”

  1. j ai un problème une fois que j arrive au choix du sens de la route, lorsque je choisi mon trajet, j’obtiens une erreur « the region ch is dead »
    Cela est deja arrivé a quelqu’un?
    Car du coup je peux rien mettre comme trajet :/

    Répondre
    • Salut guillaume, y a t il un moen pour proposer des lignes de bus ou autres qui sont inaccessible sur le playground de navitia?

      Répondre
      • Ca non, pas possible. Le plugin utilise Navitia.io donc CQFD, uniquement ce qui est dispo avec. Demandez à vos compagnies de fournir leurs données et Navitia pour les intégrer.

        Répondre
        • Bah c’est ca qui est bizarre c’est que les données sont dispo, la compagnie a genève c’est tpg. les tramway sont dispo et on trouves tous, m ais les bus c est bizarre: on voit les differentes lignes de bus, on voit les différents arret, mais ca marque region ch is dead dées qu on veut choisir departure ou arrival :/

          Répondre
  2. j’avais fait un petit script pour récupérer les prochain bus de chez moi, mais ces idiots on tout changé , et je n’ai plus d’info . j’avais un espoir avec Navitia , mais il n’y a rien dans leurs base pour (chronoplus) transport de ma ville (Biarritz) …. reste plus qu’à attendre on sait jamais.
    en tout cas , merci pour ce fabuleux boulot et tuto 😉

    Répondre
    • Salut, je viens de réessayer et ça fonctionne parfaitement.
      A l’époque c’était en plein changement dans les horaire et les destinations de bus peut être la cause du dysfonctionnement.

      En tout cas ça fonctionne nickel maintenant, reste plus qu’a trouver comment faire un scénario pour recevoir des alerte le matin afin de pas louper le bus

      Répondre
  3. Avec les infos suivantes: je récupère bien les prochains départ de Flachet en direction de Perrache sur la LigneA. mais sur jeedom, il m’affiche les horaires du bus 69.

    Répondre
  4. Ca fonctionne pec impec ! J’ai pas trouvé comment faire ceci : « j’ai ajouté un scénario qui rafraîchi l’équipement à chaque horaire du prochain départ (commande « Départ 1 heure ») ».

    Tu utilises quel mode de scénario et tu mets quoi dans événement / programmation ?

    Répondre
  5. Bonjour et bravo pour cet excellent tuto.

    J’ai une question car dans mon quartier j’ai plusieurs arrêts proches les uns des autres.
    J’ai utilisé cette syntax :
    stop_areas=stop_area:OAB:SA:CTP1000087&filter=route.has_code(external_code,OAB10)

    Mais malgré le stop_area utilisé, le résultat me retourne les horaires de 2 arrêts : Floralies et Alpilles alors que le stop_area de Floralies est différent.
    Comment filtrer sur l’arrêt Alpilles uniquement ?

    Egalement, pourrais-tu nous en dire plus sur le scenario que tu as mis en place pour rafraichir les donnés ? Un petit screenshot par exemple 🙂 ?

    Merci encore.

    Répondre
    • Bonjour, je me réponds à moi-même. Pour avoir la précision de l’arrêt de bus, je me suis basé sur les coordonnées latitude/longitude du stop_point.
      Avec cela, je peux même me passer du filtre sur la distance.

      Répondre
  6. Bonjour lunarok,

    Pourrais-tu présenter ton délencheur pour rafraichir les données ?
    J’ai essayé plusieurs solutions mais le widget ne se rafraichit pas tout le temps.
    Je me suis basé sur [Arrivée 1] pour mettre à jour le widget à chaque fois que le bus arrive à son arrêt. Lorsque je regarde les logs, le cron15 est bien exécuté, mais mon déclencheur non.

    Merci.

    Répondre

Laisser un commentaire