-
Compteur de contenus
2 515 -
Inscription
-
Dernière visite
-
Jours gagnés
28
Tout ce qui a été posté par MAM78
-
Oui mais sur cette dernière version, j'ai changé une image d'un label. Donc import
-
Voici une nouvelle version 0.5 Cette nouvelle version apporte : La possibilité de choisir le mode retour (inversion entre le point de départ et d'arrivé) Il n'est plus nécessaire de modifier les variables (from et to) sur le bouton retour. Spécial dédicace @Sakkhho Possibilité d'utiliser les flèches de navigation que ce soit pour un trajet Aller ou Retour Il suffit d'utiliser les 4 boutons du VD : 1er bouton recherche du prochain train au départ 2ème bouton recherche du train en mode retour 3ème bouton recherche du train suivant 4ème bouton recherche du train précédent si l'itinéraire courant est supérieur à 1 Le label sous les bouton indique le Nième itinéraire courant avec précision du sens du trajet. 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 Trop compliqué de fournir le code du VD (en mode texte) avec ses différents boutons qui contiennent chacun leur code. Désolé @Sakkhho Attention de bien : copier vos codes Station de départ et d'arrivée dans chacun des 3 boutons modifier la variable SceneID_Traj_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 mixité des modes de transport entre (Trains, RER, BUS, Metro) l'identification des incidents sur le trafic (retard) 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.5 -- Création : MAM78 -- Date MAJ : 09/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 -- V0.4 13/07/2017 : La décomposition du parcours sur chacune des étapes -- (changements) Maximum 9 étapes pour le moment. -- Le temps de trajet global, ainsi que par étape -- Le mode de circulation pour chacune des étape -- (La ligne à utiliser, Trajet à pied, Attente en gare, ... -- La possibilité de choisir le mode retour (inversion entre -- le point de départ et d'arrivé). Attention pour le moment -- les flèches de navigation ne fonctionne pas pour le mode -- retour. -- Possibilité d'utiliser les flèches de navigation que ce -- soit pour un trajet Aller ou Retour ---------------------------------------------------------------------------------- -- 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 un nombre de seconde en texte xhxmin" en format date ---------------------------------------------------------------------------------- function Conversion_Seconde_en_Texte(NbSec) Debug("grey","NbSec="..NbSec) local NbH=math.floor(NbSec/60/60) NbSec = NbSec - NbH * 60 * 60 local NbM=math.floor(NbSec/60) NbSec = NbSec - NbH * 60 if NbH > 0 then return NbH.."h"..NbM.."min" else return NbM.."min" end 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, Traj_Num) local Last_PT = nil local Nb_Iti = 0 local Nb_Section = data.journeys[Traj_Num].sections local Max_Nb_Iti= 0 if #Nb_Section > 9 then Max_Nb_Iti = 9 else Max_Nb_Iti = #Nb_Section end Debug("grey","Nb_Section, Max_Nb_Iti="..#Nb_Section..", "..Max_Nb_Iti) for Num_Iti = 1 , Max_Nb_Iti do Debug("grey","Traitement Trajet-Itinéraire, type : "..Traj_Num.."-"..Num_Iti.." ,"..data.journeys[Traj_Num].sections[Num_Iti].type) if data.journeys[Traj_Num].sections[Num_Iti].type == "public_transport" then Last_PT = Num_Iti end local Date_Time = Conversion_Date(data.journeys[Traj_Num].sections[Num_Iti].departure_date_time) local Lbl_message = "("..Conversion_Seconde_en_Texte(tonumber(data.journeys[Traj_Num].sections[Num_Iti].duration))..")" local Date_Time = Conversion_Date(data.journeys[Traj_Num].sections[Num_Iti].arrival_date_time) Lbl_message = Lbl_message.." -> "..os.date("%H:%M", Date_Time) if data.journeys[Traj_Num].sections[Num_Iti].type == "waiting" then Der_Dest = data.journeys[Traj_Num].sections[Num_Iti-1].to.stop_point.name Lbl_message = Lbl_message.." à " ..Der_Dest Lbl_message = Lbl_message.." -> " .."[En ATTENTE]" else if data.journeys[Traj_Num].sections[Num_Iti].type == "walking" then Der_Dest = data.journeys[Traj_Num].sections[Num_Iti].to.stop_point.name Lbl_message = Lbl_message.." à " ..Der_Dest Lbl_message = Lbl_message.." -> " .."[à PIED]" else if data.journeys[Traj_Num].sections[Num_Iti].type == "transfer" then if data.journeys[Traj_Num].sections[Num_Iti].transfer_type == "walking" then Der_Dest = data.journeys[Traj_Num].sections[Num_Iti].to.stop_point.name Lbl_message = Lbl_message.." à " ..Der_Dest Lbl_message = Lbl_message.." -> " .."[à PIED]" end else if data.journeys[Traj_Num].sections[Num_Iti].type == "crow_fly" then if data.journeys[Traj_Num].sections[Num_Iti].mode == "walking" then Der_Dest = data.journeys[Traj_Num].sections[Num_Iti].to.stop_point.name Lbl_message = Lbl_message.." à " ..Der_Dest Lbl_message = Lbl_message.." -> " .."[à PIED]" end else Der_Dest = data.journeys[Traj_Num].sections[Num_Iti].to.stop_point.name Lbl_message = Lbl_message.." à " ..Der_Dest Lbl_message = Lbl_message.." ["..data.journeys[Traj_Num].sections[Num_Iti].display_informations.commercial_mode .." / "..data.journeys[Traj_Num].sections[Num_Iti].display_informations.code.."]" end end end end Nb_Iti = Nb_Iti + 1 SetUI(VD_Id, "lblIti"..Num_Iti, Lbl_message) end if Max_Nb_Iti < 9 then for i = Max_Nb_Iti + 1, 9 do SetUI(VD_Id, "lblIti"..i, " ") end end SetUI(VD_Id, "lblFromTo", fibaro:get(VD_Id, "ui.lblFromTo.value").. " -> " ..Der_Dest) end function Affiche_Traj(data) local Traj_Num = tonumber(string.sub(fibaro:get(VD_Id, "ui.lblNum.value"), -1)) Trace("blue","Traitement Trajet : "..Traj_Num) --fibaro:call(VD_Id, "setProperty", "ui.lblDep2.label", "♈") --fibaro:call(VD_Id, "setProperty", "ui.lblDep2.label", "XX\00000aXX") SetUI(VD_Id, "lblFromTo", data.journeys[Traj_Num].sections[1].from.stop_point.name) --SetUI(VD_Id, "lblDir", data.journeys[Num_Traj].sections[1].display_informations.direction) if data.journeys[Traj_Num].status =="" then SetUI(VD_Id, "lblTrafic", "normal") else SetUI(VD_Id, "lblTrafic", data.journeys[Traj_Num].status) end local Date_Time = Conversion_Date(data.journeys[Traj_Num].departure_date_time) local Lbl_message = "à "..os.date("%H:%M", Date_Time) local Date_Time = Conversion_Date(data.journeys[Traj_Num].arrival_date_time) Lbl_message = Lbl_message .." -> "..os.date("%H:%M", Date_Time).." ("..Conversion_Seconde_en_Texte(tonumber(data.journeys[Traj_Num].duration))..")" SetUI(VD_Id, "lblDepArr", Lbl_message) Affiche_Iti(data, Traj_Num) end ---------------------------------------------------------------------------------- -- Traitement des données en provenance de l'IPA SNCF ---------------------------------------------------------------------------------- function GetData() Debug("grey","T1".." - "..Traj_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 Traj_Sens = string.sub(fibaro:get(VD_Id, "ui.lblNum.value"), 1, 1) local api_from = "" local api_to = "" if Traj_Sens == "A" then api_from = code_api_from api_to = code_api_to else api_from = code_api_to api_to = code_api_from end 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".." - "..Traj_Titre) local http = net.HTTPClient({ timeout = TimeOut }) Debug("grey","T3".." - "..Traj_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".." - "..Traj_Titre) if response.status == 200 then Debug("grey","T5".." - "..Traj_Titre) Trace("blue","Traitement ok : "..Traj_Titre) local status, data = pcall(json.decode, response.data) if (status and data) then Affiche_Traj(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".." - "..Traj_Titre) Trace("yellow","Traitement ko : "..Traj_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".." - "..Traj_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".." - "..Traj_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.Traj_Titre) then Traj_Titre = v.Traj_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")
-
Bizarre, Chez-moi toujours le même problème. Je pense que je vais le réadapter en utilisant mon projet Itinéraire SNCF. Quand j'aurais le temps, évidement. Ca corrigera au passage les problèmes de plantage que nous avions déjà précédemment
-
C'est fait. Voici une nouvelle version 0.4. Cette nouvelle version apporte : La décomposition du parcours sur chacune des étapes (changements) Maximum 9 étapes pour le moment. Le temps de trajet global, ainsi que par étape Le mode de circulation pour chacune des étape (La ligne à utiliser, Trajet à pied, Attente en gare, ... La possibilité de choisir le mode retour (inversion entre le point de départ et d'arrivé). Attention pour le moment les flèches de navigation ne fonctionne pas pour le mode retour. Ca viendra. Il suffit d'utiliser les 4 boutons du VD : 1er bouton recherche du prochain train au départ 2ème bouton recherche du train en mode retour 3ème bouton recherche du train suivant 4ème bouton recherche du train précédent si l'itinéraire courant est supérieur à 1 Le label sous les bouton 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 Trop compliqué de fournir le code du VD (en mode texte) avec ses différents boutons qui contiennent chacun leur code. 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 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.4 -- Création : MAM78 -- Date MAJ : 13/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 -- V0.4 13/07/2017 : La décomposition du parcours sur chacune des étapes -- (changements) Maximum 9 étapes pour le moment. -- Le temps de trajet global, ainsi que par étape -- Le mode de circulation pour chacune des étape -- (La ligne à utiliser, Trajet à pied, Attente en gare, ... -- La possibilité de choisir le mode retour (inversion entre -- le point de départ et d'arrivé). Attention pour le moment -- les flèches de navigation ne fonctionne pas pour le mode -- retour. ---------------------------------------------------------------------------------- -- 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 un nombre de seconde en texte xhxmin" en format date ---------------------------------------------------------------------------------- function Conversion_Seconde_en_Texte(NbSec) Debug("grey","NbSec="..NbSec) local NbH=math.floor(NbSec/60/60) NbSec = NbSec - NbH * 60 * 60 local NbM=math.floor(NbSec/60) NbSec = NbSec - NbH * 60 if NbH > 0 then return NbH.."h"..NbM.."min" else return NbM.."min" end 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, Num_Traj) local Last_PT = nil local Nb_Iti = 0 local Nb_Section = data.journeys[Num_Traj].sections local Max_Nb_Iti= 0 if #Nb_Section > 9 then Max_Nb_Iti = 9 else Max_Nb_Iti = #Nb_Section end Debug("grey","Nb_Section, Max_Nb_Iti="..#Nb_Section..", "..Max_Nb_Iti) for Num_Iti = 1 , Max_Nb_Iti do Debug("grey","Traitement Trajet-Itinéraire, type : "..Num_Traj.."-"..Num_Iti.." ,"..data.journeys[Num_Traj].sections[Num_Iti].type) if data.journeys[Num_Traj].sections[Num_Iti].type == "public_transport" then Last_PT = Num_Iti end local Date_Time = Conversion_Date(data.journeys[Num_Traj].sections[Num_Iti].departure_date_time) local Lbl_message = "("..Conversion_Seconde_en_Texte(tonumber(data.journeys[Num_Traj].sections[Num_Iti].duration))..")" local Date_Time = Conversion_Date(data.journeys[Num_Traj].sections[Num_Iti].arrival_date_time) Lbl_message = Lbl_message.." -> "..os.date("%H:%M", Date_Time) if data.journeys[Num_Traj].sections[Num_Iti].type == "waiting" then Lbl_message = Lbl_message.." à " ..data.journeys[Num_Traj].sections[Num_Iti-1].to.stop_point.name Lbl_message = Lbl_message.." -> " .."[En ATTENTE]" else if data.journeys[Num_Traj].sections[Num_Iti].type == "walking" then Lbl_message = Lbl_message.." -> " ..data.journeys[Num_Traj].sections[Num_Iti].to.stop_point.name Lbl_message = Lbl_message.." -> " .."[à PIED]" else if data.journeys[Num_Traj].sections[Num_Iti].type == "transfer" then if data.journeys[Num_Traj].sections[Num_Iti].transfer_type == "walking" then Lbl_message = Lbl_message.." -> " ..data.journeys[Num_Traj].sections[Num_Iti].to.stop_point.name Lbl_message = Lbl_message.." -> " .."[à PIED]" end else if data.journeys[Num_Traj].sections[Num_Iti].type == "crow_fly" then if data.journeys[Num_Traj].sections[Num_Iti].mode == "walking" then Lbl_message = Lbl_message.." -> " ..data.journeys[Num_Traj].sections[Num_Iti].to.stop_point.name Lbl_message = Lbl_message.." -> " .."[à PIED]" end else Lbl_message = Lbl_message.." -> " ..data.journeys[Num_Traj].sections[Num_Iti].to.stop_point.name Lbl_message = Lbl_message.." ["..data.journeys[Num_Traj].sections[Num_Iti].display_informations.commercial_mode .." / "..data.journeys[Num_Traj].sections[Num_Iti].display_informations.code.."]" end end end end Nb_Iti = Nb_Iti + 1 SetUI(VD_Id, "lblIti"..Num_Iti, Lbl_message) end if Max_Nb_Iti < 9 then for i = Max_Nb_Iti + 1, 9 do SetUI(VD_Id, "lblIti"..i, " ") end end SetUI(VD_Id, "lblFromTo", fibaro:get(VD_Id, "ui.lblFromTo.value").. " -> " ..data.journeys[Num_Traj].sections[Last_PT].to.stop_point.name) end function Affiche_Traj(data) local Num_Traj = fibaro:get(VD_Id, "ui.lblNum.value") Num_Traj = tonumber(Num_Traj) Trace("blue","Traitement Trajet : "..Num_Traj) --fibaro:call(VD_Id, "setProperty", "ui.lblDep2.label", "♈") --fibaro:call(VD_Id, "setProperty", "ui.lblDep2.label", "XX\00000aXX") SetUI(VD_Id, "lblFromTo", data.journeys[Num_Traj].sections[1].from.stop_point.name) --SetUI(VD_Id, "lblDir", data.journeys[Num_Traj].sections[1].display_informations.direction) if data.journeys[Num_Traj].status =="" then SetUI(VD_Id, "lblTrafic", "normal") else SetUI(VD_Id, "lblTrafic", data.journeys[Num_Traj].status) end local Date_Time = Conversion_Date(data.journeys[Num_Traj].departure_date_time) local Lbl_message = "à "..os.date("%H:%M", Date_Time) local Date_Time = Conversion_Date(data.journeys[Num_Traj].arrival_date_time) Lbl_message = Lbl_message .." -> "..os.date("%H:%M", Date_Time).." ("..Conversion_Seconde_en_Texte(tonumber(data.journeys[Num_Traj].duration))..")" SetUI(VD_Id, "lblDepArr", Lbl_message) Affiche_Iti(data, Num_Traj) 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_Traj(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")
-
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
-
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.
-
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
-
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.
-
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", "♈") --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")
-
tutoriel IPX800 V4 : Utilisation du mode Push
MAM78 a répondu à un(e) sujet de MAM78 dans GCE Electronics
De rien. Si ça peut être utile -
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
-
c'est quel itinéraire que tu souhaiterais te voir proposé dans les cas que tu sites ?
-
Je n'ai pas encore pu vérifier des cas précis sur le perturbations de trafics.
-
Pourrais-tu nous indiquer un exemple avec des horaires précis en prenant 2 trains qui correspondent aux cas que tu sites.
-
tu peux m'envoyer ton code Token en MP pour que je fasse un test je te promets de le détruire une fois le teste terminer attention de bien m'envoyer le code envoyer par mail par la SNCF
-
Attention, tu as modifié les codes de départ et d'arrivée dans la scène et par conséquent cassé son code LUA. Ce n'est plus la qu'il faut le faire. Comme indiqué dans mon précédent post c'est dans le VD qu'il convient de faire la modification. Seules les users variables doivent être modifiées. Cf. la ligne qui indique "Ne pas modifier le code ci-dessous"
-
Est-il possible de créer/supprimer en code LUA des labels et des boutons dans un VD ? Dans le même registre, est-il possible de modifier en LUA le texte (situé à gauche) d'un label d'un VD ? (je ne parle pas de sa valeur)
-
Une fois le VD et la scène chargée. Attention pour le moment, cela ne fonctionne que pour les lignes directes (donc, veuillez saisir comme destination la gare de votre premier changement, s'il y a changement) Vous rechercher les codes de votre station de départ et d'arrivée : en ayant préalablement sélectionné un type key "stop_points" suivi d'un clic sur ADD en saisissant le nom de votre station de départ, puis sélection de la ligne correspondant à votre station Copier/Coller du code dans la variable code_api_from du VD en saisissant le nom de votre station de destination Copier/Coller du code dans la variable code_api_to du VD Voir exemple ci-dessous :
-
Pour test : Vous trouverez ci-dessous le VD à Charger : Itinéraire_SNCF.vfib.json N'oubliez pas de modifier la variable SceneID_Iti_SNCF par l'ID de la Scène Itinéraire SNCF (dans laquelle vous aurez coller le code LUA ci-dessous) Voici le code de la nouvelle scène : N'oubliez pas de modifier l'ID de votre Scène Sonos dans la variable SceneID_Sonos (si vous en possédez une enceinte) --[[ %% 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.2 -- Création : MAM78 -- Date MAJ : 09/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 ---------------------------------------------------------------------------------- -- 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 = "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 ---------------------------------------------------------------------------------- -- 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() 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 = "3" 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 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) SetUI(VD_Id, "lblLigne", data.journeys[1].sections[1].display_informations.commercial_mode .." / "..data.journeys[1].sections[1].display_informations.code) SetUI(VD_Id, "lblFrom", data.journeys[1].sections[1].from.stop_point.name) SetUI(VD_Id, "lblTo", data.journeys[1].sections[1].to.stop_point.name) SetUI(VD_Id, "lblDir", data.journeys[1].sections[1].display_informations.direction) if data.journeys[1].status =="" then SetUI(VD_Id, "lblTrafic", "normal") else SetUI(VD_Id, "lblTrafic", data.journeys[1].status) end 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)) local Lbl_message = "Départ à "..os.date("%H:%M", Date_Time) -- SetUI(params[idx].VD_Id, "lblDep1", "Départ "..Prochain_Depart.." à " ..Horaire) 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)) Lbl_message = Lbl_message .." Arrivée à "..os.date("%H:%M", Date_Time) SetUI(VD_Id, "lblDep1", Lbl_message) -- 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")
-
alors là tu à bien un PB de token probablement. Laisse moi un instant, je vais vous livrer une nouvelle version
-
lorsque tu saisis TER, tu dois avoir une liste qui s'affiche, puis tu sélectionnes la ligne qui correspond à ta recherche et tu fais ENTER puis tu récupère le code du champs
-
@minos Si tu arrives à extraire le code Rest indiqué ci-dessous, ce ne doit pas venir de ton token.
-
t'inquiète ce sera plus simple pour la future version
-
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 [emoji39]
-
lorsque tu as saisie ton token, est-ce que tu as cliqué sur le symbol disquette ?
