[LUA] Durée de trajet avec Waze
Re: [LUA] Durée de trajet avec Waze
ah super merci beaucoup 
-
garycooper
- Messages : 453
- Inscription : 07 août 2017, 23:58
Re: [LUA] Durée de trajet avec Waze
Bonjour à tous, voilà plusieurs jours que j'essaie également de faire fonctionner ce script entre 17h et 17h15 le vendredi mais sans succès.
Voici ce que j'ai dans mes logs :
et le script complet est le suivant (j'ai changé mes coordonnées latitude et longitude pour le forum) :
Voici ce que j'ai dans mes logs :
et le message d'erreur suivant :LUA: <font color='#f3031d'>curl --referer https://www.waze.com "https://www.waze.com/row-RoutingManager ... ADS"</font>
La ligne 76 correspond à2021-10-30 09:50:08.661 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_waze_aller.lua: /home/pi/domoticz/scripts/lua/script_time_waze_aller.lua:76: bad argument #1 to 'pairs' (table expected, got nil)
Code : Tout sélectionner
for response,results in pairs(route) do
Code : Tout sélectionner
---------------------------------
-- Script de calcul de temps pour un trajet entre 2 coordonnées
-- Auteur : Neutrino
-- Date : 7 septembre 2015
-- Nécessite un capteur virtuel de type Text
-- source :
-- http://www.domo-blog.fr/info-trajet-waze-eedomus-version-raspberry/
---------------------------------
-- Modif Chrominator
--
-- 2016-01-30 : Remplacement des secondes du trajet par " mn"
-- Pas de détermination du temps de trajet les W-E et jours fériés
-- 2017-11-11 : Détermination du nom des routes principales (les plus longtemps parcourues) car routeName n'existe plus dans le JSON
--
DEBUG=true
function voir_les_logs (s) -- nécessite la variable DEBUG
if DEBUG then
if s ~= nil then
print ("<font color='#f3031d'>".. s .."</font>")
else
print ("<font color='#f3031d'>aucune valeur affichable</font>")
end
end
end
commandArray={}
--import des fontions pour lire le JSON
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
--variables à modifier----------------
--idx du capteur
idx = '119' -- Capteur de type texte pour afficher la durée du trajet et le nom de la principale route empruntée.
idx_curve = '120' -- Capteur de type voltmetre pour archiver les temps de parcours calculés
-- y = latitude et x = longitude
--coordonnées de départ
departx="2.2903622"
departy="48.8582546"
--coordonnées d'arrivée
arrivex="5.501913"
arrivey="45.580363"
---récupère l'heure actuelle en minutes
time=os.time()
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))
maintenant=tonumber(hours*60+minutes)
-- Récupère le jour pour ne pas calculer de trajet les week-end.
-- Sunday = 0 - Saturday = 6
local weekday = os.date('%w')
---calcule du trajet entre 17h00 et 17h15
if (maintenant>=1020 and maintenant<= 1035 and weekday == Friday) or DEBUG then
-----------------------------------------
----------------------------------------------------------------
--Récupération du trajet et de sa durée en temps réel via WAZE--
----------------------------------------------------------------
voir_les_logs('curl --referer https://www.waze.com "https://www.waze.com/row-RoutingManager/routingRequest?from=x%3A'..departx..'+y%3A'..departy..'&to=x%3A'..arrivex..'+y%3A'..arrivey..'&returnJSON=true&returnGeometries=true&returnInstructions=true&timeout=60000&nPaths=1&clientVersion=4.0.0&options=AVOID_TRAILS%3At%2CALLOW_UTURNS%3At%2CAVOID_TOLL_ROADS"')
local waze=assert(io.popen('curl --referer https://www.waze.com "https://www.waze.com/row-RoutingManager/routingRequest?from=x%3A'..departx..'+y%3A'..departy..'&to=x%3A'..arrivex..'+y%3A'..arrivey..'&returnJSON=true&returnGeometries=true&returnInstructions=true&timeout=60000&nPaths=1&clientVersion=4.0.0&options=AVOID_TRAILS%3At%2CALLOW_UTURNS%3At%2CAVOID_TOLL_ROADS"'))
local infowaze = waze:read('*all')
waze:close()
local jsonTrajet = json:decode(infowaze)
--Noms des principales routes empruntées
routeName = jsonTrajet['response'][1]['route_name']
if routeName == nil then routeName="route non précisée" end
--Liste des routes empruntées
route = jsonTrajet['response']['results']
--Temps de trajet en secondes
routeTotalTimeSec = 0
--calcul du temps de trajet
for response,results in pairs(route) do
routeTotalTimeSec = routeTotalTimeSec + results['crossTime']
end
--Temps de trajet en minutes
routeTotalTimeMin = routeTotalTimeSec/60-((routeTotalTimeSec%60)/60)
-- Détermination des noms des routes employées
xtime = {}
route = jsonTrajet['response']['results']
voie = jsonTrajet['response']['streetNames']
for response,results in pairs(route) do
i = tonumber(results['street'])
if voie[i] == nil then voie[i] = "/ND" end
if xtime[i]==nil then xtime[i]=0 end
xtime[i]=xtime[i]+tonumber(results['crossTime'])
voir_les_logs(tostring(response).." "..results['crossTime'].." "..results['street'].." "..voie[i].." "..xtime[i])
end
i=0
j=1
chemin = {}
trajet = {}
-- Détermination des durées de parcours pour chacune des routes
for street in pairs(voie) do
if xtime[street] ~= nil then
upd=0
for i in ipairs(chemin) do
if chemin[i]==voie[street] then
trajet[i]=trajet[i]+xtime[street]
upd=1
end
end
if upd == 0 and xtime[street]~=nil and voie[street]~=nil then
voir_les_logs("voie[street]="..voie[street])
voir_les_logs("xtime[street]="..xtime[street])
voir_les_logs("j="..j)
chemin[j]=voie[street]
if xtime[street]~=nil then
trajet[j]=xtime[street]
else
trajet[j]=0
end
voir_les_logs("chemin["..tostring(j).."]="..chemin[j])
voir_les_logs("trajet["..tostring(j).."]="..trajet[j])
j=j+1
end
end
end
voie4T=0
voie5T=0
-- Recherche de deux routes les plus utilisées
for i in ipairs(chemin) do
voir_les_logs("chemin["..tostring(i).."]="..chemin[i])
voir_les_logs("trajet["..tostring(i).."]="..trajet[i])
if trajet[i]~=nil and chemin[i]~="/ND" then
if trajet[i] > voie4T then
voie4N=chemin[i]
voie4T=trajet[i]
elseif trajet[i] > voie5T then
voie5N=chemin[i]
voie5T=trajet[i]
end
end
end
voir_les_logs(voie4N.." "..voie5N)
routeName=voie4N.." "..voie5N
routeTotalTime = os.date("%H:%M", routeTotalTimeSec-3600)..' par  '..string.gsub(routeName, ' ', ' ')
commandArray[#commandArray+1]={['UpdateDevice'] =idx..'|0|' .. tostring(routeTotalTime)}
commandArray[#commandArray+1]={['UpdateDevice'] =idx_curve..'|0|' .. tostring(routeTotalTimeMin)}
commandArray['Variable:Trajet-retour'] = tostring(routeTotalTimeMin)
end
-- Recherche de deux routes les plus utilisées
for i in ipairs(chemin) do
voir_les_logs("chemin["..tostring(i).."]="..chemin[i])
voir_les_logs("trajet["..tostring(i).."]="..trajet[i])
if trajet[i]~=nil and chemin[i]~="/ND" then
if trajet[i] > voie4T then
voie4N=chemin[i]
voie4T=trajet[i]
elseif trajet[i] > voie5T then
voie5N=chemin[i]
voie5T=trajet[i]
end
end
end
voir_les_logs(voie4N.." "..voie5N)
routeName=voie4N.." "..voie5N
routeTotalTime = os.date("%H:%M", routeTotalTimeSec-3600)..' par  '..string.gsub(routeName, ' ', ' ')
commandArray[#commandArray+1]={['UpdateDevice'] =idx..'|0|' .. tostring(routeTotalTime)}
commandArray[#commandArray+1]={['UpdateDevice'] =idx_curve..'|0|' .. tostring(routeTotalTimeMin)}
commandArray['Variable:Trajet-retour'] = tostring(routeTotalTimeMin)
end
return commandArrayRe: [LUA] Durée de trajet avec Waze
D'après le lien généré dans les logs, il semblerait que les paramètres URL aient changé, car le serveur répond :
Il faudrait comprendre pourquoi l'adresse https://www.waze.com/row-RoutingManager/routingRequest?from=x%3A5.42549+y%3A45.78268&to=x%3A6.502913+y%3A45.788363&returnJSON=true&returnGeometries=true&returnInstructions=true&timeout=60000&nPaths=1&clientVersion=4.0.0&options=AVOID_TRAILS%3At%2CALLOW_UTURNS%3At%2CAVOID_TOLL_ROADS%22%3C n'est plus valide.
Donc derrière le script plante puisqu'il n'a pas les infos.{"error": "Error: No enum constant linqmap.routing.proto.RoutingAPI.RoutingOption.AVOID_TOLL_ROADS"<"}
Il faudrait comprendre pourquoi l'adresse https://www.waze.com/row-RoutingManager/routingRequest?from=x%3A5.42549+y%3A45.78268&to=x%3A6.502913+y%3A45.788363&returnJSON=true&returnGeometries=true&returnInstructions=true&timeout=60000&nPaths=1&clientVersion=4.0.0&options=AVOID_TRAILS%3At%2CALLOW_UTURNS%3At%2CAVOID_TOLL_ROADS%22%3C n'est plus valide.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Re: [LUA] Durée de trajet avec Waze
Salut,
Keros, ton erreur vient de la fin de ton url ? (erreur de c/c incluant un bout de balise code ?)
Keros, ton erreur vient de la fin de ton url ? (erreur de c/c incluant un bout de balise code ?)
Code : Tout sélectionner
"<"Re: [LUA] Durée de trajet avec Waze
Merci @pronoob, quand le forum s'y mets, ce n'est pas simple
L'url semble fonctionnelle : c'était les coordonnées GPS qui n'étaient pas valides.
Ce qui m'étonne dans le script, c'est qu'il y a deux façons de retrouver le nom des routes :
Je pense queroute = jsonTrajet['response']['results'] n'est pas bon et devrait avoir le [1] aussi.
L'url semble fonctionnelle : c'était les coordonnées GPS qui n'étaient pas valides.
Ce qui m'étonne dans le script, c'est qu'il y a deux façons de retrouver le nom des routes :
Code : Tout sélectionner
routeName = jsonTrajet['response'][1]['route_name']
route = jsonTrajet['response']['results']Je pense queroute = jsonTrajet['response']['results'] n'est pas bon et devrait avoir le [1] aussi.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
-
denis_brasseur
- Messages : 898
- Inscription : 24 déc. 2018, 17:05
- Localisation : (26)
Re: [LUA] Durée de trajet avec Waze
Le serveur répond
ce qui explique certainement cette adresse erronée.
SI l'on supprime ces caractères pour passer l'adresse dans le navigateur, on obtient bien un json exploitable.
Reste ensuite à savoir ce qui cloche dans le code, a part la fonction voir_les_logs qui retourne une valeur fantaisiste mais n'influe pas sur la suite.
à cause de l'adresse qui comporte des caractères qui n'ont pas lieu d'être à la fin{"error": "Error: No enum constant linqmap.routing.proto.RoutingAPI.RoutingOption.AVOID_TOLL_ROADS"<"}
La fonction voir_les_logs comporte encore"</font
Code : Tout sélectionner
print ("<font color='#f3031d'>".. s .."</font>")SI l'on supprime ces caractères pour passer l'adresse dans le navigateur, on obtient bien un json exploitable.
Reste ensuite à savoir ce qui cloche dans le code, a part la fonction voir_les_logs qui retourne une valeur fantaisiste mais n'influe pas sur la suite.
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Re: [LUA] Durée de trajet avec Waze
Chez moi, la commande <font color='#f3031d'></font> ne fonctionne pas dans les logs et s'affiche en brut dans la ligne de log. Et je pense qu'en faisant un copier/coller de la ligne sur le forum, la création d'url automatique prends également le </font dans l'URL : d'où l'erreur quand on essaye dans notre navigateur.
Mais comme tu dis Denis, il doit y avoir un autre truc qui cloche.
Mais comme tu dis Denis, il doit y avoir un autre truc qui cloche.
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
-
garycooper
- Messages : 453
- Inscription : 07 août 2017, 23:58
Re: [LUA] Durée de trajet avec Waze
J'ai rajouté [1] mais pas d'évolution. Toujours le même message d'erreur dans les logs.Je pense queroute = jsonTrajet['response']['results'] n'est pas bon et devrait avoir le [1] aussi.
-
garycooper
- Messages : 453
- Inscription : 07 août 2017, 23:58
Re: [LUA] Durée de trajet avec Waze
bonjour, à tous. Je continue de gratter mais je n'arrive toujours pas à m'en sortir ... Quand je rentre les coordonnées directement dans la ligne https, un explorateur me sort bien une extraction json (enfin, d'après ce que j'en comprends). Du coup, j'ai tenté de faire de même dans le script (en remplaçant les departx, departy, arriveex et arriveey par les coordonnées GPS) mais j'ai maintenant un nouveau code d'erreur, à priori par rapport à mon fichier "json.lua" :
Merci d'avance
Est-ce que quelqu'un qui utilise ce script avec succès pourrait partager son json.lua et son script (en supprimant ses coordonnées GPS, bien évidemment) ? Ou personne n'utilise ce script avec succès ?2021-11-09 16:53:00.698 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_waze_aller.lua: /home/pi/domoticz/scripts/lua/JSON.lua:383: html passed to JSON:decode(): <?xml version="1.0" encoding="UTF-8" standalone="no"?><error>Internal Error</error>
Merci d'avance
-
Chrominator
- Messages : 1042
- Inscription : 19 déc. 2015, 07:29
- Localisation : France
Re: [LUA] Durée de trajet avec Waze
Oui l'API fonctionne toujours, elle a un peu évolué au mois d'octobre, raison pour laquelle le script ne fonctionne plus.
Le JSON.lua n'est pas en cause, la dernière version fonctionne parfaitement.
La structure du json a été modifiée, ainsi que quelques noms de rubriques.
Sur la base du script publié ici, remplacer :
En faisant ces modifications, le script fonctionne de nouveau.
Version modifiée :
Bonne route ! 
Le JSON.lua n'est pas en cause, la dernière version fonctionne parfaitement.
La structure du json a été modifiée, ainsi que quelques noms de rubriques.
Sur la base du script publié ici, remplacer :
- ['response'] par ['response'][1]
- ['results'] par ['result']
- ['streetNames'] par ['street_name']
- ['crossTime'] par ['cross_time']
En faisant ces modifications, le script fonctionne de nouveau.
Version modifiée :
Code : Tout sélectionner
---------------------------------
-- Script de calcul de temps pour un trajet entre 2 coordonnées
-- Auteur : Neutrino
-- Date : 7 septembre 2015
-- Nécessite un capteur virtuel de type Text
-- source :
-- http://www.domo-blog.fr/info-trajet-waze-eedomus-version-raspberry/
---------------------------------
-- Modif Chrominator
--
-- 2016-01-30 : Remplacement des secondes du trajet par " mn"
-- Pas de détermination du temps de trajet les W-E et jours fériés
-- 2017-11-11 : Détermination du nom des routes principales (les plus longtemps parcourues) car routeName n'existe plus dans le JSON
--
-- 2021-11-10 : Mise à jour consécutive à des changements dans l'API (result, cross_time, street_name)
--
DEBUG=true
function voir_les_logs (s) -- nécessite la variable DEBUG
if DEBUG then
if s ~= nil then
print ("<font color='#f3031d'>".. s .."</font>")
else
print ("<font color='#f3031d'>aucune valeur affichable</font>")
end
end
end
commandArray={}
--import des fontions pour lire le JSON
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
--variables à modifier----------------
--idx du capteur
idx = '1051' -- Capteur de type texte pour afficher la durée du trajet et le nom de la principale route empruntée.
idx_curve = '1052' -- Capteur de type voltmetre pour archiver les temps de parcours calculés
-- y = latitude et x = longitude
--coordonnées de départ
departx="2.2903622"
departy="48.8582546"
--coordonnées d'arrivée
arrivex="5.501913"
arrivey="45.580363"
---récupère l'heure actuelle en minutes
time=os.time()
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))
maintenant=tonumber(hours*60+minutes)
-- Récupère le jour pour ne pas calculer de trajet les week-end.
-- Sunday = 0 - Saturday = 6
local weekday = os.date('%w')
---calcule du trajet entre 17h00 et 17h15
if (maintenant>=1020 and maintenant<= 1035 and weekday == Friday) or DEBUG then
-----------------------------------------
----------------------------------------------------------------
--Récupération du trajet et de sa durée en temps réel via WAZE--
----------------------------------------------------------------
voir_les_logs('curl --referer https://www.waze.com "https://www.waze.com/row-RoutingManager/routingRequest?from=x%3A'..departx..'+y%3A'..departy..'&to=x%3A'..arrivex..'+y%3A'..arrivey..'&returnJSON=true&returnGeometries=true&returnInstructions=true&timeout=60000&nPaths=1&clientVersion=4.0.0&options=AVOID_TRAILS%3At%2CALLOW_UTURNS%3At%2CAVOID_TOLL_ROADS"')
local waze=assert(io.popen('curl --referer https://www.waze.com "https://www.waze.com/row-RoutingManager/routingRequest?from=x%3A'..departx..'+y%3A'..departy..'&to=x%3A'..arrivex..'+y%3A'..arrivey..'&returnJSON=true&returnGeometries=true&returnInstructions=true&timeout=60000&nPaths=1&clientVersion=4.0.0&options=AVOID_TRAILS%3At%2CALLOW_UTURNS%3At%2CAVOID_TOLL_ROADS"'))
local infowaze = waze:read('*all')
waze:close()
local jsonTrajet = json:decode(infowaze)
--Noms des principales routes empruntées
routeName = jsonTrajet['response'][1]['route_name']
if routeName == nil then routeName="route non précisée" end
--Liste des routes empruntées
route = jsonTrajet['response'][1]['result']
--Temps de trajet en secondes
routeTotalTimeSec = 0
--calcul du temps de trajet
for response,results in pairs(route) do
routeTotalTimeSec = routeTotalTimeSec + results['cross_time']
end
--Temps de trajet en minutes
routeTotalTimeMin = routeTotalTimeSec/60-((routeTotalTimeSec%60)/60)
-- Détermination des noms des routes employées
xtime = {}
route = jsonTrajet['response'][1]['result']
voie = jsonTrajet['response'][1]['street_name']
for response,results in pairs(route) do
i = tonumber(results['street'])
if voie[i] == nil then voie[i] = "/ND" end
if xtime[i]==nil then xtime[i]=0 end
xtime[i]=xtime[i]+tonumber(results['cross_time'])
voir_les_logs(tostring(response).." "..results['cross_time'].." "..results['street'].." "..voie[i].." "..xtime[i])
end
i=0
j=1
chemin = {}
trajet = {}
-- Détermination des durées de parcours pour chacune des routes
for street in pairs(voie) do
if xtime[street] ~= nil then
upd=0
for i in ipairs(chemin) do
if chemin[i]==voie[street] then
trajet[i]=trajet[i]+xtime[street]
upd=1
end
end
if upd == 0 and xtime[street]~=nil and voie[street]~=nil then
voir_les_logs("voie[street]="..voie[street])
voir_les_logs("xtime[street]="..xtime[street])
voir_les_logs("j="..j)
chemin[j]=voie[street]
if xtime[street]~=nil then
trajet[j]=xtime[street]
else
trajet[j]=0
end
voir_les_logs("chemin["..tostring(j).."]="..chemin[j])
voir_les_logs("trajet["..tostring(j).."]="..trajet[j])
j=j+1
end
end
end
voie4T=0
voie5T=0
-- Recherche de deux routes les plus utilisées
for i in ipairs(chemin) do
voir_les_logs("chemin["..tostring(i).."]="..chemin[i])
voir_les_logs("trajet["..tostring(i).."]="..trajet[i])
if trajet[i]~=nil and chemin[i]~="/ND" then
if trajet[i] > voie4T then
voie4N=chemin[i]
voie4T=trajet[i]
elseif trajet[i] > voie5T then
voie5N=chemin[i]
voie5T=trajet[i]
end
end
end
voir_les_logs(voie4N.." "..voie5N)
routeName=voie4N.." "..voie5N
routeTotalTime = os.date("%H:%M", routeTotalTimeSec-3600)..' par  '..string.gsub(routeName, ' ', ' ')
commandArray[#commandArray+1]={['UpdateDevice'] =idx..'|0|' .. tostring(routeTotalTime)}
commandArray[#commandArray+1]={['UpdateDevice'] =idx_curve..'|0|' .. tostring(routeTotalTimeMin)}
commandArray['Variable:Trajet-retour'] = tostring(routeTotalTimeMin)
-- Recherche de deux routes les plus utilisées
for i in ipairs(chemin) do
voir_les_logs("chemin["..tostring(i).."]="..chemin[i])
voir_les_logs("trajet["..tostring(i).."]="..trajet[i])
if trajet[i]~=nil and chemin[i]~="/ND" then
if trajet[i] > voie4T then
voie4N=chemin[i]
voie4T=trajet[i]
elseif trajet[i] > voie5T then
voie5N=chemin[i]
voie5T=trajet[i]
end
end
end
voir_les_logs(voie4N.." "..voie5N)
routeName=voie4N.." "..voie5N
routeTotalTime = os.date("%H:%M", routeTotalTimeSec-3600)..' par  '..string.gsub(routeName, ' ', ' ')
commandArray[#commandArray+1]={['UpdateDevice'] =idx..'|0|' .. tostring(routeTotalTime)}
commandArray[#commandArray+1]={['UpdateDevice'] =idx_curve..'|0|' .. tostring(routeTotalTimeMin)}
commandArray['Variable:Trajet-retour'] = tostring(routeTotalTimeMin)
end
return commandArray
Dernière modification par Chrominator le 11 nov. 2021, 09:57, modifié 1 fois.
Un bon frein vaut mieux que deux sparadraps.
Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06