Aller au contenu

Itinéraire SNCF


MAM78

Messages recommandés

Voici une nouvelle version 0.7

 

Cette nouvelle version apporte :

  1. Possibilité de paramétrer 2 icônes
    • Pour un trafic normal
    • Train_Trafic_OK.png.d39e88c81ed2d17a04121b0945a2cb69.png
    • Pour un trafic avec des perturbations (retard au départ ou à l'arrivée)
    • Train_Trafic_NOK.png.b18a4b90421502df4a7023bb9c4ca2bb.png
  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
    • Voir variable (api_heure_depart) ci-dessous.
  3. 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é par MAM78
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

@MAM78

 

Salut , 

c'est importé :

 

 

sncf11.JPG.bc21a8c7dcfe4d0e7382ff1e2eb05043.JPG

 

 

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é  :blink:

 

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é par minos
Lien vers le commentaire
Partager sur d’autres sites

Ce n'est pas 2 fois la même icône. L'une est verte, l'autre est rouge :D 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é par MAM78
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

  • 6 mois après...
×
×
  • Créer...