Page 19 sur 26

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

Publié : 14 oct. 2021, 16:31
par Koala45
ah super merci beaucoup :)

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

Publié : 30 oct. 2021, 09:56
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

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

Publié : 30 oct. 2021, 12:09
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.

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

Publié : 30 oct. 2021, 12:31
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;"

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

Publié : 30 oct. 2021, 13:40
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.

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

Publié : 30 oct. 2021, 13:55
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.

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

Publié : 30 oct. 2021, 16:36
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.

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

Publié : 30 oct. 2021, 19:25
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.

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

Publié : 09 nov. 2021, 16:58
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

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

Publié : 10 nov. 2021, 07:33
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é 2513 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 ! :)