Page 20 sur 26
Re: [LUA] Durée de trajet avec Waze
Publié : 11 nov. 2021, 00:35
par garycooper
Merci pour ta réponse chrominator. J'ai copié le json que tu as mis en lien (plus récent que la version que j'avais), j'ai recopié ton script avec mes coordonnées, supprimé un [1] qui s'était glissé en trop
dans
routeName = jsonTrajet['response'][1][1]['route_name']
Le script s'est exécuté correctement une première fois puis maintenant j'ai 2 type de message d'erreur suivant :
2021-11-11 00:35:10.457 Error: EventSystem: Warning!, lua script /home/pi/domoticz/scripts/lua/script_time_waze_aller.lua has been running for more than 10 seconds
2021-11-11 00:35:15.947 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_waze_aller.lua: /home/pi/domoticz/scripts/lua/JSON.lua:836: HTML passed to JSON:decode(): <html>
2021-11-11 00:35:15.947 <head><title>502 Bad Gateway</title></head>
2021-11-11 00:35:15.947 <body>
2021-11-11 00:35:15.947 <center><h1>502 Bad Gateway</h1></center>
2021-11-11 00:35:15.947 <hr><center>nginx</center>
2021-11-11 00:35:15.947 </body>
2021-11-11 00:35:15.947 </html>
2021-11-11 00:35:15.947
ou
2021-11-11 00:27:06.666 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_waze_aller.lua: /home/pi/domoticz/scripts/lua/JSON.lua

/home/pi/domoticz/scripts/lua/JSON.lua

Lua script execution exceeds maximum number of lines
A toute fin utile, ma configuration est la suivante :
Raspberry Pi 4
Version Domoticz : 2021.1
Build Hash: 8547c5b7e
Compile Date: 2021-04-17 17:29:11
dzVents Version: 3.1.7
Python Version: 3.7.3 (default, Jan 22 2021, 20:04:44) [GCC 8.3.0]
Re: [LUA] Durée de trajet avec Waze
Publié : 11 nov. 2021, 10:08
par Chrominator
Désolé pour le [1] supplémentaire, j'ai modifié mon post.
Pour la première erreur 502 Bad Gateway, ça arrive de temps en temps, c'est le serveur de Waze qui est saturé et qui ne peut pas répondre ; il répondra la fois suivante.
Pour la seconde que je n'ai jamais eu, il semblerait que ce soit lié au nombre de lignes exécutées par Lua dans Domoticz, soit disant trop nombreuses.
Est-ce que tu aurais une boucle dans ton script qui durerait un peu longtemps si la condition tarde à venir ?
Les sujets que j'ai trouvé sur Internet incriminent à chaque fois une boucle.
Re: [LUA] Durée de trajet avec Waze
Publié : 11 nov. 2021, 17:41
par garycooper
J'ai essayé de mettre le point d'arrivée sur une plus grande route que le point précis où je voulais aller mais pas d'amélioration, j'ai toujours le message
2021-11-11 17:41:06.279 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_waze_aller.lua: /home/pi/domoticz/scripts/lua/JSON.lua

/home/pi/domoticz/scripts/lua/JSON.lua

