[LUA] Durée de trajet avec Waze
Re: [LUA] Durée de trajet avec Waze
L'avantage de DzVents sera l'appel de l'URL en asynchrone.
Le script d'analyse du JSON ne s'exécute que si le site répond et que le JSON est correct.
Le script d'analyse du JSON ne s'exécute que si le site répond et que le JSON est correct.
Re: [LUA] Durée de trajet avec Waze
Bonjour,
je vois que ce topic est endormie depuis qqs annones et je souhaiterai savoir si il y a des maj pour faire fonctionner ce script?
Actuellement je suis sur la version de Domoticz 2024.7 et en créant un nouveau script LUA et les devices qu' il faut, il ne se passe rien. Même pas de message d erreur...
Doit on créer le script ainsi que le dossier Json?
Je suis un peu perdu. Possible de faire un petit tuto rapide?
je vois que ce topic est endormie depuis qqs annones et je souhaiterai savoir si il y a des maj pour faire fonctionner ce script?
Actuellement je suis sur la version de Domoticz 2024.7 et en créant un nouveau script LUA et les devices qu' il faut, il ne se passe rien. Même pas de message d erreur...
Doit on créer le script ainsi que le dossier Json?
Je suis un peu perdu. Possible de faire un petit tuto rapide?
Re: [LUA] Durée de trajet avec Waze
Salut, chez moi il fonctionne très bien sur la dernière version de Domoticz, voici le script que j'utilise :
C'est à mettre dans Configuration/Plus d'options/Evenements
Ajout nouvel évènement : LUA/Time
Puis copie/colle ca en modifiant les coordonnées GPS souhaitées.
C'est à mettre dans Configuration/Plus d'options/Evenements
Ajout nouvel évènement : LUA/Time
Puis copie/colle ca en modifiant les coordonnées GPS souhaitées.
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
--
-- 2021-12-08 : Retour à l'ancienne forme du json par Waze - Adaptation en fonction de la version identifiée et à l'aide de pcall()
-- Ajout de critères de contournement (routes non bitumées, demi-tours, péages, ferries, covoiturage, voies express et intersections difficiles)
-- et du type de véhicule utilisé (defaut Voiture, alternative TAXI ou MOTORBIKE)
-- Suppression des lignes de réponse json inutiles pour le calcul de la durée de trajet
-- Ajout du terme Péage dans le widget si l'itinéraire utilise des voies payantes
-- Remplacement des voies Avenue ou Boulevard par leurs abbréviations (Widget plus clair)
-- Calcul et affichage de la distance à parcourir dans le widget
-- Affichage conditionnel des informations du widget (distance, véhicule, péage)
--
DEBUG=false
local RUN=true
function voir_les_logs (s) -- nécessite la variable DEBUG
if DEBUG then
if s ~= nil then
print (s)
else
print ("aucune valeur affichable")
end
end
end
commandArray={}
if RUN == false then return commandArray end
--import des fontions pour lire le JSON
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")()
--variables à modifier----------------
--idx du capteur
idx = '386' -- Capteur de type texte pour afficher la durée du trajet et le nom de la principale route empruntée.
idx_curve = '387' -- Capteur de type voltmetre pour archiver les temps de parcours calculés
idx_duree = '544' -- Affiche un graphique en heure/minutes
--coordonnées de départ
departx="-1.XXX"
departy="4X.XXXX"
--coordonnées d'arrivée
arrivex="-1.YYY"
arrivey="4Y.YYYYYY"
---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)
-- Paramètres du contenu du widget
display_distance = true -- commande l'affichage de la distance
display_vehicule = true -- commande l'affichage du type de véhicule
display_toll_roads = true -- commande l'affichage de routes à péage
local distance = 0
-- options pour l'API Waze
-- Mettre la valeur à true ou false en fonction de ce que vous voulez
local waze_options = {
["AVOID_TRAILS"] = true, -- Eviter les routes non bitumées
["AVOID_LONG_TRAILS"] = true, -- Eviter les longues sections non bitumées
["ALLOW_UTURNS"] = false, -- Autoriser les demi-tours
["AVOID_TOLL_ROADS"] = true, -- Eviter les routes à péage
["AVOID_FERRIES"] = true, -- Eviter les ferries et les bacs
["AVOID_PRIMARIES"] = false, -- Eviter les autoroutes urbaines et les voies express
["AVOID_DANGEROUS_TURNS"] = false, -- Eviter les intersections difficiles
["ADD_HOV_ROUTES"] = false -- Utiliser les voies de covoiturage
}
local vehicleType = { -- Un seul choix à true - si tous à false = voiture (private si on veut le spécifier)
["MOTORCYCLE"] = false,
["TAXI"] = false
}
local subscription = "*" -- CRIT'AIR - A déterminer ce qu'il faut indiquer si on a pas de vignette CRIT'AIR
local useless_keys = {
'"altStreets":null,',
'"tiles":null,',
'"clientIds":null,',
'"laneType":null,',
'"areas":null,',
'"requiredPermits":null,',
'"clientLaneSet":null,',
'"roadSign":null,',
'"detour":null,',
'"naiveRoute":null,',
'"detourSavingsNoRt":null,',
'"detourRoute":null,',
'"naiveRouteFullResult",:null',
'"detourRouteFullResult":null,',
'"instruction":null,',
'"additionalInstruction":null,',
'"knownDirection":true,',
'"penalty":[0-9],',
'"roadType":[0-9],',
'"isToll":false,',
'"useHovLane":false,',
'"attributes":[0-9],',
'"lane":"WHOLE_SEGMENT",',
'"avoidStatus":"OPEN",',
'"isInvalid":false,',
'"isBlocked":false,',
'"detourSavings":[0-9],',
'"mergeOffset":[0-9],'
}
-- Substitution de certains noms de voies pour diminuer la taille dans le widget
local substitute_keys = {
['Avenue'] = 'Av.',
['Boulevard'] = 'Bd'
}
local distance = 0
function remove_garbage(json_string, garbage)
infowaze, nb = string.gsub(json_string, garbage, " ")
return infowaze
end
local function round(num, dec)
return ( math.floor( num * 10^dec ) / 10^dec )
end
-- 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 6h40 et 10h00
if (((maintenant>=400 and maintenant<= 600) or (maintenant>600 and maintenant % 20 == 0)) and weekday ~= 6 and weekday ~= 0) or DEBUG then
-----------------------------------------
----------------------------------------------------------------
--Récupération du trajet et de sa durée en temps réel via WAZE--
----------------------------------------------------------------
-- Préparation de l'url
url = "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&nPaths=1&clientVersion=4.0.0&subscription=\"" .. tostring(subscription) .. "\""
-- vérification des options
local option_list = ""
for option in pairs(vehicleType) do
if vehicleType[option] then option_list = option_list .. "&vehicleType=" .. option .. "&" end
end
for option in pairs(waze_options) do
if waze_options[option] then option_list = option_list .. option .. ":t," else option_list = option_list .. option .. ":f," end
end
local vehicule = ""
-- supprime le & supplémentaire
option_list = option_list:sub(1, -2)
voir_les_logs('curl --referer https://www.waze.com '.. '"' .. url .. '&options=' .. option_list..'"')
local waze=assert(io.popen('curl --referer https://www.waze.com '.. '"' .. url .. '&options=' .. option_list..'"'))
local infowaze = waze:read('*all')
waze:close()
for index in pairs(useless_keys) do
infowaze = remove_garbage(infowaze, useless_keys[index])
end
for index in pairs(substitute_keys) do
infowaze, nb = string.gsub(infowaze, index, substitute_keys[index])
end
local out = assert(io.open("infowaze", "wb"))
out:write(infowaze)
assert(out:close())
local version_id = nil
print(type(infowaze))
local jsonTrajet = json:decode(infowaze)
-- identification de la version de l'API Waze
if pcall(function () routeName = jsonTrajet['response'][1]['route_name'] end) then
version_id=1
print("Version Waze #1 identifiée - nouvelle version de novembre 2021")
end
if pcall(function () routeName = jsonTrajet['response']['route_name'] end) then
version_id=0
print("Version Waze #0 identifiée - Ancienne version antérieure à novembre 2021")
end
if version_id == nil then print("Version Waze non reconnue ou trajet trop long - Sortie") return commandArray end
--Noms des principales routes empruntées
if version_id == 1 then routeName = jsonTrajet['response'][1]['route_name'] else routeName = jsonTrajet['response']['routeName'] end
if routeName == nil then routeName="route non précisée" end
--Liste des routes empruntées
if version_id == 1 then route = jsonTrajet['response'][1]['result'] else route = jsonTrajet['response']['results'] end
--Temps de trajet en secondes
routeTotalTimeSec = 0
--calcul du temps de trajet
for response,results in pairs(route) do
if version_id == 1 then routeTotalTimeSec = routeTotalTimeSec + results['cross_time'] else routeTotalTimeSec = routeTotalTimeSec + results['crossTime'] end
end
--Temps de trajet en minutes
routeTotalTimeMin = routeTotalTimeSec/60-((routeTotalTimeSec%60)/60)
-- Détermination des noms des routes employées
xtime = {}
if version_id == 1 then route = jsonTrajet['response'][1]['result'] else route = jsonTrajet['response']['results'] end
if version_id == 1 then voie = jsonTrajet['response'][1]['street_name'] else voie = jsonTrajet['response']['streetNames'] end
toll_roads = nil
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
if results['isToll'] and toll_roads == nil then toll_roads = true end
distance = distance + results['length']
if version_id == 1 then xtime[i]=xtime[i]+tonumber(results['cross_time']) else xtime[i]=xtime[i]+tonumber(results['crossTime']) end
--[[
if version_id == 1 then
voir_les_logs(tostring(response).." "..results['cross_time'].." "..results['street'].." "..voie[i].." "..xtime[i])
else
voir_les_logs(tostring(response).." "..results['crossTime'].." "..results['street'].." "..voie[i].." "..xtime[i])
end
--]]
end
voir_les_logs("total distance" .. tostring(distance/1000) .. " Km")
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
via_vehicule="voiture"
for index in pairs(vehicleType) do
if vehicleType[index] then via_vehicule=string.lower(index) end
end
via_vehicule=string.gsub(via_vehicule, "motorcycle", "moto") -- Traduction en français
voir_les_logs(via_vehicule)
routeTotalTime = ""
if display_distance then routeTotalTime = string.format('%d', round(distance/1000, 0)) .. ' km en ' end
routeTotalTime = routeTotalTime .. os.date("%H:%M", routeTotalTimeSec-3600) .. '\' par  '.. string.gsub(routeName, ' ', ' ')
if display_vehicule then routeTotalTime = routeTotalTime .. " en " .. via_vehicule end
-- Si on peut prendre les autoroutes à péage, on le signale dans le Widget
if display_toll_roads and not waze_options["AVOID_TOLL_ROADS"] and toll_roads then routeTotalTime = routeTotalTime .. " - Péage" end
--routeTotalTime = string.format('%d', round(distance/1000, 0)) .. ' km en ' .. os.date("%H:%M", routeTotalTimeSec-3600)..' par  '..string.gsub(routeName, ' ', ' ')
voir_les_logs(routeTotalTime)
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 commandArrayRe: [LUA] Durée de trajet avec Waze
Merci pour votre réponse, c est exactement ce que j ai fait.
Et par curiosité j ai basculé debug en true pour voir si j ai des messages d erreur.
Du coup ca fonctionne mais je me retrouve toute les 5 minutes avec des tartines de données de navigation dans le log.
Et quand je désactive le debug ca ne marche plus...
Vous me confirmez bien que chez vous ca fonctionne sans activer le debug?
Et par curiosité j ai basculé debug en true pour voir si j ai des messages d erreur.
Du coup ca fonctionne mais je me retrouve toute les 5 minutes avec des tartines de données de navigation dans le log.
Et quand je désactive le debug ca ne marche plus...
Vous me confirmez bien que chez vous ca fonctionne sans activer le debug?
Re: [LUA] Durée de trajet avec Waze
non j'ai bien debug=false
Re: [LUA] Durée de trajet avec Waze
Regarde bien cette ligne c'est celle qui active la récupération de donnée :
Donc si tu met en debug ca va récupèrera toutes les 5 min et ca bypass la vérification de la plage horaire. Il faut donc laisser debug=false et mettre la plage horaire désirée.
Moi je l'ai activé que le matin entre 6h40 (6*60+40) et 10h (10*60+0) sauf samedi (6) et dimanche (0) pour le trajet du matin
Pour le trajet du retour (crée avec un 2ieme évènement et le même script) j'ai ceci :
La formule du 'maintenant' c'est heure*60 + minutes.
Code : Tout sélectionner
---calcul du trajet entre 6h40 et 10h00
if (((maintenant>=400 and maintenant<= 600) or (maintenant>600 and maintenant % 20 == 0)) and weekday ~= 6 and weekday ~= 0) or DEBUG then ...Moi je l'ai activé que le matin entre 6h40 (6*60+40) et 10h (10*60+0) sauf samedi (6) et dimanche (0) pour le trajet du matin
Pour le trajet du retour (crée avec un 2ieme évènement et le même script) j'ai ceci :
Code : Tout sélectionner
---calcul du trajet entre 15h40 et 20h00
if (((maintenant>=940 and maintenant<= 1200) or (maintenant > 1200 and maintenant % 20 == 0)) and weekday ~= 6 and weekday ~= 0) or DEBUG then ...Re: [LUA] Durée de trajet avec Waze
J'ai récupéré ton script et ça fonctionne merci. Par contre il faut faire un script par trajet?
Re: [LUA] Durée de trajet avec Waze
oui ou alors bidouiller le script pour qu'il prennent en compte 2 trajets (c'est pas bien compliqué mais j'ai eu la flemme de faire la modif)
Moi j'en ai fait 2 car plus simple et rapide.
Moi j'en ai fait 2 car plus simple et rapide.
Re: [LUA] Durée de trajet avec Waze
Merci pour tout.
Je vais un peu m amuser avec chat GPT pour faire des modifs.
Comme je travail en 3 huits, mes heures de départ sont irrégulières.
J ai un sélecteur virtuel qui commute en fonction si je bosse de matin, d aprèm ou de nuit.
Du coup je vais essayer de faire démarrer l affichage du trajet en fonction de ce sélecteur.
(bon ok en partant à 5h du matin, il y a peu de chance qu' il y ai des embouteillages...)
Je vais un peu m amuser avec chat GPT pour faire des modifs.
Comme je travail en 3 huits, mes heures de départ sont irrégulières.
J ai un sélecteur virtuel qui commute en fonction si je bosse de matin, d aprèm ou de nuit.
Du coup je vais essayer de faire démarrer l affichage du trajet en fonction de ce sélecteur.
(bon ok en partant à 5h du matin, il y a peu de chance qu' il y ai des embouteillages...)
Re: [LUA] Durée de trajet avec Waze
Bonjour
excusez moi de relancer ce sujet mais est que l'api waze fonctionne ?
J'ai l'erreur suivante et je ne sais pas quoi en faire :
j'ai l'impression que ce n'est plus l'adresse : https://www.waze.com/row-RoutingManager ... uest?from=
mais je ne sais pas par quoi remplacer...
Une idée ?
Merci de votre aide en tout cas !
excusez moi de relancer ce sujet mais est que l'api waze fonctionne ?
J'ai l'erreur suivante et je ne sais pas quoi en faire :
2025-01-10 20:04:01.510 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_waze.lua: /home/pi/domoticz/scripts/lua/JSON.lua:836: HTML passed to JSON:decode(): <html>
2025-01-10 20:04:01.510 <head><title>503 Service Temporarily Unavailable</title></head>
2025-01-10 20:04:01.510 <body>
2025-01-10 20:04:01.510 <center><h1>503 Service Temporarily Unavailable</h1></center>
2025-01-10 20:04:01.510 <hr><center>nginx</center>
2025-01-10 20:04:01.510 </body>
2025-01-10 20:04:01.510 </html>
2025-01-10 20:04:01.510
j'ai l'impression que ce n'est plus l'adresse : https://www.waze.com/row-RoutingManager ... uest?from=
mais je ne sais pas par quoi remplacer...
Une idée ?
Merci de votre aide en tout cas !
Dernière modification par Keros le 10 janv. 2025, 22:54, modifié 1 fois.
Raison : Ajout les balises pour les logs. Merci de lire la section Bien utiliser le forum
Raison : Ajout les balises pour les logs. Merci de lire la section Bien utiliser le forum