Page 23 sur 26

Re: [LUA] Durée de trajet avec Waze

Publié : 23 déc. 2021, 10:32
par Neutrino
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.

Re: [LUA] Durée de trajet avec Waze

Publié : 26 oct. 2024, 14:30
par Olivierxp
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?

Re: [LUA] Durée de trajet avec Waze

Publié : 26 oct. 2024, 17:04
par jjlf
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.

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) .. '\'&nbsppar&nbsp '.. string.gsub(routeName, ' ', '&nbsp')
	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)..'&nbsppar&nbsp '..string.gsub(routeName, ' ', '&nbsp')
	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 commandArray

Re: [LUA] Durée de trajet avec Waze

Publié : 26 oct. 2024, 19:41
par Olivierxp
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?

Re: [LUA] Durée de trajet avec Waze

Publié : 26 oct. 2024, 20:46
par jjlf
non j'ai bien debug=false

Re: [LUA] Durée de trajet avec Waze

Publié : 26 oct. 2024, 20:52
par jjlf
Regarde bien cette ligne c'est celle qui active la récupération de donnée :

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

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 ...
La formule du 'maintenant' c'est heure*60 + minutes.

Re: [LUA] Durée de trajet avec Waze

Publié : 27 oct. 2024, 01:12
par Olivierxp
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

Publié : 27 oct. 2024, 01:15
par jjlf
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.

Re: [LUA] Durée de trajet avec Waze

Publié : 27 oct. 2024, 15:27
par Olivierxp
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...)

Re: [LUA] Durée de trajet avec Waze

Publié : 10 janv. 2025, 20:10
par daland
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 :
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 !