Lua script execution exceeds maximum number of lines
. Ca ne recalcule pas l'itinéraire à chaque minute ou en tout cas ça ne met pas à jour le device text. Par contre, ça semble mettre à jour le device type "tension" dans lequel il y a le nombre de minutes de trajet.
Un autre souci, le temps notifié est beaucoup plus long que quand je le fais sur waze. Là ça m'indique 2h25 alors que par waze, ça me dit 1h49.
Re: [LUA] Durée de trajet avec Waze
Publié : 11 nov. 2021, 19:16
par Chrominator
J'ai une piste :
D'abord le plus facile, pour la durée.
La requête (qui n'est pas documentée à ma connaissance) indique en option
AVOID_TOLL_ROADS ce qui signifie en français
éviter les routes à péage.
Ça peut expliquer la différence de durée
D'autre part, la requête charrie un tas de truc inutiles à mon avis (mais sans doc c'est difficile de s'y retrouver).
J'ai essayé un itinéraire partant de l'Oise jusqu'à un ponton à St Mandrier dans le Var : 73754 lignes de json à décoder, et la fameux message d'erreur qui indique trop de lignes...
En modifiant la requête et en ne laissant que la demande de json, c'est aussi fonctionnel, plus rapide et plus concis ; seulement 19992 lignes de json et là ça passe sur mon pi (avec péage), j'obtiens une durée de 7:32 dans le widget de type texte.
Essaie de remplacer la ligne
Code : Tout sélectionner
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"'))
par
Code : Tout sélectionner
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&timeout=60000&clientVersion=4.0.0&options=AVOID_TRAILS%3At%2CALLOW_UTURNS"'))
Avec ça tes 2h de route devraient être de la rigolade.
Au fait, je ne connais pas la planification de cette détermination d'itinéraire dans ton Domoticz, mieux vaut éviter une fréquence trop élevée afin que Monsieur Waze ne se fâche pas et prenne des contre-mesures qui aboutiraient pour nous à une privation de ce service.
Genre un calcul toutes les 15 mn, ça paraît raisonnable.
Re: [LUA] Durée de trajet avec Waze
Publié : 11 nov. 2021, 21:56
par garycooper
Bien joué Chrominator ! hormis des logs à rallonge

- LogWaze.JPG (84.66 Kio) Consulté 2733 fois
le script fonctionne parfaitement ! Est-ce qu'il est possible de modifier le device type "tension" de façon à retirer l'unité (V) et éventuellement passé le temps en heure plutôt qu'en minutes ?
J'ai tenté de remplacer
Code : Tout sélectionner
commandArray[#commandArray+1]={['UpdateDevice'] =idx_curve..'|0|' .. tostring(routeTotalTimeMin)}
par
Code : Tout sélectionner
commandArray[#commandArray+1]={['UpdateDevice'] =idx_curve..'|0|' .. tostring(routeTotalTime)}
mais ça ne me met que le nombre d'heures et pas les minutes.
Enfin, je me suis rajouté l'envoi d'une notif telegram avec le temps de route :
Code : Tout sélectionner
commandArray[#commandArray+1]={['SendNotification']='#Le temps de route pour rentrer chez vous est de '.. os.date("!%X",routeTotalTimeSec) ..'. Bon retour chez vous !##1#0#telegram'}
Re: [LUA] Durée de trajet avec Waze
Publié : 12 nov. 2021, 04:45
par Chrominator
Pour la trace dans les logs, tu auras sans doute remarqué que ça venait de la ligne
au début du script. En remplaçant par
tu n'auras plus la trace, mais le script sera assujetti à la planification via la ligne
Code : Tout sélectionner
---calcule du trajet entre 17h00 et 17h15
if (maintenant>=1020 and maintenant<= 1035 and weekday == Friday) or DEBUG then
Pour ce qui est de la représentation graphique du temps de trajet, on peut maintenant utiliser des "custom sensors" qui n'existaient pas à l'époque.
Tu peux créer un capteur de type
custom sensor avec comme nom d'axe par exemple
Durée.
Ensuite tu ajoutes ou mieux tu remplaces l'idx du capteur de type tension par celui du custom sensor (idx_duree dans mon exemple).
Pour mettre à jour ce capteur, la syntaxe est la suivante :
Code : Tout sélectionner
commandArray[#commandArray+1]={['UpdateDevice'] =idx_duree..'|0|' .. tostring(os.date("%H.%M", routeTotalTimeSec-3600))}
Çà fera une belle courbe comme celle là :

- Screenshot 2021-11-12 at 04-40-43 Domoticz_dev.png (57.42 Kio) Consulté 2700 fois
Au passage, j'ignore pourquoi, le script que j'avais récupéré
sur ton post duplique une partie des lignes, inutilement.
Ci-dessous une version épuré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)
-- Ajout d'un custom sensor représentant la durée en heures/minutes
--
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
idx_duree = '1061' -- Affiche un graphique en heure/minutes
-- y = latitude et x = longitude
--coordonnées de départ
departx="2.2944990547869546"-- Tour Eiffel à Paris
departy="48.85859381443764"
--coordonnées d'arrivée -- Ponton du Président à Saint Mandrier (83)
arrivex="5.924039882530613"
arrivey="43.078865356176664"
---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&timeout=60000&clientVersion=4.0.0&options=AVOID_TRAILS%3At%2CALLOW_UTURNS"'))
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[#commandArray+1]={['UpdateDevice'] =idx_duree..'|0|' .. tostring(os.date("%H.%M", routeTotalTimeSec-3600))}
commandArray['Variable:Trajet-retour'] = tostring(routeTotalTimeMin)
end
return commandArray
Re: [LUA] Durée de trajet avec Waze
Publié : 12 nov. 2021, 10:50
par garycooper
Merci ! J'ai mis à jour avec ta dernière version et je confirme que ça fonctionne parfaitement. Seul "défaut" observé : dans le custom sensor, si la durée de trajet est de 1h50, ça affiche 1.5h Ca peut prêter à confusion en laissant penser à 1h30 plutôt qu'1h50. Mais personnellement, ça me va.
Merci et bravo pour ce script !
Re: [LUA] Durée de trajet avec Waze
Publié : 13 nov. 2021, 02:52
par Chrominator
Content que ça te rende service.
Ce n'est pas mon script mais celui de
Neutrino, que j'ai adapté en fonction des évolutions de l'API.
Les abscisses des graphiques de Domoticz sont toujours le temps, les ordonnées sont numériques.
A ma connaissance, pas moyen d'utiliser des ordonnées qui soient au format horaire HH:MM comme tu l'aurais certainement voulu.
Re: [LUA] Durée de trajet avec Waze
Publié : 26 nov. 2021, 23:03
par garycooper
La commande à heure fixe ne fonctionnait pas. Il y fallait remplacer
local weekday = os.date('%w')
par
local weekday = os.date("%w")
Il fallait également mettre le jour en numérique et non pas en lettres.
De même, je ne trouvais pas très pratique de compter les minutes pour lancer le script. Du coup j'ai plutôt mis une consigne d'heure. Le script modifié (avec notification Telegram) devient donc :
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)
-- Ajout d'un custom sensor représentant la durée en heures/minutes
-- 2022-11-26 : MàJ G@rycooper pour heure et jour de lancement du script + notification Telegram
--
DEBUG=false
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 = '121' -- Capteur de type voltmetre pour archiver les temps de parcours calculés
idx_duree = '120' -- Affiche un graphique en heure/minutes
-- y = latitude et x = longitude
--coordonnées de départ
departx="2.2944990547869546"-- Tour Eiffel à Paris
departy="48.85859381443764"
--coordonnées d'arrivée -- Ponton du Président à Saint Mandrier (83)
arrivex="5.924039882530613"
arrivey="43.078865356176664"
---récupère l'heure actuelle en minutes
time=os.time()
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))
maintenant=os.date("%H:%M")
-- Récupère le jour pour ne pas calculer de trajet les week-end.
-- Sunday = 0 - Saturday = 6
local weekday = os.date("%w")
---calcul du trajet à 17h00
if ((maintenant=='17:00') and (otherdevices['Vacances']=='On') and (weekday == '5')) 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&timeout=60000&clientVersion=4.0.0&options=AVOID_TRAILS%3At%2CALLOW_UTURNS"'))
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[#commandArray+1]={['SendNotification']='#Le temps de route pour rejoindre votre destination est de '.. os.date("!%X",routeTotalTimeSec) ..' en passant par '..tostring (routeName) ..'. Passez un bon week-end !##1#0#telegram'}
commandArray[#commandArray+1]={['UpdateDevice'] =idx_duree..'|0|' .. tostring(os.date("%H.%M", routeTotalTimeSec-3600))}
commandArray['Variable:Trajet-retour'] = tostring(routeTotalTimeMin)
end
return commandArray
Bonne route !
Re: [LUA] Durée de trajet avec Waze
Publié : 27 nov. 2021, 10:25
par Chrominator
Pour info, les deux notations que tu montres de weekday sont absolument équivalentes en lua.