Aller au contenu
MAM78

Itinéraire SNCF

Recommended Posts

il y a 4 minutes, MAM78 a dit :

tu peux m'envoyer ton code Token en MP

c 'est envoyé ....;)

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon , je ne sais pas pourquoi ....et je ne cherche pas à comprendre....mais voilà :74::60:

 

grosse avancé ......sur le sujet ...

 

 

 

 

sncf6.JPG.80e21b327c68437a968f4be525a71073.JPG

Partager ce message


Lien à poster
Partager sur d’autres sites

genial :-)

 

 

 

Sans titre 2.png

Modifié par Sakkhho

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour mon cas , sur le printscreen ci-dessus :

 

j 'ai le prochain départ depuis la gare de Chalon  et l'heure d'arrivée à Dijon => cool .

Est ce possible à ton avis de prendre en compte  les trains qui arrivent depuis Lyon ou macon (pas macron !! :D )  avec l'arrêt à chalon sur saone en direction de dijon et/ou  de paris... dans le même VD??

 

pffff , dur dur ma question ...

 

SNCF7.JPG.961b04d7ec1e05e7c59e27b052426987.JPG

Partager ce message


Lien à poster
Partager sur d’autres sites

@minos, c'est la meme ligne ?

 

@MAM78

bravo,

peut on prévoir, dans le meme VD, le trajet Aller et le meme trajet retour ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour etre plus clair en fait :

 

sur ma ligne j'ai des trains :

  1. qui partent de chalon vers Dijon => ça OK
  2. des trains qui partent de Macon vers Dijon ou Paris et qui s'arrête à Chalon =>  possible ? :P
  3. des trains qui partent de Lyon à destination de dijon ou Paris  aussi  qui s'arrête à chalon  => possible ?

j’espère que c'est plus clair ...

 

voilou 

 

en tout cas merci bien ...super cool !!!!:13:

Partager ce message


Lien à poster
Partager sur d’autres sites

Pas contre il m indique trafic ok alors que c est pas le cas.cf RATP.

Partager ce message


Lien à poster
Partager sur d’autres sites

Pourrais-tu nous indiquer un exemple avec des horaires précis en prenant 2 trains qui correspondent aux cas que tu sites.

Partager ce message


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

Pas contre il m indique trafic ok alors que c est pas le cas.cf RATP.

Je n'ai pas encore pu vérifier des cas précis sur le perturbations de trafics.

Partager ce message


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

Pourrais-tu nous indiquer un exemple avec des horaires précis en prenant 2 trains qui correspondent aux cas que tu sites.

voilà 2 cas précis avec les horaires :

  1. train partant de Macon  => Paris Bercy (Terminus)  avec Arrêt à Chalon sur Saône

Screenshot_2017-07-11-22-42-43.thumb.png.a8d96448a21177a2538b184e169af1cf.png

 

Cas 2 :  train partant de Lyon Perrache => Dijon (Terminus)  avec Arrêt à Chalon sur Saône

 

 

Screenshot_2017-07-11-22-42-57.thumb.png.28e3158fcfdf8727e6ac9402129d8347.png

 

Et le cas 3 : ce sont les trains partant de Chalon/Saône => ceux fonctionnent déjà avec le VD

 

SNCF7.JPG.7ebd1839474d547c56aaa11a17e382ab.JPG

 

 

Minas.JPG

Modifié par minos

Partager ce message


Lien à poster
Partager sur d’autres sites

oups un minas superflu...je n'arrive pas l'enlever....sorry :o

Partager ce message


Lien à poster
Partager sur d’autres sites

c'est quel itinéraire que tu souhaiterais te voir proposé dans les cas que tu sites ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Ok je pense avoir compris ton problèmes.

 

Le VD te propose le prochain train disponible qui passe à Chalon, soit celui de 05:52

Toi tu voudrais voir dès à présent le train suivants, soit celui 06:37

 

Dans la logique actuelle du VD tu seras le train de 06:37 demain matin lorsqu'il sera 05:53 (soit après le départ du premier train)

 

Afin de pouvoir satisfaire ta demande, il me faut modifier le VD pour pourvoir balayer les différents itinéraires et pas seulement le prochain.

 

