[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.
Koala45
Messages : 46
Inscription : 28 mai 2015, 19:54

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

Message par Koala45 »

ah super merci beaucoup :)
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

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

Message par garycooper »

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 message d'erreur suivant :
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)
La ligne 76 correspond à

Code : Tout sélectionner

	for response,results in pairs(route) do
et le script complet est le suivant (j'ai changé mes coordonnées latitude et longitude pour le forum) :

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)..'&nbsppar&nbsp '..string.gsub(routeName, ' ', '&nbsp')
	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)..'&nbsppar&nbsp '..string.gsub(routeName, ' ', '&nbsp')
	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
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

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 :
{"error": "Error: No enum constant linqmap.routing.proto.RoutingAPI.RoutingOption.AVOID_TOLL_ROADS&quot;&lt;"}
Donc derrière le script plante puisqu'il n'a pas les infos.

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
pronoob
Messages : 43
Inscription : 16 oct. 2021, 18:16

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

Message par pronoob »

Salut,

Keros, ton erreur vient de la fin de ton url ? (erreur de c/c incluant un bout de balise code ?)

Code : Tout sélectionner

&quot;&lt;"
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

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 :

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
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

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

Message par denis_brasseur »

Le serveur répond
{"error": "Error: No enum constant linqmap.routing.proto.RoutingAPI.RoutingOption.AVOID_TOLL_ROADS&quot;&lt;"}
à cause de l'adresse qui comporte des caractères qui n'ont pas lieu d'être à la fin
"</font
La fonction voir_les_logs comporte encore

Code : Tout sélectionner

print ("<font color='#f3031d'>".. s .."</font>")
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.
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

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

Message par Keros »

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.
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
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

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

Message par garycooper »

Je pense queroute = jsonTrajet['response']['results'] n'est pas bon et devrait avoir le [1] aussi.
J'ai rajouté [1] mais pas d'évolution. Toujours le même message d'erreur dans les logs.
garycooper
Messages : 453
Inscription : 07 août 2017, 23:58

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

Message par garycooper »

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" :
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>
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 ?

Merci d'avance
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

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

Message par Chrominator »

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 :
  • ['response'] par ['response'][1]
  • ['results'] par ['result']
  • ['streetNames'] par ['street_name']
  • ['crossTime'] par ['cross_time']
Ce script contient un "end" supplémentaire à la ligne 148 qu'il faut supprimer.
Capture d’écran 2021-11-10 075012.png
Capture d’écran 2021-11-10 075012.png (25.38 Kio) Consulté 2512 fois
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)..'&nbsppar&nbsp '..string.gsub(routeName, ' ', '&nbsp')
	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)..'&nbsppar&nbsp '..string.gsub(routeName, ' ', '&nbsp')
	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
Bonne route ! :)
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
Répondre