MAM78 Posté(e) le 15 juillet 2017 Auteur Signaler Posté(e) le 15 juillet 2017 (modifié) Voici une nouvelle version 0.7 Cette nouvelle version apporte : Possibilité de paramétrer 2 icônes Pour un trafic normal Pour un trafic avec des perturbations (retard au départ ou à l'arrivée) Possibilité de définir (en option) un horaire à partir duquel la recherche doit être effectuée. Si l'horaire demandé est dépassé la recherche est faite pour le jour suivant Voir variable (api_heure_depart) ci-dessous. Possibilité de mixer les itinéraires en utilisant les lignes de trains, de bus et de métro, et l'indication de trajet à pied lors de transferts entre 2 stations/gares/bus Cette nouvelle fonctionnalité est disponible en paramétrant une autre API (https://api.navitia.io/v1) qui utilise la même structure que celle utilisé par la SNCF. Pour cela, il convient de se créer un compte sur le site https://www.navitia.io sur lequel vous obtiendrez un nouveau code API Nota : Cette seconde API présente néanmoins un inconvénient. Elle ne dispose pas des information sur les perturbations sur le trafic. Il conviendra donc de faire le choix entre les 2 API selon vos besoins. Du coup j'ai intégré dans les paramètres des trajets (VD) des nouvelles variables (en rouge), voir chapitre sur la scène : 1) Veuillez installer le nouveau VD ci-dessous : Itinéraire_SNCF.vfib.json Attention de bien modifier sur chacun des 4 boutons : l'icônes qui correspond au trafic normal (fournie ci-dessus) La variable : SceneID_Horaires_Transports par l'ID de la Scène Itinéraire SNCF La variable : IconeID_TraficOk par l'ID de l'icône qui correspond au trafic normal (fournit ci-dessus) J'espère à ne plus avoir à faire de modifications du VD hein @Sakkhho 2) Veuillez charger le nouveau code de la scène : Il convient de : modifier/compléter la liste des variables utilisateur (nouvelles variables créée en rouge, ci-dessous) : VD_Id = Id du VD de pilotage de votre Trajet Traj_Titre = Désignation du trajet pour le répéter dans le mode debug code_api_from = Code de votre point de départ, soit de type (stop_area et stop_station) attention les codes stop_area et stop_station ne sont pas les mêmes selon que l'on utilise API data.sncf.com ou navitia.io code_api_to = Code de votre point d'arrivée, soit de type (stop_area et stop_station) attention les codes stop_area et stop_station ne sont pas les mêmes selon que l'on utilise API data.sncf.com ou navitia.io User_code_API = Code obtenu sur les 2 sites suivants : (sans encodage 64) et selon celui utilisé pour le trajet. https://data.sncf.com/api (API de la SNCF) https://www.navitia.io (API que permet d'avoir les lignes METRO et BUS) api_url = "https://api.sncf.com/v1" (si utilisation API data.sncf.com) "https://api.navitia.io/v1" (si utilisation API navitia.io) api_coverage = "sncf" ou (si utilisation API data.sncf.com) code région (ex: fr-idf) (si utilisation API navitia.io) dans ce cas la france est découpée en plusieurs régions : voir détail sur le lien : https://navitia.opendatasoft.com/explore/?sort=modified&refine.geographicarea=France "fr-idf" = Ile-de-France, France, Paris "fr-ne" = Nord-est (régions Alsace, Bourgogne, Picardie, Nord-Pas-de-Calais) "fr-sw" = Sud-ouest (régions Poitou-Charentes, Limousin, Aquitaine, Midi-Pyrénées) "fr-nw" = Nord-Ouest (régions Bretagne, Pays de la Loire, Centre, Normandie) "fr-se" = Sud-Est (régions Provence-Alpes-Côtes d'Azur, Rhône-Alpes, Languedoc-Roussillon) "fr-bre" = Bretagne en double avec "fr-nw" ? à tester api_heure_depart = Horaire à partir duquel le recherche doit être faite (option). si non renseigné ce sera le prochain trajet disponible (idem précédemment) Msg_Sonos = Indication si souhaitez envoyer un message sur votre Sonos Volume_Sonos = Niveau du volume du message Msg_Depart = Non en phonétique de votre point de départ, pour message Sonos Msg_Arrivee = Non en phonétique de votre point d'arrivée, pour message Sonos si vous utilisez plusieurs trajets (plusieurs VD), vous devez compléter/dupliquer cette liste pour chacun des VD modifier la variable : IconeID_TraficOk par l'ID de l'icône qui correspond au trafic normal (fournit ci-dessus) modifier la variable : IconeID_TraficNOk par l'ID de l'icône qui correspond au trafic perturbé (fournit ci-dessus) 3) Bons tests PS : Les étapes suivantes du projet seront probablement consacré à Mise en place d'une notification par mail, sms, push lors de perturbations (retards au départ ou à l'arrivée) la recherche s'il y a des perturbations sur l'une des lignes utilisées par le trajet. Je n'ai pas encore trouvé la bonne solution, puisqu'il s'agirait de désigner une ligne en particulier et de chercher s'il y a une perturbation en cour. Si vous avez d'autres idées, vous pouvez toujours faire vos demandes Voici le nouveau code de la scène : --[[ %% properties %% events %% globals --]] ---------------------------------------------------------------------------------- -- Name : HC2 Horaire Transport en commun -- Type : Virtual Device & Scene ---------------------------------------------------------------------------------- -- Cette scène permet d'obtenir l'horaire du prochain départ des transports -- en communs, que ce soit en Train, en Bus, en Metro -- depuis un lieu (localité) ou une station (gare, métro, bus) ---------------------------------------------------------------------------------- -- Evolution du Projet à venir : -- l'identification des perturbations sur une des lignes du trajet ---------------------------------------------------------------------------------- -- Version : 0.7 -- Création : MAM78 -- Date MAJ : 15/07/2017 -- -- Evolutions : -- V0.1 09/07/2017 : 1) Initialisation du projet -- -- V0.2 10/07/2017 : 1) 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 : 1) Ajouts de boutons de navigation pour parcourir les diférents -- itinéraires par odre chronologique des départs -- -- V0.4 13/07/2017 : 1) La décomposition du parcours sur chacune des étapes -- (changements) Maximum 9 étapes pour le moment. -- 2) Le temps de trajet global, ainsi que par étape -- 3) Le mode de circulation pour chacune des étape -- (La ligne à utiliser, Trajet à pied, Attente en gare, ... -- 4) La possibilité de choisir le mode retour (inversion entre -- le point de départ et d'arrivé). -- -- V0.5 13/07/2017 : 1) Possibilité d'utiliser les flèches de navigation que ce -- soit pour un trajet Aller ou Retour -- -- V0.6 14/07/2017 : 1) affichage d'alertes sur les retards au départ/arrivée -- avec la cause (si disponible) -- 2) Consolidation de l'ensemble des paramètres des trajets -- dans la scène pour simplifier leur mise à jour et les -- rassembler à un seul et même endroit -- 3) Possibilité d'utiliser plusieurs trajets au travers -- de plusieurs VD et consolider les informations -- au niveau de la scène -- 4) Il n'est plus nécessaire d'encoder le code d'accès à -- l'API SNCF. La scène le fait tout seule -- 5) Indication qu'il n'y a plus de trajets disponible -- lors de la navigation dans les trajets (inférieur à 5) -- 6) Possibilité d'ultiliser comme point de départ -- ou d'arrivée, soit un : -- - stop_points (lieu d'arrêt Gare) -- - stop_areas (lieu tel qu'une localité) c'est utile -- lorsqu'il y a plusieurs gares dans une localité -- V0.7 14/07/2017 : 1) Possibilité de mixer les itinéraires en utilisant les -- lignes de trains, de bus et de métro, et à pied. -- Cette fonctionnalité est disponible en paramétrant une -- autre API (https://api.navitia.io/v1) -- 2) Possibilité de définir (en option) un horaire à partir -- duquel la recherche doit être effectuée. Si l'horaire -- demandé est dépassé la recherche est faite pour le -- jour suivant ---------------------------------------------------------------------------------- ---------------------------------------------------------------------------------- -- Pour pouvoir utiliser l'API, vous devez vous créer un compte sur : -- https://data.sncf.com/api (API de la SNCF) -- https://www.navitia.io (API que permet d'avoir les lignes METRO et BUS) ---------------------------------------------------------------------------------- ---------------------------------------------------------------------------------- -- User variables : ---------------------------------------------------------------------------------- -- Les variables ci-dessous (code_api_from & code_api_to) 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 = soit : https://api.sncf.com/v1 ou https://api.navitia.io/v1 -- Token = le code obtenu sur l'un des 2 sites -- coverage = sncf si utilisation de api.sncf.com -- code région (ex: fr-idf) si utilisation de api.navitia.io -- stop_points ou stop_areas = saisir le nom de votre point de départ -- -> Votre saisie va se transformer en un code -- Recopier ce code dans la variable code_api_from -- stop_points ou stop_areas = saisir le nom de votre point d'arrivée -- -> Votre saisie va se transformer en un code -- Recopier ce code dans la variable code_api_to -- empty feature = departures -- Cliquer sur le bouton SUBMIT -- vous devriez obtenir la liste des prochains départ ---------------------------------------------------------------------------------- -- La structure Trajet ci-dessous vous permet de définir l'ensemble des trajets -- que vous souhaitez créer. Chacune des ces structures correspond un VD -- qui permet de piloter vos trajets. Un Trajet = Un VD -- VD_Id ci-dessous permet de faire la correspondance avec les paramètres ci-dessous ---------------------------------------------------------------------------------- -- Description des variables : -- VD_Id = Id du VD de pilotage de votre Trajet -- Traj_Titre = Désignation du trajet pour le répérer dans en mode debug -- code_api_from = Code de votre station de départ évoqué ci-dessus -- code_api_to = Code de votre station d'arrivée évoqué ci-dessus -- User_code_API = Code obtenu sur l'un des 2 sites suivants : -- https://data.sncf.com/api (API de la SNCF) -- https://www.navitia.io (API que permet d'avoir les lignes METRO et BUS) -- api_url = "https://api.sncf.com/v1" ou "https://api.navitia.io/v1" -- api_coverage = "sncf" ou code région (ex: fr-idf) si utilisation de api.navitia.io -- api_heure_depart = Horaire à partir duquel le recherche doit être faite (option) -- si non renseigné ce sera le prochain trajet disponible -- Msg_Sonos = Indication si souhaitez envoyer un message sur votre Sonos -- Volume_Sonos = Niveau du volume du message -- Msg_Depart = Nom en phonétique de votre point de départ, pour message Sonos -- Msg_Arrivee = Nom en phonétique de votre point d'arrivée, pour message Sonos ---------------------------------------------------------------------------------- local Trajets = { { ["VD_Id"] = 245, ["Traj_Titre"] = "Trajet A", ["code_api_from"] = "stop_area:OCE:SA:87725002", --"stop_point:OCE:SP:TrainTER-87761007", ["code_api_to"] = "stop_area:OCE:SA:87713040", --"stop_point:OCE:SP:TrainTER-87725689", ["User_code_API"] = "placé ici votre code API SNCF ou Navitia", ["api_url"] = "https://api.sncf.com/v1", ["api_coverage"] = "sncf", ["api_heure_depart"] = "08:10", ["Msg_Sonos"] = "Non", ["Volume_Sonos"] = 10, ["Msg_Depart"] = "letan la ville", -- écriture phonétique pour TTS ["Msg_Arrivee"] = "La Défense" -- écriture phonétique pour TTS }, { ["VD_Id"] = 247, ["Traj_Titre"] = "Trajet Metro", ["code_api_from"] = "stop_area:OIF:SA:8738247", ["code_api_to"] = "stop_area:OIF:SA:59:6263515", ["User_code_API"] = "placé ici votre code API SNCF ou Navitia", ["api_url"] = "https://api.navitia.io/v1", ["api_coverage"] = "fr-idf", ["api_heure_depart"] = "", ["Msg_Sonos"] = "Non", ["Volume_Sonos"] = 10, ["Msg_Depart"] = "letan la ville", -- écriture phonétique pour TTS ["Msg_Arrivee"] = "La Défense" -- écriture phonétique pour TTS } } ---------------------------------------------------------------------------------- -- Id de l'icone représentant un trafic normal -- Id de l'icone représentant un trafic avec du retard ou perturbé ---------------------------------------------------------------------------------- local IconeID_TraficOk = 1091 local IconeID_TraficNOk = 1092 local modetrace = true local modedebug = true ---------------------------------------------------------------------------------- -- 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 ---------------------------------------------------------------------------------- -- encoding to base64 ---------------------------------------------------------------------------------- -- character table string -- encoding to base64 function encode64(data) local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' return ((data:gsub('.', function(x) local r,b='',x:byte() for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end return r; end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) if (#x < 6) then return '' end local c=0 for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end return b:sub(c+1,c+1) end)..({ '', '==', '=' })[#data%3+1]) 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 ou xmin ---------------------------------------------------------------------------------- function Conversion_Seconde_en_Texte(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 function CalculJourSuivantSelonHeure(heure) local Aujourdhui = os.date("*t") Aujourdhui.hour = string.sub (heure, 1, 2) Aujourdhui.min = string.sub (heure, 4, 5) if os.time() <= os.time(Aujourdhui) then return (os.time(Aujourdhui)) else return (os.time(Aujourdhui) + (24*60*60)) -- ajout d'1 jour 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 ---------------------------------------------------------------------------------- -- 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 Effacement_Data() SetUI(VD_Id, "lblFromTo", "") SetUI(VD_Id, "lblDepArr", "") SetUI(VD_Id, "lblNum", "") SetUI(VD_Id, "lblTraficDepart", "") SetUI(VD_Id, "lblTraficArrivee", "") SetUI(VD_Id, "lblTraficCause", "") for i = 1, 9 do SetUI(VD_Id, "lblIti"..i, " ") end end function Traitement_Retard(Status, Perturbations, First_stop_point, Last_stop_point) Debug("grey","First_stop_point="..First_stop_point) Debug("grey","Last_stop_point="..Last_stop_point) if Status == "" then fibaro:call(VD_Id , "setProperty", "currentIcon", IconeID_TraficOk) SetUI(VD_Id, "lblTraficDepart", "ras") SetUI(VD_Id, "lblTraficArrivee", "ras") SetUI(VD_Id, "lblTraficCause", "ras") else fibaro:call(VD_Id , "setProperty", "currentIcon", IconeID_TraficNOk) SetUI(VD_Id, "lblTraficDepart", "") SetUI(VD_Id, "lblTraficArrivee", "") SetUI(VD_Id, "lblTraficCause", "") if Status == "SIGNIFICANT_DELAYS" then local Perdu_Lib_Depart = "" local Perdu_Lib_Arrivee = "" for Num_Pertu = 1 , #Perturbations do Debug("grey", "Trace 1 / status="..Perturbations[Num_Pertu].status.." / "..Perturbations[Num_Pertu].cause) SetUI(VD_Id, "lblTraficCause", Perturbations[Num_Pertu].cause) local impacted_objects = Perturbations[Num_Pertu].impacted_objects Debug("grey", "Trace 2 / impacted_objects ="..#impacted_objects) for Num_impacted_objects = 1 , #impacted_objects do local impacted_stops = impacted_objects[Num_impacted_objects].impacted_stops Debug("grey", "Trace 3 / impacted_stops ="..#impacted_stops) for Num_impacted_stops = 1 , #impacted_stops do local stop_point = impacted_stops[Num_impacted_stops].stop_point Debug("grey", "Trace 4 / stop_point ="..Num_impacted_stops) Debug("grey", "Trace 5 / First_stop_point=".."*"..First_stop_point.."*") Debug("grey", "Trace 6 / First_stop_point=".."*"..stop_point.id.."*") if stop_point.id == First_stop_point then Debug("grey","Trouve First_stop_point="..stop_point.id) if impacted_stops[Num_impacted_stops].departure_status == "delayed" then Perdu_Lib_Depart = Conversion_Seconde_en_Texte(tonumber(impacted_stops[Num_impacted_stops].amended_departure_time) - tonumber(impacted_stops[Num_impacted_stops].base_departure_time)) SetUI(VD_Id, "lblTraficDepart", "Retard de "..Perdu_Lib_Depart) end break end end for Num_impacted_stops = 1 , #impacted_stops do local stop_point = impacted_stops[Num_impacted_stops].stop_point Debug("grey", "Trace 7 / stop_point ="..Num_impacted_stops) Debug("grey", "Trace 5 / Last_stop_point=".."*"..Last_stop_point.."*") Debug("grey", "Trace 6 / Last_stop_point=".."*"..stop_point.id.."*") if stop_point.id == Last_stop_point then Debug("grey","Trouve Last_stop_point="..stop_point.id) if impacted_stops[Num_impacted_stops].departure_status == "delayed" then Perdu_Lib_Arrivee = Conversion_Seconde_en_Texte(tonumber(impacted_stops[Num_impacted_stops].amended_arrival_time) - tonumber(impacted_stops[Num_impacted_stops].base_arrival_time)) end break end end end end if Perdu_Lib_Depart == "" then SetUI(VD_Id, "lblTraficDepart", "ras") else SetUI(VD_Id, "lblTraficDepart", "Retard de "..Perdu_Lib_Depart) end if Perdu_Lib_Arrivee == "" then SetUI(VD_Id, "lblTraficArrivee", "ras") else SetUI(VD_Id, "lblTraficArrivee", "Retard de "..Perdu_Lib_Arrivee) end else SetUI(VD_Id, "lblTraficCause", Status) end end end function Affiche_Iti(Sections, Status, Perturbations, Traj_Num, From) local Last_PT = nil local Max_Nb_Iti= 0 local Nb_Iti = 0 if #Sections > 9 then Max_Nb_Iti = 9 else Max_Nb_Iti = #Sections end Debug("grey","Nb_Section, Max_Nb_Iti="..#Sections..", "..Max_Nb_Iti) local First_stop_point = "" local Last_stop_point = "" for Num_Iti = 1 , Max_Nb_Iti do local Itineraire = Sections[Num_Iti] if Itineraire.type == "waiting" then Debug("grey","Traitement Trajet-Itinéraire, type : "..Traj_Num.."-"..Num_Iti.." ,"..Itineraire.type) else Debug("grey","Traitement Trajet-Itinéraire, type, embedded_type : "..Traj_Num.."-"..Num_Iti.." ,"..Itineraire.type.." , "..Itineraire.to.embedded_type) end if Itineraire.type == "public_transport" then Last_PT = Num_Iti end local Date_Time = Conversion_Date(Itineraire.departure_date_time) local Heure_Depart = os.date("%H:%M", Date_Time) local Date_Time = Conversion_Date(Itineraire.arrival_date_time) local Duree = "("..Conversion_Seconde_en_Texte(tonumber(Itineraire.duration))..")" local Heure_Arrivee = os.date("%H:%M", Date_Time) local Mode_Depl = "" local Moyen_Depl if Itineraire.type == "waiting" then Mode_Depl = "attendre" elseif Itineraire.type == "walking" then if Itineraire.to.embedded_type == "stop_point" then Der_Dest = Itineraire.to.stop_point.name Last_stop_point = Itineraire.to.stop_point.id if Itineraire.from.embedded_type == "stop_point" then First_stop_point = Itineraire.from.stop_point.id else First_stop_point = Itineraire.from.stop_area.id end else Der_Dest = Itineraire.to.stop_area.name end Mode_Depl = "marcher" elseif Itineraire.type == "transfer" then if Itineraire.transfer_type == "walking" then if Itineraire.to.embedded_type == "stop_point" then Der_Dest = Itineraire.to.stop_point.name Last_stop_point = Itineraire.to.stop_point.id if Itineraire.from.embedded_type == "stop_point" then First_stop_point = Itineraire.from.stop_point.id else First_stop_point = Itineraire.from.stop_area.id end else Der_Dest = Itineraire.to.stop_area.name end Mode_Depl = "marcher" end elseif Itineraire.type == "street_network" then if Itineraire.mode == "walking" then if Itineraire.to.embedded_type == "stop_point" then Der_Dest = Itineraire.to.stop_point.name Last_stop_point = Itineraire.to.stop_point.id if Itineraire.from.embedded_type == "stop_point" then First_stop_point = Itineraire.from.stop_point.id else First_stop_point = Itineraire.from.stop_area.id end else Der_Dest = Itineraire.to.stop_area.name end Mode_Depl = "marcher" end elseif Itineraire.type == "crow_fly" then if Itineraire.mode == "walking" then if Itineraire.to.embedded_type == "stop_point" then Der_Dest = Itineraire.to.stop_point.name Last_stop_point = Itineraire.to.stop_point.id if First_stop_point == "" then if Itineraire.from.embedded_type == "stop_point" then First_stop_point = Itineraire.from.stop_point.id else First_stop_point = Itineraire.from.stop_area.id end end else Der_Dest = Itineraire.to.stop_area.name end Mode_Depl = "marcher" end else if Itineraire.to.embedded_type == "stop_point" then Der_Dest = Itineraire.to.stop_point.name Last_stop_point = Itineraire.to.stop_point.id if Itineraire.from.embedded_type == "stop_point" then First_stop_point = Itineraire.from.stop_point.id else First_stop_point = Itineraire.from.stop_area.id end else Der_Dest = Itineraire.to.stop_area.name end Mode_Depl = "prendre" Moyen_Depl = Itineraire.display_informations.physical_mode if Itineraire.display_informations.code ~= "" then Moyen_Depl = Moyen_Depl .. " / ligne "..Itineraire.display_informations.code end if Itineraire.display_informations.headsign ~= "" and Itineraire.display_informations.network ~= "METRO" and Itineraire.display_informations.physical_mode ~= "Bus" then Moyen_Depl = Moyen_Depl .. " / "..Itineraire.display_informations.headsign end end local Lbl_message ="" if Mode_Depl == "prendre" or Mode_Depl == "marcher" then Lbl_message = "à "..Heure_Depart --.." -> "..Date_Arrivee Lbl_message = Lbl_message.." "..Mode_Depl if Mode_Depl == "prendre" then Lbl_message = Lbl_message.." "..Moyen_Depl end Lbl_message = Lbl_message.." "..Duree Lbl_message = Lbl_message.." vers "..Der_Dest Lbl_message = Lbl_message.." arrivée à "..Heure_Arrivee elseif Mode_Depl == "attendre" then Lbl_message = "à "..Heure_Depart Lbl_message = Lbl_message.." "..Mode_Depl Lbl_message = Lbl_message.." à "..Der_Dest Lbl_message = Lbl_message.." "..Duree Lbl_message = Lbl_message.." jusqu'à "..Heure_Arrivee end if tonumber(Itineraire.duration) == 0 then Max_Nb_Iti = Max_Nb_Iti -1 else Nb_Iti = Nb_Iti + 1 SetUI(VD_Id, "lblIti"..Nb_Iti, Lbl_message) end end if Nb_Iti < 9 then for i = Nb_Iti + 1, 9 do SetUI(VD_Id, "lblIti"..i, " ") end end SetUI(VD_Id, "lblFromTo", From.. " -> " ..Der_Dest) ------------------------------------------------------------------------------- -- Traitement des retards ------------------------------------------------------------------------------- Traitement_Retard(Status, Perturbations, First_stop_point, Last_stop_point) return Der_Dest end function Affiche_Traj(data) local Traj_Num = tonumber(string.sub(fibaro:get(VD_Id, "ui.lblNum.value"), -1)) local Trajet = data.journeys local From = "" if #Trajet < Traj_Num then local Traj_Text = fibaro:get(VD_Id, "ui.lblNum.value") local Traj_Sens = string.sub(Traj_Text, 1, 1) Effacement_Data() SetUI(VD_Id, "lblDepArr", "Plus de trajets disponibles") Traj_Num = Traj_Num - 1 if Traj_Sens == "A" then fibaro:call(VD_Id, "setProperty", "ui.lblNum.value", "Aller N° "..Traj_Num) else fibaro:call(VD_Id, "setProperty", "ui.lblNum.value", "Retour N° "..Traj_Num) end Der_Dest = "" else Trace("blue","Traitement Trajet : "..Traj_Num) if data.journeys[Traj_Num].sections[1].from.embedded_type == "stop_point" then From = data.journeys[Traj_Num].sections[1].from.stop_point.name else From = data.journeys[Traj_Num].sections[1].from.stop_area.name 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) local Der_Dest = Affiche_Iti(data.journeys[Traj_Num].sections, data.journeys[Traj_Num].status, data.disruptions, Traj_Num, From) end return Der_Dest end ---------------------------------------------------------------------------------- -- Traitement des données en provenance de l'IPA SNCF ---------------------------------------------------------------------------------- function GetData() fibaro:call(VD_Id , "setProperty", "currentIcon", IconeID_TraficOk) Debug("grey","T1".." - "..Traj_Titre) -- 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 if api_heure_depart == "" then api_datetime = os.date("%Y%m%dT%H%M%S", os.time()) else api_datetime = os.date("%Y%m%dT%H%M00", CalculJourSuivantSelonHeure(api_heure_depart)) end local api_datetime_represents = "departure" local api_min_nb_journeys = "9" 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_code_API_Encode64}, 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 local Der_Dest = Affiche_Traj(data) if Der_Dest == "" then Debug("grey","Plus de trajet à afficher") else if data.journeys[1].sections[1].from.embedded_type == "stop_point" then Trace("green","Départ : "..data.journeys[1].sections[1].from.stop_point.name) else Trace("green","Départ : "..data.journeys[1].sections[1].from.stop_area.name) end Trace("green","Direction : "..Der_Dest) 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 end else Trace("orange"," Attention : Aucunes données à traiter") Effacement_Data() SetUI(VD_Id, "lblDepArr", "Erreur =".."aucune données") end else Debug("grey","T6".." - "..Traj_Titre) Trace("yellow","Traitement ko : "..Traj_Titre) Effacement_Data() SetUI(VD_Id, "lblDepArr", "Erreur ="..response.status) 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) Effacement_Data() SetUI(VD_Id, "lblDepArr", "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.VD_Id) then VD_Id = v.VD_Id end end local Trouve_VD_Id = false for i = 1, #Trajets do if VD_Id == Trajets[i].VD_Id then Debug("grey","VD_Id="..VD_Id.." ("..fibaro:getName(VD_Id)..") a bien été trouvé") Traj_Titre = Trajets[i].Traj_Titre code_api_from = Trajets[i].code_api_from code_api_to = Trajets[i].code_api_to api_url = Trajets[i].api_url api_coverage = Trajets[i].api_coverage api_heure_depart = Trajets[i].api_heure_depart Msg_Sonos = Trajets[i].Msg_Sonos Volume_Sonos = Trajets[i].Volume_Sonos Msg_Depart = Trajets[i].Msg_Depart Msg_Arrivee = Trajets[i].Msg_Arrivee User_code_API = Trajets[i].User_code_API Trouve_VD_Id = true break end end User_code_API_Encode64 = encode64(User_code_API) if Trouve_VD_Id then Start() else Trace("orange","Erreur : Votre VD n'a pas été trouvé dans le tableau Trajets") end 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é le 16 juillet 2017 par MAM78 1
minos Posté(e) le 16 juillet 2017 Signaler Posté(e) le 16 juillet 2017 (modifié) @MAM78 Salut , c'est importé : Par contre , j'ai l'impression que c'est 2 fois la même Icon ? en plus je ne me souviens plus comment récuprer l'ID des icons ....Pfff je suis pas encore bien réveillé Il y a 8 heures, MAM78 a dit : api_heure_depart = Horaire à partir duquel le recherche doit être faite (option). si non renseigné ce sera le prochain trajet disponible (idem précédemment) cette variable , c'est une recherche automatique à partir de l'heure renseignée ...? j 'ai pas tout capté ... Merci Modifié le 16 juillet 2017 par minos
MAM78 Posté(e) le 16 juillet 2017 Auteur Signaler Posté(e) le 16 juillet 2017 (modifié) Ce n'est pas 2 fois la même icône. L'une est verte, l'autre est rouge tu ne serais pas daltonien Pour récupérer l'id, c'est simple. Une fois ton icône chargée, tu vas dans la fenêtre de sélection des icônes. Tu fais un clic droit sur l'icône et tu choisis ouvrir l'image dans un nouvelle onglet. Dans ce nouvelle onglet, tu auras l'icônes et dans la barre de recherche tu trouveras le n° de l'icônes. Jusqu'à présent la recherche se faisait à partir de l'heure courante et affichait les trains au départ. Maintenant avec cette option, le recherche va se faire non pas en fonction de l'heure courante mais à partir de l'heure indiquée. Si toutefois l'heure indiquée est dépassée, la recherche se fera sur le jour suivant selon cette même heure. L'objectif de cette option est de pouvoir programmer une notification en cas de retard sur le train que l'on souhaite prendre. Exemple : le train que l'on souhaite prendre part à 07:35 en théorie. Tu programmes un lancement de la recherche à 06:00 (clic via GEA sur le premier bouton) Si le train est annoncé avec du retard tu recevras une notification, sinon rien Le principe est que même s'il y a un train 06:45, ce train ne sera pas pris en compte pour faire la recherche. S'il est 14:00 et que tu clic sur le bouton, ce sera le train du lendemain qui sera recherché. De coup en t'expliquant, je viens de me rendre qu'il faut que j'ajoute également une autre variable pour le trajet retour. Modifié le 16 juillet 2017 par MAM78
MAM78 Posté(e) le 17 juillet 2017 Auteur Signaler Posté(e) le 17 juillet 2017 Ben alors mes beta testeurs, vous êtes parti en vacances ?
minos Posté(e) le 17 juillet 2017 Signaler Posté(e) le 17 juillet 2017 il y a 7 minutes, MAM78 a dit : Ben alors mes beta testeurs, vous êtes parti en vacances ? @MAM78 Désolé , un peu pris par le temps ce soir ... plein de truc à faire .... j'essaie de faire quelque chose avec GEA ....Pfff pas facile pour un novice comme moi ... Dur dur le code ....
MAM78 Posté(e) le 17 juillet 2017 Auteur Signaler Posté(e) le 17 juillet 2017 Pas de PB. Je sais c'est ce que c'est que découvrir toutes ces possibilités que nous offre nos HC2.
minos Posté(e) le 17 juillet 2017 Signaler Posté(e) le 17 juillet 2017 En parlant de GEA , si tu peux m'aiguiller ( jeu de mot pour itinéraires SNCF ) Je suis preneur...
MAM78 Posté(e) le 17 juillet 2017 Auteur Signaler Posté(e) le 17 juillet 2017 Désolé mais sur GEA je suis vraiment débutant. Même si je vais probablement m'y intéresser très prochainement. Mais pour le moment je cherche plus à découvrir le code LUA en développant des VD et scènes pour bien comprendre les possibilités de notre HC2. À vrai dire je préfère développer de nouvelles fonctionnalités ou enrichir des modules existants plutôt qu'utiliser des solutions existantes prêtes à l'emploi
minos Posté(e) le 18 juillet 2017 Signaler Posté(e) le 18 juillet 2017 @MAM78 Bon la V7 est opérationnelle... par contre je ne sais pas comment recevoir avec le VD des notifications des horaires par exemple sur mon tel (soit par sms ou mail ou notif fibaro).
MAM78 Posté(e) le 18 juillet 2017 Auteur Signaler Posté(e) le 18 juillet 2017 Regard le bout de code ou j'envoi le message vers les enceintes Sonos. Tu peux t'en inspirer pour faire un mail
minos Posté(e) le 21 juillet 2017 Signaler Posté(e) le 21 juillet 2017 Coucou, apparemment , je n'ai pas les trains supprimés , ni les retards qui s'affichent .... bonne journée
Sakkhho Posté(e) le 31 janvier 2018 Signaler Posté(e) le 31 janvier 2018 hello ca bug aussi chez vous ? je soupçonne l'api de bugée ou d'avoir été modifiée.
MAM78 Posté(e) le 31 janvier 2018 Auteur Signaler Posté(e) le 31 janvier 2018 Non chez-moi ça fonctionne. Peux-tu m'envoyer ta configuration (variables utilisateur, hormis ton code ["User_code_API"]) de l'itinéraire afin que je puisse le tester dans mon environnement
Messages recommandés