Je vais essayer d'intégrer cette fonctionnalité. Ce ne devrait pas être trop compliqué à mettre en place avec l'utilisation de 2 boutons (Train Suivant et Train Précédent).

 

Au boulot ;)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est fait. Voici une nouvelle version 0.3.

 

Cette nouvelle version apporte la possibilité de parcourir les différents itinéraire selon leur ordre de départ.

 

Il suffit d'utiliser les 3 boutons du VD :

  • 1er    bouton recherche du prochain train au départ
  • 2ème bouton recherche du train suivant
  • 3ème bouton recherche du train précédent si l'itinéraire courant est supérieur à 1

Le premier label indique le Nième itinéraire courant.

 

Pour le moment, j'ai limité à 5 départs. Mais cela pourra être modifié facilement, si nécessaire.

 

1) Veuillez installer le nouveau VD ci-dessous :

 

Itinéraire_SNCF.vfib.json

 

Attention de bien :

  • copier vos codes Station de départ et d'arrivée dans chacun des 3 boutons
  • modifier la variable SceneID_Iti_SNCF par l'ID de la Scène Itinéraire SNCF

2) Veuillez charger le nouveau code de la scène :

 

Attention de bien :

  • modifier le contenu de la  variable User_API_Sncf par votre identifiant encodé en 64 dans la scène
  • modifier l'ID de votre Scène Sonos dans la variable SceneID_Sonos (si vous en possédez une enceinte)

3) Bons tests

 

PS : Les étapes suivantes du projet seront probablement consacré à

  • la décomposition du parcours par étape si le trajet n'est pas direct
  • la mixité des modes de transport entre (Trains, RER, BUS, Metro)
  • l'identification des incidents sur le trafic

Si vous avez d'autres idées, vous pouvez toujours faire vos demandes ;)

 

--[[
%% properties
%% events
%% globals
--]]

----------------------------------------------------------------------------------
-- Name : HC2 SNCF Itinéraire
-- Type : Virtual Device & Scene
-- Cette scène permet d'obtenir l'horaire du prochain train au départ d'une gare
----------------------------------------------------------------------------------
-- 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.3
-- Création : MAM78
-- Date MAJ : 12/07/2017
--
-- Evolutions :
--   V0.1 09/07/2017 : Initialisation du projet
--   V0.2 10/07/2017 : Association de la scène à un VD qui appel la scène en
--					   passant les paramètres de la recherche d'itinéraire
--   V0.3 12/07/2017 : Ajouts de boutons de navigation pour parcourir les diférents
--					   itinéraires par odre chronologique des départs
----------------------------------------------------------------------------------


-- User variables
local SceneID_Sonos = 61
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çu dans le mail ci-dessus
-- Copier ce code dans la vadiable ci-dessous (User_API_Sncf)
----------------------------------------------------------------------------------
local User_API_Sncf = "placé ici votre code API SNCF encodé en 64"

----------------------------------------------------------------------------------
-- Ne pas modifier le code ci-dessous, sinon pour l'adapter à votre usage
----------------------------------------------------------------------------------
local TimeOut = 3000
----------------------------------------------------------------------------------
-- 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

function SetUI(id, target, value)
  fibaro:call(id, "setProperty", "ui."..target..".value", value);
end

function SetUI_label(id, target, value)
  fibaro:call(id, "setProperty", "ui."..target..".label", value);
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

function Affiche_Iti(data)
  
  local Num_Iti = fibaro:get(VD_Id, "ui.lblNum.value")
  Num_Iti = tonumber(Num_Iti)
  
  Trace("blue","Traitement Iti : "..Num_Iti)
  
  --fibaro:call(VD_Id, "setProperty", "ui.lblDep2.label", "&#x2648")
  --fibaro:call(VD_Id, "setProperty", "ui.lblDep2.label", "XX\00000aXX")
  
  SetUI(VD_Id, "lblLigne", data.journeys[Num_Iti].sections[1].display_informations.commercial_mode .." / "..data.journeys[Num_Iti].sections[1].display_informations.code)    
  
  SetUI(VD_Id, "lblFrom", data.journeys[Num_Iti].sections[1].from.stop_point.name)
  SetUI(VD_Id, "lblTo", data.journeys[Num_Iti].sections[1].to.stop_point.name)    
  SetUI(VD_Id, "lblDir", data.journeys[Num_Iti].sections[1].display_informations.direction) 
  
  if data.journeys[Num_Iti].status =="" then
    SetUI(VD_Id, "lblTrafic", "normal") 
  else
    SetUI(VD_Id, "lblTrafic", data.journeys[Num_Iti].status)
  end
  local Date_Time = Conversion_Date(data.journeys[Num_Iti].sections[1].departure_date_time)              
    
  local Lbl_message = "Départ à "..os.date("%H:%M", Date_Time)
    
  local Date_Time = Conversion_Date(data.journeys[1].sections[1].arrival_date_time)              
      
  Lbl_message = Lbl_message .." Arrivée à "..os.date("%H:%M", Date_Time)
  
  SetUI(VD_Id, "lblDep1", Lbl_message)
