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