MAM78 Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 (modifié) Itinéraire SNCF Préambule : Sur la suggestion/initiative de @Sakkhho vous trouverez ci-dessous les bases d'un nouveau Virtual Device et d'une Scène visant à obtenir des informations sur les itinéraires de trains de la SNCF. Le projet exploite l'API mise à disposition par la SNCF disponible sous la forme d'Open Data. Cette API permet notamment d'obtenir des informations sur : Calculer un itinéraire en train de gare à gare en combinant les trains Rechercher les horaires planifiés des arrêts en gare Consulter les grilles horaires d'une ligne Le Projet : Le but du projet consiste à (pour le moment) : Afficher l'horaire du prochain départ d'un train sur une ligne et une gare donnée En option, émettre une notification vocale sur une enceinte SONOS (en mode TTS) et selon l'activation d'un bouton sur un VD Et pour plus tard : Indiquer s'il y a une perturbation sur la ligne Vos idées/suggestions sont le bienvenues Pré-requis : 1) Pour pouvoir utiliser l'API de la SNCF, vous devez vous créer un compte sur : https://data.sncf.com/api 2) Une fois votre compte créé vous recevrez un mail avec une clé d’authentification 3) Il faut encoder la clé d'authentification en format Base64, pour cela, vous devez vous connecter au site : https://www.base64encode.org 4) Encoder la clef reçu dans le mail évoqué ci-dessus 5) Conservé le code généré, il vous sera nécessaire au paragraphe Configuration Installation : Créer une nouvelle scène et copier le code LUA ci-dessous : --[[ %% properties %% events %% globals --]] ---------------------------------------------------------------------------------- -- Name : SNCF Itinéraire ---------------------------------------------------------------------------------- -- Cette scène permet d'obtenir l'horaire du prochain train au départ d'une gare ---------------------------------------------------------------------------------- -- Type : Virtual Device & Scene -- Utilisation : HC2 ---------------------------------------------------------------------------------- -- Le Projet : -- Construire Virtual Device Affichant les données reccupérées -- avec en option une notification vocale sur une enceinte SONOS en mode TTS ---------------------------------------------------------------------------------- -- Version : 0.1 -- Création : MAM78 -- Date MAJ : 09/07/2017 -- -- Evolutions : -- V0.1 09/07/2017 : Initialisation du projet ---------------------------------------------------------------------------------- -- User variables local Msg_Sonos = false -- A activer si vous disposez de ma scène de traitement de message TTS Sonos local SceneID_Sonos = 61 local Volume_Sonos = 20 local Msg_Depart = "letan la ville" -- écriture phonétique pour TTS local Msg_Arrivee = "paris gare saint lazard" -- écriture phonétique pour TTS local modetrace = true local modedebug = true ---------------------------------------------------------------------------------- -- Pour pouvoir utiliser l'API de la SNCF, vous devez vous créer un compte sur : -- https://data.sncf.com/api -- Une fois votre compte créé vous recevrez un mail avec une clé d’authentification -- Puis, vous devez vous connecter au site : -- https://www.base64encode.org -- Puis, encoder la clef reçue dans le mail évoqué ci-dessus -- Copier ce code généré dans la vadiable ci-dessous (User_API_Sncf) ---------------------------------------------------------------------------------- local User_API_Sncf = "à remplacer par l'encodage 64 du code d'accès à l'API SNCF" ---------------------------------------------------------------------------------- -- Les variables ci-dessous détermine le trajet que vous souhaitez utiliser -- Ces codes sont récupérables sur le site : -- http://canaltp.github.io/navitia-playground/play.html -- Saisir dans champs : -- API = https://api.sncf.com/v1 -- Token = le contenu de la variable User_API_Sncf (ci-dessus) -- coverage = sncf -- lines = saisir/sélectionner la localité de la station en tête de votre ligne -- -> Votre saisie va se transformer en un code -- routes = le sens du trajet dans lequel vous circulez -- -> Votre saisie va se transformer en un code -- routes = le sens du trajet dans lequel vous circulez -- -> Votre saisie va se transformer en un code -- stop_points = saisir le nom de votre station de départ -- -> Votre saisie va se transformer en un code -- empty feature = departures -- Cliquer sur le bouton SUBMIT -- vous devriez obtenir la liste des prochains départ -- Copier/coller les codes obtenus dans les variables correspondantes ci-dessous ---------------------------------------------------------------------------------- local code_api_lines = "line:OCE:SN-87384008-87382481" local code_api_routes = "route:OCE:SN-Transilien-87382481-87384008" local code_api_stop_points = "stop_point:OCE:SP:Transilien-87382473" ---------------------------------------------------------------------------------- -- Ne pas modifier le code ci-dessous, sinon pour l'adapter à votre usage ---------------------------------------------------------------------------------- ---------------------------------------------------------------------------------- -- Message pour mode Trace ---------------------------------------------------------------------------------- function Trace(color, message) if modetrace then if color and color ~= "" then fibaro:debug('<span style="color:'..color..';">'..message..'</span>') else fibaro:debug(message) end end end ---------------------------------------------------------------------------------- -- Message pour mode Debug ---------------------------------------------------------------------------------- function Debug(color, message) if modedebug then if color and color ~= "" then fibaro:debug('<span style="color:'..color..';">'..message..'</span>') else fibaro:debug(message) end end end ---------------------------------------------------------------------------------- -- Retourne le jour de la semaine en clair ---------------------------------------------------------------------------------- function josdGetJourSemaine(jour) josdGetJourSemaineTab={[0]="Dimanche",[1]="Lundi",[2]="Mardi",[3]="Mercredi",[4]="Jeudi",[5]="Vendredi",[6]="Samedi"} return josdGetJourSemaineTab[tonumber(jour)] end ---------------------------------------------------------------------------------- -- Conversion format date "aaaammjjThhmmss" en format date ---------------------------------------------------------------------------------- function Conversion_Date(dateheure) local TableDate = os.date("*t") TableDate.day = string.sub (dateheure, 7, 8) TableDate.month = string.sub (dateheure, 5, 6) TableDate.year = string.sub (dateheure, 1, 4) TableDate.hour = string.sub (dateheure, 10, 11) TableDate.min = string.sub (dateheure, 12, 13) return (os.time(TableDate)) end ---------------------------------------------------------------------------------- -- Traitement des données en provenance de l'IPA SNCF ---------------------------------------------------------------------------------- function GetData() local api_url = "https://api.sncf.com/v1" local api_coverage = "sncf" local api_lines = code_api_lines local api_routes = code_api_routes local api_stop_points = code_api_stop_points local api_fonction = "departures?" local Query = api_url local Query = Query .. "/coverage/" .. api_coverage local Query = Query .. "/lines/" .. api_lines local Query = Query .. "/routes/" .. api_routes local Query = Query .. "/stop_points/" .. api_stop_points local Query = Query .. "/" .. api_fonction local http = net.HTTPClient() Debug("grey",Query) local ok = pcall(function() http:request(Query, { options = { method = 'GET', headers ={ ["Content-Type"] = "application/json", ["Authorization"] = "BASIC "..User_API_Sncf}, data = body }, success = function(response) if response.status == 200 then local status, data = pcall(json.decode, response.data) if (status and data) then Trace("green","Départ : "..data.departures[1].stop_point.name) Trace("green","Direction : "..data.departures[1].display_informations.direction) local MonHeure = Conversion_Date(data.departures[1].stop_date_time.departure_date_time) local Horaire = tostring(tonumber(os.date("%H", MonHeure))) .. " heure ".. tostring(tonumber(os.date("%M", MonHeure))) local JourSemaine = josdGetJourSemaine(os.date("%w", MonHeure)) message = "Prochain départ " -- Test pour vérifier si le prochain départ est pour le jour même if os.date("%Y/%m/%d",MonHeure) == os.date("%Y/%m/%d",time) then message = message .. " aujourdui " Trace("green", "Prochain départ aujourd'hui à " ..Horaire) else message = message .. " "..JourSemaine Trace("green", "Prochain départ "..JourSemaine.." a " ..Horaire) end message = message .. " de "..Msg_Depart message = message .. " pour "..Msg_Arrivee message = message .. " a ".. Horaire -- Envoi d'un message sur l'enceinte SONOS if Msg_Sonos then Debug("grey", "Envoi Message sur enceinte SONOS") fibaro:startScene(SceneID_Sonos, {{msg = message}, {vol = Volume_Sonos}}) end else Trace("orange"," Attention : Aucunes données à traiter") end else if response.status == 500 or response.status == 503 then Trace("orange","Erreur d'indisponibilité du serveur") else Trace("orange","Erreur requête serveur, response.status = "..response.status) end end end, error = function(err) Trace("orange","Erreur de reception de données, Erreur = ".. err) end }) end) if not(ok) then Trace("orange","Erreur dans l'exécution de fhttp:request(Query") end end GetData() Configuration : Un ensemble de variables sont disponibles pour l'utilisateur, -- User variables local modetrace = true -- permet de voir le résultat du traitementlocal modedebug = true -- permet de suivre les différente étapes lors de l'exécution du traitement local Msg_sonos = false -- A activer si vous disposez de ma scène de traitement de message TTS Sonoslocal SceneID_Sonos = 61 -- Id de la scène qui traite les messages vocaux envoyés sur une enceinte Sonoslocal Volume_Sonos = 20 -- Détermine le volume des messages vocaux envoyés sur l'enceinte Sonos (entre 0% et 100%) local Msg_Depart = "lestant la ville" -- nom de la localité de départ (écriture en mode phonétique pour TTS)local Msg_Arrivee = "paris gare saint lazard" -- nom de la localité de la fin ligne (écriture en mode phonétique pour TTS) local User_API_Sncf = "à remplacer par l'encodage 64 du code d'accès à l'API SNCF" -- code généré au chapitre pré-requis Pour préciser votre trajet, il est nécessaire de récupérer les codes (api_lines, api_routes, api_stop_points) que vous allez pouvoir gérer depuis le site http://canaltp.github.io/navitia-playground/play.html 1) Vous devez vous connecter sur le http://canaltp.github.io/navitia-playground/play.html 2) Saisir dans champs : API = https://api.sncf.com/v1 Token = le contenu de la variable User_API_Sncf (ci-dessus) coverage = sncf lines = saisir/sélectionner la localité de la station en tête de votre ligne (votre saisie va se transformer en un code) routes = le sens du trajet dans lequel vous circulez (votre saisie va se transformer en un code) routes = le sens du trajet dans lequel vous circulez (votre saisie va se transformer en un code) stop_points = saisir le nom de votre station de départ (votre saisie va se transformer en un code) empty feature = departures 4) Cliquer sur le bouton SUBMIT 5) En-dessous du bouton, vous devriez obtenir la liste des prochains départ, sinon avez du faire une erreur ! 6) Copier/coller les codes obtenus dans les champs (lines, routes, stop_points) dans les variables utilisateur correspondantes ci-dessous ----------------------------------------------------------------------------------local code_api_lines = "line:OCE:SN-87384008-87382481" --remplacer la valeur entre guillemetlocal code_api_routes = "route:OCE:SN-Transilien-87382481-87384008" --remplacer la valeur entre guillemetlocal code_api_stop_points = "stop_point:OCE:SP:Transilien-87382473" --remplacer la valeur entre guillemet Utilisation : En attendant, la création du VD qui va afficher les données, vous pour exécuter la Scène en mode début et lire le résultat dans la trace. Versions : V0.1 : du 09/07/2017 -> Intialisation du projet Modifié le 9 juillet 2017 par MAM78 2
Sakkhho Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 Beau boulot, je test. nous manque l'info trafic effectivement.
Sakkhho Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 (modifié) J'ai pas compris comment sélectionner la line sur le sur de navitia pour le traffic ? http://doc.navitia.io/#traffic-reports Modifié le 9 juillet 2017 par Sakkhho
minos Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 Coucou, il y a 6 minutes, Sakkhho a dit : J'ai pas compris comment sélectionner la line sur le sur de navitia Pareil je bloque ici : https://api.sncf.com/v1/coverage/sncf/?
Sakkhho Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 ok fallait pas mettre la clef encodé; mais original on avance: )
MAM78 Posté(e) le 9 juillet 2017 Auteur Signaler Posté(e) le 9 juillet 2017 il faut cliquer sur type a key to add a path éléments Saisir le nom de ta ligne Puis cliquer sur ADD Cela va transformer votre saisie en un code. Idem pour les autres champs
Sakkhho Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 bon j'ai testé mon trajet mais [DEBUG] 22:17:07: https://api.sncf.com/v1/coverage/sncf/lines/line:OCE:SN-87386425-87758375/routes/route:OCE:SN-RERA-87386425-87758011/stop_points/stop_point:OCE:SP:RERA-87758011/departures? [DEBUG] 22:17:07: Erreur requête serveur, response.status = 404 je dois merder qq part
MAM78 Posté(e) le 9 juillet 2017 Auteur Signaler Posté(e) le 9 juillet 2017 Tu peux préciser tes saisies pour chaque champs ?
minos Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 à l’instant, MAM78 a dit : Tu peux préciser tes saisies pour chaque champs ? oui je suis preneur , un petit imprim écran ... ce serait top...
Sakkhho Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 J ai fait. Lines : poissy Route : marnes la valléeStop : maison Laffitte RER. (C était pas les codes ci dessus mais d autres mais mêmes erreurs)Faut que je reprenne calmement. Ca va marcher. Je dois faire erreur sur la route ou autre. Tu as vu le lien sur le traffic. Ca doit être possible.
MAM78 Posté(e) le 9 juillet 2017 Auteur Signaler Posté(e) le 9 juillet 2017 1) il faut cliquer sur type a key to add a path éléments 2) sélectionner lines 3) Puis cliquer sur ADD 4) Saisir le nom de ta ligne en claire (exemple : RER A) 5) Sélectionner dans la liste la ligne qui correspond à votre recherche 5) Faire entrée Cela va transformer votre saisie en un code. Idem pour les autres champs
minos Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 Moi j'ai ça ... "message": ⊕"The server could not verify that you are authorized to acces ..." et je prends bien la token "normale" dans mon navigateur elle passe bien ...
minos Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 bon je verrai ça demain ... au dodo.... en tout cas bel avancé dans le projet et chapeau MAM78 et Sakkhho
MAM78 Posté(e) le 9 juillet 2017 Auteur Signaler Posté(e) le 9 juillet 2017 @Sakkhho tu peux essayer ça ? line:OCE:SN-87754994-87386573 route:OCE:SN-RERA-87386573-87754994 stop_point:OCE:SP:RERA-87386573
MAM78 Posté(e) le 9 juillet 2017 Auteur Signaler Posté(e) le 9 juillet 2017 il y a 4 minutes, minos a dit : Moi j'ai ça ... "message": ⊕"The server could not verify that you are authorized to acces ..." et je prends bien la token "normale" dans mon navigateur elle passe bien ... Tu prends celui envoyé par mail
minos Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 il y a 1 minute, MAM78 a dit : Tu prends celui envoyé par mail ben oui le token
minos Posté(e) le 9 juillet 2017 Signaler Posté(e) le 9 juillet 2017 il y a 6 minutes, MAM78 a dit : OCE:SN-87754994-87386573
MAM78 Posté(e) le 9 juillet 2017 Auteur Signaler Posté(e) le 9 juillet 2017 (modifié) Saisie entre le mot lines et le symbole de la poubelle, le nom de ta ligne et elle apparaitra comme par miracle Moi aussi, je n'avais pas capté du premier coup Modifié le 9 juillet 2017 par MAM78
MAM78 Posté(e) le 9 juillet 2017 Auteur Signaler Posté(e) le 9 juillet 2017 lorsque tu as saisie ton token, est-ce que tu as cliqué sur le symbol disquette ?
minos Posté(e) le 10 juillet 2017 Signaler Posté(e) le 10 juillet 2017 Il y a 6 heures, MAM78 a dit : lorsque tu as saisie ton token, est-ce que tu as cliqué sur le symbol disquette oui je crois bien ...
Sakkhho Posté(e) le 10 juillet 2017 Signaler Posté(e) le 10 juillet 2017 (modifié) Il y a 12 heures, MAM78 a dit : @Sakkhho tu peux essayer ça ? line:OCE:SN-87754994-87386573 route:OCE:SN-RERA-87386573-87754994 stop_point:OCE:SP:RERA-87386573 ca marche [DEBUG] 10:51:52: https://api.sncf.com/v1/coverage/sncf/lines/line:OCE:SN-87754994-87386573/routes/route:OCE:SN-RERA-87386573-87754994/stop_points/stop_point:OCE:SP:RERA-87386573/departures? [DEBUG] 10:51:52: Départ : Poissy [DEBUG] 10:51:52: Direction : Marne-la-Val-Chessy-RER (Chessy) [DEBUG] 10:51:52: Prochain départ aujourd'hui à 12 heure 8 par contre 12h08, c'est pas credible :-) Modifié le 10 juillet 2017 par Sakkhho
MAM78 Posté(e) le 10 juillet 2017 Auteur Signaler Posté(e) le 10 juillet 2017 Super, pour ton info, j'ai réécrit la Scène que j'ai associé à un VD afin de pouvoir disposer autant de trajets que l'on souhaite. J'ai également intégré l'info trafic. J'ai encore quelques modifications à faire. Je posterais ce soir les nouveautés. Patience 1
Messages recommandés