end
----------------------------------------------------------------------------------
-- Traitement des données en provenance de l'IPA SNCF
----------------------------------------------------------------------------------
function GetData()

  Debug("grey","T1".." - "..Iti_Titre)
  -- https://api.sncf.com/v1/coverage/sncf
  -- /journeys?
  -- from=stop_area:OCE:SA:87382473&
  -- to=stop_area:OCE:SA:87382218&
  -- datetime='20170716T040000'&
  -- datetime_represents=departure&
  -- min_nb_journeys=4
  local api_url = "https://api.sncf.com/v1"
  local api_coverage = "sncf"
  local api_fonction = "journeys?"
  local api_from = code_api_from
  local api_to = code_api_to
  local api_datetime = os.date("%Y%m%dT%H%M00", os.time())
  local api_datetime_represents = "departure"
  local api_min_nb_journeys = "5"

  local Query = api_url
  local Query = Query .. "/coverage/" .. api_coverage
  local Query = Query .. "/" .. api_fonction
  local Query = Query .. "from=" .. api_from.."&"
  local Query = Query .. "to=" .. api_to.."&"
  local Query = Query .. "datetime=" .. api_datetime.."&"
  local Query = Query .. "datetime_represents=" .. api_datetime_represents.."&"
  local Query = Query .. "min_nb_journeys=" .. api_min_nb_journeys
  
  Debug("grey","T2".." - "..Iti_Titre)
    
  local http = net.HTTPClient({ timeout = TimeOut })
  
  Debug("grey","T3".." - "..Iti_Titre)
  
  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)
            
        Debug("grey","T4".." - "..Iti_Titre)
              
	    if response.status == 200 then
          
          Debug("grey","T5".." - "..Iti_Titre)
          Trace("blue","Traitement ok : "..Iti_Titre)
          local status, data = pcall(json.decode, response.data)
            
          if (status and data) then
                
            Affiche_Iti(data)
                  
            Trace("green","Départ : "..data.journeys[1].sections[1].from.stop_point.name)
            Trace("green","Direction : "..data.journeys[1].sections[1].to.stop_point.name) 
                                
            local Date_Time = Conversion_Date(data.journeys[1].sections[1].departure_date_time)              
            local Horaire = tostring(tonumber(os.date("%H", Date_Time))) .. " heure ".. tostring(tonumber(os.date("%M", Date_Time)))
            local JourSemaine = josdGetJourSemaine(os.date("%w", MonHeure))
                
            -- Test pour vérifier si le prochain départ est pour le jour même
            if os.date("%Y/%m/%d",Date_Time) == os.date("%Y/%m/%d",time) then
              Prochain_Depart = "aujourd'hui"
            else
              Prochain_Depart = JourSemaine
            end
                
            Trace("green", "Prochain départ "..Prochain_Depart.." à " ..os.date("%H:%M", Date_Time))

            message = "Prochain départ"
            message = message .. " "..Prochain_Depart
            message = message .. " de "..Msg_Depart
            message = message .. " pour "..Msg_Arrivee
            message = message .. " a ".. Horaire
                  
            local Date_Time = Conversion_Date(data.journeys[1].sections[1].arrival_date_time)              
            local Horaire = tostring(tonumber(os.date("%H", Date_Time))) .. " heure ".. tostring(tonumber(os.date("%M", Date_Time)))
            local JourSemaine = josdGetJourSemaine(os.date("%w", Date_Time))
                
            message = message .. " Arrivée à "..Horaire
                
            Trace("green", "Arrivée à " ..os.date("%H:%M", Date_Time))
                                
            -- Envoi d'un message sur l'enceinte SONOS
            if Msg_Sonos == "OUI" 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
          Debug("grey","T6".." - "..Iti_Titre)
          Trace("yellow","Traitement ko : "..Iti_Titre)
              
          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)
        Debug("grey","T7".." - "..Iti_Titre)
        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
  Debug("grey","T9".." - "..Iti_Titre)

