[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.
plouf34
Messages : 111
Inscription : 04 déc. 2016, 18:33

Re: Durée de trajet avec Waze

Message par plouf34 »

Bonjour
Qqun peut redonner la procédure d’install complète pour afficher 2 trajets (Luna, Json,...) pour un domoticz sur Synology?
KingOfIce
Messages : 28
Inscription : 02 juil. 2018, 11:42

Re: Durée de trajet avec Waze

Message par KingOfIce »

Dim33 a écrit : 07 déc. 2018, 22:06
KingOfIce a écrit : 06 déc. 2018, 21:03
Dim33 a écrit : 01 sept. 2018, 09:20 Bonjour,

Avec la dernière version de Domoticz, le script m'affiche une erreur : attempt to index local 'jsonTrajet' (a nil value).

Cette ligne de code est incriminée : routeName = jsonTrajet['response']['routeName']

Code : Tout sélectionner

...
   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"'))
...
   

Une idée ? Personne n'a le pb avec la dernière version stable de Domoticz ?

Merci.
Hello, idem pour moi :( T'as trouvé la raison ?
Le pb ne provient pas du script mais de Waze .... l'erreur devrait disparaître d'elle même.
Le problème semble surtout provenir de domoticz sur Syno... (et + probablement du "io.popen")
Je l'ai testé de plusieurs manières mais rien à faire ! Du coup, j'ai mis la commande curl dans un shell cronné (avec output du json dans un fichier : -o monfichier.json) et je viens lire ce json dans le script lua avec un simple io.open('monfichier.json') et ça fonctionne bien.
A creuser... (problème peut-être déjà connu mais rien trouvé pour l'instant)
Dim33
Messages : 209
Inscription : 29 janv. 2017, 23:19

Re: Durée de trajet avec Waze

Message par Dim33 »

Ce script a tourné sur un Syno puis sur un NUC. J'ai eu l'erreur une fois sur le NUC objet de mon dernier post (01/09), depuis l'erreur n'ait jamais réapparu.
Aucun pb sur Syno.
NUC sous Ubuntu Server / RFXCom / Domoticz Version: 2020.2
Dim33
Messages : 209
Inscription : 29 janv. 2017, 23:19

Re: Durée de trajet avec Waze

Message par Dim33 »

Datawolf a écrit : 09 déc. 2018, 09:54 Bien sur que ça tourne le weekend. Jusqu'au if weekday ~= 0 et çà sort. ;)
Pour ma part, le calcul du trajet est calculé et affiché le weekend.
NUC sous Ubuntu Server / RFXCom / Domoticz Version: 2020.2
Datawolf
Messages : 273
Inscription : 03 avr. 2018, 13:51

Re: Durée de trajet avec Waze

Message par Datawolf »

Pas chez moi.
Wolfen38
Messages : 1983
Inscription : 19 oct. 2017, 14:49

Re: Durée de trajet avec Waze

Message par Wolfen38 »

Pareil chez moi, 7j/7
Wolfen38
Messages : 1983
Inscription : 19 oct. 2017, 14:49

Re: Durée de trajet avec Waze

Message par Wolfen38 »

Salut,

Mon scipt fonctionnait bien, et depuis 15j j'ai cette erreur "Error updating variable Trajet-retour: Not a valid integer"

Vous voyez ce qui a pu se passer ?

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

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 = '146'				-- Capteur de type texte pour afficher la durée du trajet et le nom de la principale route empruntée.
idx_curve = '149'		-- Capteur de type voltmetre pour archiver les temps de parcours calculés
-- y = latitude et x = longitude
-- exemple pour paris : 
-- departx="2.2903622"
-- departy="48.8582546"
--coordonnées de départ
departx="4.924234"
departy="45.772608"
--coordonnées d'arrivée
arrivex="5.453485"
arrivey="45.614734"

---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 16h00 et 16h30 sauf W-E et jours fériés
--
if (maintenant>=960 and maintenant<= 990 and uservariables["jf"] == "false" and weekday ~= 6 and weekday ~= 0 and weekday ~= 5) 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']['routeName']
	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

if (maintenant>=715 and maintenant<= 725 and uservariables["jf"] == "false" 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']['routeName']
	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


return commandArray
jjlf
Messages : 43
Inscription : 04 févr. 2018, 20:58

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

Message par jjlf »

Bonjour le script ne fonctionne plus depuis début octobre.
Après quelques recherches j'ai trouvé (l'API Waze à changé légèrement) :

Il faut remplacer :
jsonTrajet['response']['routeName']
par
jsonTrajet['response'][1]['route_name']

jsonTrajet['response']['results']
par
jsonTrajet['response'][1]['result']

jsonTrajet['response']['streetNames']
par
jsonTrajet['response'][1]['street_name']

results['crossTime']
par
results['cross_time']
Dernière modification par jjlf le 12 oct. 2021, 20:42, modifié 1 fois.
alacran
Messages : 80
Inscription : 12 sept. 2016, 10:05

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

Message par alacran »

Super merci.

Juste une petite correction, il ne faut pas remplacer :

"jsonTrajet['response']['results']
par
['response'][1]['result']"

Mais

"jsonTrajet['response']['results']
par
jsonTrajet['response'][1]['result']"

Ceux qui, comme moi on copier/coller bêtement s'en rendront compte :lol:
jjlf
Messages : 43
Inscription : 04 févr. 2018, 20:58

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

Message par jjlf »

Effectivement mauvais copié collé de ma part désolé ;)
Répondre