Aller au contenu
MAM78

Itinéraire SNCF

Recommended Posts

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

 

 

 

Modifié par MAM78
  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Beau boulot, je test.

nous manque l'info trafic effectivement.

Partager ce message


Lien à poster
Partager sur d’autres sites

ok fallait pas mettre la clef encodé; mais original

 

on avance: )

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

Tu peux préciser tes saisies pour chaque champs ?

Partager ce message


Lien à poster
Partager sur d’autres sites
à 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...:60:

Partager ce message


Lien à poster
Partager sur d’autres sites

J ai fait.

 

Lines : poissy

Route : marnes la vallée

Stop : 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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

bon je verrai ça demain ... 

au dodo....

 

en tout cas bel avancé dans le projet et chapeau MAM78 et Sakkhho

Partager ce message


Lien à poster
Partager sur d’autres sites

@Sakkhho

 

tu peux essayer ça ?

 

line:OCE:SN-87754994-87386573

route:OCE:SN-RERA-87386573-87754994

stop_point:OCE:SP:RERA-87386573

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites
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

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 1 minute, MAM78 a dit :

Tu prends celui envoyé par mail

ben oui le token

 

Partager ce message


Lien à poster
Partager sur d’autres sites

envoi ta capture d'écran 

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 6 minutes, MAM78 a dit :

OCE:SN-87754994-87386573

sncf.thumb.JPG.f1c525ea8c8bf7862daf846d6ca96748.JPG

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par MAM78

Partager ce message


Lien à poster
Partager sur d’autres sites

lorsque tu as saisie ton token, est-ce que tu as cliqué sur le symbol disquette ?

Partager ce message


Lien à poster
Partager sur d’autres sites
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 ...:(

Partager ce message


Lien à poster
Partager sur d’autres sites
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é par Sakkhho

Partager ce message


Lien à poster
Partager sur d’autres sites

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

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×