end
  
function Start()

  Debug("grey","VD_Id="..VD_Id.." / Volume_Sonos="..Volume_Sonos.." / Msg_Sonos="..Msg_Sonos)

  -- test pour vérifier si le module virtuel exist ou pas
  local ip = fibaro:get(VD_Id, 'IPAddress')
  if ip == nil then
    Debug("orange","Warning : Le module virtuel : "..VD_Id.." n'existe pas. Vous devez le créer !")
  else
    -- Lancement du traitement de l'itinéraire
    GetData()
  end
end


-------------------------------------------------------------------------------
-- Begining off Scène
-------------------------------------------------------------------------------
local params = fibaro:args()

Trace("orange","Début de traitement de la scène")

if (params) then

  for k, v in ipairs(params) do

    if (v.Iti_Titre) then Iti_Titre = v.Iti_Titre end    
    if (v.code_api_to) then code_api_to = v.code_api_to end
    if (v.code_api_from) then code_api_from = v.code_api_from end
    if (v.Msg_Arrivee) then Msg_Arrivee = v.Msg_Arrivee end
    if (v.Msg_Depart) then Msg_Depart = v.Msg_Depart end
    if (v.Msg_Sonos) then Msg_Sonos = v.Msg_Sonos end
    if (v.Volume_Sonos) then Volume_Sonos = v.Volume_Sonos end
    if (v.VD_Id) then VD_Id = v.VD_Id end
    
  end
  Start()
else
  Trace("orange","Erreur : Cette scène fonctionne par appel depuis un VD avec un passage de paramètres")
end

Trace("orange","Fin de traitement de la scène")

 

Modifié par MAM78
  • Upvote 1

Partager ce message


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

Dans la logique actuelle du VD tu seras le train de 06:37 demain matin lorsqu'il sera 05:53 (soit après le départ du premier train)

coucou,

 

Trop fort et oui encore une fois tu as tout juste ....

 

 

 

 

en fait , possible d'afficher comme ci-dessous en 1 Départ à 6:37 , en 2 le prochain (vide actuellement ), en 3 le suivant ...?

 

je testerai ce soir la V3...:60:

 

sncf8.JPG.7ac64055e648e0e1ff98484b9ae53d57.JPG

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 4 heures, MAM78 a dit :

Si vous avez d'autres idées, vous pouvez toujours faire vos demandes ;)

 

 

Alors oui j' en ai bien une mais peut etre farfelue....

comme Sakkhho l'a souligné , il serait bien de prendre en compte le retour ... et oui fin de journée , fini le taff on rentre ....-_-

 

en fait est ce possible en fonction de la situation geographique ( HC2 ) par exemple  que le VD nous donne les horaires des trains ...

 

 

Tordu ... hein ...??

 

allez je vais bosser ...

 

 

a ce soir

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour le retour, c'est très simple. Tu fais un deuxième VD dans lequel tu inverses les codes de départ et d'arrivée.

Partager ce message


Lien à poster
Partager sur d’autres sites

Concernant les label 1, 2, 3 ils sont prévu pour contenir les étapes lors de trajets indirects. Mais ca c'est pour plus tard

Partager ce message


Lien à poster
Partager sur d’autres sites

hello

 

peux tu poster le code du VD pour éviter d'importer de nouveau ?

 

EDIT : pour le prochain si tu veux, j'ai importé le VD 

Modifié par Sakkhho

Partager ce message


Lien à poster
Partager sur d’autres sites

bravo ca fonctionne 

 

pour la suite :60:

le but de mon VD au depart c'est 

1/ le + important, être informé automatiquement des perturbations ... les parisiens me comprendront.

