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 traitement
local 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 Sonos
local SceneID_Sonos = 61 -- Id de la scène qui traite les messages vocaux envoyés sur une enceinte Sonos
local 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 guillemet
local code_api_routes = "route:OCE:SN-Transilien-87382481-87384008" --remplacer la valeur entre guillemet
local 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