Salut, chez moi il fonctionne très bien sur la dernière version de Domoticz, voici le script que j'utilise :
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) .. '\' par  '.. string.gsub(routeName, ' ', ' ')
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)..' par  '..string.gsub(routeName, ' ', ' ')
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