je stockais l'état du trafic dans une VG et si le texte, je poussais par GEA la notification de l'état toutes les 15mn avec le texte long de l'état du traffic. (uniquement si je suis au travail en couplant avec le VD jour chômé etc...)

aussi changement des icônes du VD pour savoir immédiatement si trafic ok , nok

EtatRer = data.result.rers[1].title
EtatLongRer = data.result.rers[1].message
 
fibaro:call(virtualDeviceId, "setProperty", "ui.EtatRer.value", EtatRer  .. " ")          
            
-- Gestion des icônes et mise à jour de la variable
if EtatRer == "Trafic normal" then
  fibaro:call(virtualDeviceId , "setProperty", "currentIcon", TraficOk)
  fibaro:setGlobal("EtatTrafic", "OK")
else 
  fibaro:call(virtualDeviceId, "setProperty", "currentIcon", TraficNok)
  fibaro:setGlobal("EtatTrafic", EtatLongRer)
end

basique mais ca fait le job avec mes connaissances

 

2/ connaitre le prochain train qui me ramène chez moi (m'amène au boulot)

ici ton VD fait le job, car j'ai le prochain train. et je peux avoir les suivants aussi c'est top, mais il serait preferable de les rendre visible direct non ?

 

3/ idem sur le metro (ligne 1)

mais je pousse pas la notification trafic, juste un check visuel sur le VD

 

tout ca géré par GEA

 

- Push Trafic  
    GEA.add(true, 2*60, "", {{"VirtualDevice", id["ETAT_TRAFIC"], 1},{"Repeat"}}) -- Refresh toutes les 2mn l'etat du trafic 
    GEA.add ({{"Global!", "EtatTrafic", "OK"},atWork}, 15*60, "#value#",{{"Repeat"}}) -- Push EtatTrafic si NOK toutes les 15mn

 

 

ensuite je serai curieux de voir si on peut utiliser la puissance de l'api (journeys) je m'explique

 

dans mon cas. pour rejoindre mon taf, je peux 

- RER A direct de ma gare à la defense --> cette version du VD

- Transicilien (ligne L) de ma gare à une autre gare, puis RER A de la defense... donc itinéraire indirect.

 

idem sur le retour, j'ai plusieurs options donc pas obligé de prendre un RER A direct, je peux faire un changement suivant le 1er train qui arrive.

en gros c'est suivant l'heure de depart, on prend le 1er itinéraire possible

 

qq ícones...

 

 

Hot-Train.png

SNCFTransilien_icone.png

RER.svg.png

Modifié par Sakkhho

Partager ce message


Lien à poster
Partager sur d’autres sites

Super MAM, ça va devenir une vraie appli :-) ton VD
Du gros boulot

Envoyé de mon Nexus 5X en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Concernant le trajet retour, je propose d'ajouter un bouton qui permettra d'inverser le sens de l'itinéraire.
Concernant l'affichage des différents disponibles. Le problème est la quantité d'infos à afficher dans le VD. Ca risque de devenir un sapin de noël.

L'objectif pour moi c'est d'afficher la décomposition des trajets avec chacun des changements

Concernant l'info trafic. Pour le moment je n'ai pas encore trouver les bonnes infos

J'envisage également de me connecter à une autre API pour avoir les lignes de métro et bus.

Modifié par MAM78

Partager ce message


Lien à poster
Partager sur d’autres sites

1/oui pas bete pour le bouton et donc avec GEA en fonction de l'heure on clique sur le bouton souhaité :-)

2/ suivant le nombre de d'horaires souhaités max 3 je pense c'est gerable

3/ ok

4/ je vais tenter de jeter un coup d'oeil.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bravo pour le boulot, c'est TOP!!!

Juste une question je n'arrive pas à paramétrer de ligne TGV dans l'API (que les TER), et je n'ai pas trouvé d'info à ce sujet dans la doc en ligne...

Si qqn a une idée...

Partager ce message


Lien à poster
Partager sur d’autres sites

Lorsque tu saisis le nom de ta gare, tu dois probablement avoir plusieurs lignes qui s'affichent dont l'une doit être la gare TGV. C'est celle là que tu dois sélectionner.

 

Sinon indiques nous ton point de départ et d'arrivée

 

Modifié par MAM78

Partager ce message


Lien à poster
Partager sur d’autres sites

×