[LUA] Durée de trajet avec Waze

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

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

Message par Chrominator »

Merci.
Il y a une petite imperfection (au moins ;) ):
Quand j'affiche Péage dans le widget, ça ne veux pas dire que l'itinéraire passe par un péage mais que les routes à péage sont prises en compte.
Faudra que j'y pense, ce serait mieux de mettre péage si on a réellement à emprunter un péage.

Allez, ne pas remettre au lendemain....

Voilà le script modifié qui fait ça : :D

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

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 = '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="5.364967"	-- Mairie de Marseille
departy="43.304719"

-- Mairie de Bruxelles
arrivex="4.351390224944818"
arrivey="50.84638814089876"


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

-- 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"] = false,			-- 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],'
	}

function remove_garbage(json_string, garbage)
	print(type(json_string))
	print(type(garbage))
	infowaze, nb = string.gsub(json_string, garbage, " ")
	print(nb)
	return infowaze
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 17h00 et 17h15
if (maintenant>=1020 and maintenant<= 1035 and weekday == 5) 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(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 = ""
	for option in pairs(vehicleType) do
		if vehicleType[option] then option_list = option_list .. "vehicleType=" .. option .. "&" end
	end
	-- supprime le & ou la virgule 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
	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
	voir_les_logs("RouteName="..routeName)
	--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
		if version_id == 1 then xtime[i]=xtime[i]+tonumber(results['cross_time']) else xtime[i]=xtime[i]+tonumber(results['crossTime']) end
	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
	via_vehicule="voiture"
	for index in pairs(vehicleType) do
		if vehicleType[index] then via_vehicule=string.lower(index) end
	end
	routeName=routeName .. " en " .. string.lower(via_vehicule)
	routeName=string.gsub(routeName, "motorcycle", "moto")				-- Traduction en français
	-- Si on peut prendre les autoroutes à péage, on le signale dans le Widget
	if not waze_options["AVOID_TOLL_ROADS"] and toll_roads then routeName = routeName .. " - Péage" end
	routeTotalTime = os.date("%H:%M", routeTotalTimeSec-3600)..'&nbsppar&nbsp '..string.gsub(routeName, ' ', '&nbsp')
	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
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
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

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

Message par garycooper »

Testé et approuvé !
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

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

Message par Chrominator »

Pour ceux qui en veulent, une nouvelle version :
  • 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)
Screenshot 2021-12-10 at 09-30-56 Domoticz_dev.png
Screenshot 2021-12-10 at 09-30-56 Domoticz_dev.png (17.91 Kio) Consulté 3562 fois

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=true
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 = '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		
-- Mairie de Bruxelles
arrivex="4.351390224944818"
arrivey="50.84638814089876"

---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 17h00 et 17h15
if (maintenant>=1020 and maintenant<= 1035 and weekday == 5) 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
Screenshot 2021-12-10 at 10-11-45 Domoticz_dev.png
Screenshot 2021-12-10 at 10-11-45 Domoticz_dev.png (17.82 Kio) Consulté 3559 fois
Screenshot 2021-12-10 at 10-13-27 Domoticz_dev.png
Screenshot 2021-12-10 at 10-13-27 Domoticz_dev.png (17.73 Kio) Consulté 3559 fois
Screenshot 2021-12-10 at 10-15-17 Domoticz_dev.png
Screenshot 2021-12-10 at 10-15-17 Domoticz_dev.png (17.62 Kio) Consulté 3559 fois
Screenshot 2021-12-10 at 10-18-59 Domoticz_dev.png
Screenshot 2021-12-10 at 10-18-59 Domoticz_dev.png (17.42 Kio) Consulté 3558 fois
Screenshot 2021-12-10 at 10-19-34 Domoticz_dev.png
Screenshot 2021-12-10 at 10-19-34 Domoticz_dev.png (17.86 Kio) Consulté 3558 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
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

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

Message par garycooper »

Apparemment ça a encore changé ... J'ai testé sur 2 itinéraires qui fonctionnaient jusqu'à hier et maintenant, message d'erreur dans les logs ... Juste quand je prépare mon weekend !
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

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

Message par Chrominator »

En effet, le json qui revient de Waze est parfois incomplet (sur les grandes distances) et du coup on ne peut pas le décoder.
J'imagine que Google ne va pas laisser ça en plan trop longtemps.

Exemple ici, la chaine n'est pas terminée par une double quote sur la dernière ligne et mon navigateur (Firefox) rouspète après ce résultat json.

Screenshot 2021-12-17 at 04-42-48 https www waze com.png
Screenshot 2021-12-17 at 04-42-48 https www waze com.png (12.01 Kio) Consulté 3489 fois
Screenshot 2021-12-17 at 04-52-10 https www waze com.png
Screenshot 2021-12-17 at 04-52-10 https www waze com.png (2.68 Kio) Consulté 3489 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
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

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

Message par garycooper »

C'est revenu dans l'ordre :roll:
jjlf
Messages : 43
Inscription : 04 févr. 2018, 20:58

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

Message par jjlf »

Merci @Chrominator pour l'update du script.
Au passage, à quoi sert le nouveau device "idx_duree" ?
Quel type de sensor pour le visualiser ?
Merci
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

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

Message par Chrominator »

Le capteur idx_duree est un custom sensor.
C'est une demande de garycooper qui voulait un widget et un graphique en heures/minutes plutôt qu'en minutes via le widget voltmètre.
Screenshot 2021-12-22 at 10-49-41 Domoticz_dev.png
Screenshot 2021-12-22 at 10-49-41 Domoticz_dev.png (19.71 Kio) Consulté 3393 fois
chart.png
chart.png (102.21 Kio) Consulté 3393 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
pierrotori
Messages : 821
Inscription : 29 févr. 2016, 12:11

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

Message par pierrotori »

Est ce que ce script existe en dzvents ?
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

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

Message par Chrominator »

A ma connaissance non, il est en lua pour Domoticz.
Quel serait le bénéfice offert par une version en DzVents ?
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
Répondre