Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
-- chargement des modules
dofile('/home/pi/domoticz/scripts/lua/modules.lua')
--------------------------------------------
----------- Variables à éditer -------------
--------------------------------------------
--https://api.openweathermap.org/data/2.5/onecall?lat=45.6131965&lon=5.4592937&appid=12667c7ef8ee2e467cc74691ddc052c4&lang=fr&units=metric
local api = 'xxxxxxxxxxxxxxxxxxx' -- Remplacer par votre clé API
local lat = '45.6131965' -- Remplacer par ici votre latittude
local long = '5.4592937' -- Remplacer par votre longitude
--Sélectionner le chemin vers votre fichier JSON.lua en enlevant les dé commentant la ligne pour votre système d'exploitation
--json = (loadfile "/home/votrenomutilisé/domoticz/scripts/lua/JSON.lua")() -- For Linux
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- for PI
--json = (loadfile "/volume1/@appstore/domoticz/var/scripts/lua/JSON.lua")() -- For Syno
--------------------------------------------
---------- Fin variables à éditer ----------
--------------------------------------------
commandArray = {}
time=os.time()
-- Récupère l'heure actuelle.
local heure = os.date('%H:%M')
local debug = true
--recupere les minutes
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))
if minutes==20 then
-- L'appel et l'enregistrement des prévisions dans la variable jsonValeur
config=assert(io.popen('/usr/bin/curl "https://api.openweathermap.org/data/2.5/onecall?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric"'))
blocjson = config:read('*all')
config:close()
jsonValeur = json:decode(blocjson)
--------------------------------------------
---- Code à modifier selon vos besoins -----
--------------------------------------------
-- L'enregistrement des données souhaitées dans des variables (vous pouvez en ajouter autant que vous voulez)
--temp = jsonValeur.current.temp
--rose = jsonValeur.current.dew_point
--weather = jsonValeur.current.weather[1].description
--<debut Essai soleil
if (jsonValeur.current.weather[1].description=='ciel dégagé') then
commandArray['Variable:Soleil'] = '1'
Etat=jsonValeur.current.weather[1].description
print('Météo du jour ensoleillé : '..Etat)
else
commandArray['Variable:Soleil'] = '0'
Etat=jsonValeur.current.weather[1].description
print('Météo du jour couvert : '..Etat)
end
--Fin Essai soleil
--<debut Essai météo du jour
if (jsonValeur.current.weather[1].description=='ciel dégagé') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 20'
elseif (jsonValeur.current.weather[1].description=='pluie') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 10'
elseif (jsonValeur.current.weather[1].description=='couvert') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 30'
elseif (jsonValeur.current.weather[1].description=='nuageux') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 30'
elseif (jsonValeur.current.weather[1].description=='légères chutes de neige') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 40'
end
--Fin Essai Essai météo du jour
if (jsonValeur.daily[1].rain) then
rain = jsonValeur.daily[1].rain
else
rain = 0
end
if (jsonValeur.daily[2].rain) then
rain2 = jsonValeur.daily[2].rain
else
rain2 = 0
end
rain = jsonValeur.daily[1].rain
rain2 = jsonValeur.daily[2].rain
if rain ~= nil then
commandArray['Variable:Pluie-jour'] = tostring(rain)
print(getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 10'
else
commandArray['Variable:Pluie-jour'] = '0'
print(getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 20'
end
if rain2 ~= nil then
commandArray['Variable:Pluie-lendemain'] = tostring(rain2)
print(getDeviceName(406))
commandArray[getDeviceName(406)] ='Set Level: 10'
else
commandArray['Variable:Pluie-lendemain'] = '0'
print(getDeviceName(406))
commandArray[getDeviceName(406)] ='Set Level: 20'
end
--------------------------------------------
--------- Fin code à modifier -------------
--------------------------------------------
end
return commandArray
2022-04-05 07:20:01.472 Error: EventSystem: commandArray in script /home/pi/domoticz/scripts/lua/script_time_meteo.lua should only return ['string']='actionstring' or [integer]={['string']='actionstring'}
Hier, ca fonctionnait, mais plus aujourd'hui, donc j'imagine que c'est les accents de "dégagé" qui le gène, mais je ne sais pas comment faire.
if rain ~= nil then
commandArray['Variable:Pluie-jour'] = tostring(rain)
print("Pluie du jour bis : " ..rain)
print(getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 10'
else
commandArray['Variable:Pluie-jour'] = '0'
print("Pluie du jour bis 2 : " ..rain)
print(getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 20'
end
Donc l'erreur est surement dans ce bloc.
Ce qui est étrange, c'est que ce bloc était présent dans le fichier et fonctionnait très bien jusqu'à hier.
Quand j'ai rajouté la partie du haut, ca fonctionnait aussi.
if (jsonValeur.daily[1].rain) then
rain = jsonValeur.daily[1].rain
else
rain = 0
end
if (jsonValeur.daily[2].rain) then
rain2 = jsonValeur.daily[2].rain
else
rain2 = 0
end
rain = jsonValeur.daily[1].rain
rain2 = jsonValeur.daily[2].rain
Sinon, tu as des prints qui s'affichent dans les logs ?
Ce serait intéressant d'avoir des print() différents en fonction de chaque condition et si possible avec les valeurs des variables utilisées.
-- chargement des modules
dofile('/home/pi/domoticz/scripts/lua/modules.lua')
--------------------------------------------
----------- Variables à éditer -------------
--------------------------------------------
--https://api.openweathermap.org/data/2.5/onecall?lat=45.6131965&lon=5.4592937&appid=12667c7ef8ee2e467cc74691ddc052c4&lang=fr&units=metric
local api = 'xxxxxxxxxxxxxxxxxxxxx -- Remplacer par votre clé API
local lat = '45.6131965' -- Remplacer par ici votre latittude
local long = '5.4592937' -- Remplacer par votre longitude
--Sélectionner le chemin vers votre fichier JSON.lua en enlevant les dé commentant la ligne pour votre système d'exploitation
--json = (loadfile "/home/votrenomutilisé/domoticz/scripts/lua/JSON.lua")() -- For Linux
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- for PI
--json = (loadfile "/volume1/@appstore/domoticz/var/scripts/lua/JSON.lua")() -- For Syno
--------------------------------------------
---------- Fin variables à éditer ----------
--------------------------------------------
commandArray = {}
-- Récupère les IDX des widgets.
idxjour = '404'
idxdemain = '406'
time=os.time()
-- Récupère l'heure actuelle.
local heure = os.date('%H:%M')
local debug = true
--recupere les minutes
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))
if minutes==13 then
-- L'appel et l'enregistrement des prévisions dans la variable jsonValeur
config=assert(io.popen('/usr/bin/curl "https://api.openweathermap.org/data/2.5/onecall?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric"'))
blocjson = config:read('*all')
config:close()
jsonValeur = json:decode(blocjson)
--------------------------------------------
---- Code à modifier selon vos besoins -----
--------------------------------------------
-- L'enregistrement des données souhaitées dans des variables (vous pouvez en ajouter autant que vous voulez)
--temp = jsonValeur.current.temp
--rose = jsonValeur.current.dew_point
--weather = jsonValeur.current.weather[1].description
--<debut Essai soleil
if (jsonValeur.current.weather[1].description=='ciel dégagé') then
commandArray['Variable:Soleil'] = '1'
Etat=jsonValeur.current.weather[1].description
print('Météo du jour ensoleillé : '..Etat)
else
commandArray['Variable:Soleil'] = '0'
Etat=jsonValeur.current.weather[1].description
print('Météo du jour couvert : '..Etat)
end
--Fin Essai soleil
--<debut Essai météo du jour
if (jsonValeur.current.weather[1].description=='peu nuageux') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 20'
elseif (jsonValeur.current.weather[1].description=='partiellement nuageux') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 20'
elseif (jsonValeur.current.weather[1].description=='ciel dégagé') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 20'
elseif (jsonValeur.current.weather[1].description=='pluie') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 10'
elseif (jsonValeur.current.weather[1].description=='couvert') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 30'
elseif (jsonValeur.current.weather[1].description=='nuageux') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 30'
elseif (jsonValeur.current.weather[1].description=='légères chutes de neige') then
print(getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 40'
end
--Fin Essai Essai météo du jour
--Récupération précipitation jour et lendemain
if (jsonValeur.daily[1].rain) then
rain = jsonValeur.daily[1].rain
print("Pluie du jour : " ..rain)
else
rain = 0
print("Pluie du jour 2 " ..rain)
end
if (jsonValeur.daily[2].rain) then
rain2 = jsonValeur.daily[2].rain
print("Pluie du lendemain : " ..rain2)
else
rain2 = 0
print("Pluie du lendemain 2 : " ..rain2)
end
--Fin Récupération précipitation jour et lendemain
--MAJ widget précipitation jour et lendemain
if rain ~= nil then
commandArray['Variable:Pluie-jour'] = tostring(rain)
print("Pluie du jour bis : " ..rain)
print(getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 10'
else
commandArray['Variable:Pluie-jour'] = '0'
print("Pluie du jour bis 2 : " ..rain)
print(getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 20'
end
if rain2 ~= nil then
commandArray['Variable:Pluie-lendemain'] = tostring(rain2)
print(getDeviceName(406))
commandArray[getDeviceName(406)] ='Set Level: 10'
else
commandArray['Variable:Pluie-lendemain'] = '0'
print(getDeviceName(406))
commandArray[getDeviceName(406)] ='Set Level: 20'
end
--Fin MAJ widget précipitation jour et lendemain
--Pluiejour = uservariables['Pluie-jour']
--Pluielendemain = uservariables['Pluie-lendemain']
--commandArray[#commandArray+1]={['UpdateDevice'] =idxjour..'|0|' .. tostring(Pluiejour)}
--commandArray[#commandArray+1]={['UpdateDevice'] =idxdemain..'|0|' .. tostring(Pluielendemain)}
--------------------------------------------
--------- Fin code à modifier -------------
--------------------------------------------
end
return commandArray
2022-04-05 19:13:00.888 Status: LUA: Pluie du jour bis : 0
2022-04-05 19:13:00.889 Status: LUA: 0
Si je suis ton code, ça correspondrait à la ligne
if rain ~= nil then
commandArray['Variable:Pluie-jour'] = tostring(rain) print("Pluie du jour bis : " ..rain)
print(getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 10'
else
commandArray['Variable:Pluie-jour'] = '0'
print("Pluie du jour bis 2 : " ..rain)
print(getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 20'
end
if rain2 ~= nil then
commandArray['Variable:Pluie-lendemain'] = tostring(rain2) print(getDeviceName(406))
commandArray[getDeviceName(406)] ='Set Level: 10'
else
commandArray['Variable:Pluie-lendemain'] = '0'
print(getDeviceName(406))
commandArray[getDeviceName(406)] ='Set Level: 20'
end
Cela voudrait dire que getDeviceName(406) retourne 0 ce qui pourrait faire le défaut après.
Tu pourrais modifier tes print() pour éviter d'afficher seulement une valeur dont on n'est pas sur de la correspondance. Par exemple print("IDX 406 : "..getDeviceName(406))
-- chargement des modules
dofile('/home/pi/domoticz/scripts/lua/modules.lua')
--------------------------------------------
----------- Variables à éditer -------------
--------------------------------------------
--https://api.openweathermap.org/data/2.5/onecall?lat=45.6131965&lon=5.4592937&appid=12667c7ef8ee2e467cc74691ddc052c4&lang=fr&units=metric
local api = 'xxxxxxxxxxxxxxxxxxxxxxxxxx' -- Remplacer par votre clé API
local lat = '45.6131965' -- Remplacer par ici votre latittude
local long = '5.4592937' -- Remplacer par votre longitude
--Sélectionner le chemin vers votre fichier JSON.lua en enlevant les dé commentant la ligne pour votre système d'exploitation
--json = (loadfile "/home/votrenomutilisé/domoticz/scripts/lua/JSON.lua")() -- For Linux
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- for PI
--json = (loadfile "/volume1/@appstore/domoticz/var/scripts/lua/JSON.lua")() -- For Syno
--------------------------------------------
---------- Fin variables à éditer ----------
--------------------------------------------
commandArray = {}
-- Récupère les IDX des widgets.
idxjour = '404'
idxdemain = '406'
time=os.time()
-- Récupère l'heure actuelle.
local heure = os.date('%H:%M')
local debug = true
--recupere les minutes
minutes=tonumber(os.date('%M',time))
hours=tonumber(os.date('%H',time))
if minutes==55 then
-- L'appel et l'enregistrement des prévisions dans la variable jsonValeur
config=assert(io.popen('/usr/bin/curl "https://api.openweathermap.org/data/2.5/onecall?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric"'))
blocjson = config:read('*all')
config:close()
jsonValeur = json:decode(blocjson)
--------------------------------------------
---- Code à modifier selon vos besoins -----
--------------------------------------------
-- L'enregistrement des données souhaitées dans des variables (vous pouvez en ajouter autant que vous voulez)
--temp = jsonValeur.current.temp
--rose = jsonValeur.current.dew_point
--weather = jsonValeur.current.weather[1].description
--<debut Essai soleil
if (jsonValeur.current.weather[1].description=='ciel dégagé') then
commandArray['Variable:Soleil'] = '1'
Etat=jsonValeur.current.weather[1].description
print('Météo du jour ensoleillé : '..Etat)
else
commandArray['Variable:Soleil'] = '0'
Etat=jsonValeur.current.weather[1].description
print('Météo du jour couvert : '..Etat)
end
--Fin Essai soleil
--<debut Essai météo du jour
if (jsonValeur.current.weather[1].description=='peu nuageux') then
print("IDX 591 : "..getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 20'
elseif (jsonValeur.current.weather[1].description=='partiellement nuageux') then
print("IDX 591 : "..getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 20'
elseif (jsonValeur.current.weather[1].description=='ciel dégagé') then
print("IDX 591 : "..getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 20'
elseif (jsonValeur.current.weather[1].description=='pluie') then
print("IDX 591 : "..getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 10'
elseif (jsonValeur.current.weather[1].description=='couvert') then
print("IDX 591 : "..getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 30'
elseif (jsonValeur.current.weather[1].description=='nuageux') then
print("IDX 591 : "..getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 30'
elseif (jsonValeur.current.weather[1].description=='légères chutes de neige') then
print("IDX 591 : "..getDeviceName(591))
commandArray[getDeviceName(591)] ='Set Level: 40'
end
--Fin Essai Essai météo du jour
--Récupération précipitation jour et lendemain
if (jsonValeur.daily[1].rain) then
rain = jsonValeur.daily[1].rain
print("Pluie du jour : " ..rain)
else
rain = 0
print("Pluie du jour 2 : " ..rain)
end
if (jsonValeur.daily[2].rain) then
rain2 = jsonValeur.daily[2].rain
print("Pluie du lendemain : " ..rain2)
else
rain2 = 0
print("Pluie du lendemain 2 : " ..rain2)
end
--Fin Récupération précipitation jour et lendemain
--MAJ widget précipitation jour et lendemain
if rain ~= 0 then
commandArray['Variable:Pluie-jour'] = tostring(rain)
print("Pluie du jour bis : " ..rain)
print("IDX 404 : "..getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 10'
else
commandArray['Variable:Pluie-jour'] = '0'
print("Pluie du jour bis 2 : " ..rain)
print("IDX 404 : "..getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 20'
end
if rain2 ~= 0 then
commandArray['Variable:Pluie-lendemain'] = tostring(rain2)
print("Pluie du lendemain bis : " ..rain2)
print("IDX 406 : "..getDeviceName(406))
commandArray[getDeviceName(406)] ='Set Level: 10'
else
commandArray['Variable:Pluie-lendemain'] = '0'
print("Pluie du lendemain bis 2 : " ..rain2)
print("IDX 406 : "..getDeviceName(406))
commandArray[getDeviceName(406)] ='Set Level: 20'
end
--Fin MAJ widget précipitation jour et lendemain
--Pluiejour = uservariables['Pluie-jour']
--Pluielendemain = uservariables['Pluie-lendemain']
--commandArray[#commandArray+1]={['UpdateDevice'] =idxjour..'|0|' .. tostring(Pluiejour)}
--commandArray[#commandArray+1]={['UpdateDevice'] =idxdemain..'|0|' .. tostring(Pluielendemain)}
--------------------------------------------
--------- Fin code à modifier -------------
--------------------------------------------
end
return commandArray
--Récupération précipitation jour et lendemain
if (jsonValeur.daily[1].rain) then
rain = jsonValeur.daily[1].rain
print("Pluie du jour : " ..rain)
else
rain = 0
print("Pluie du jour 2 : " ..rain)
end
if (jsonValeur.daily[2].rain) then
rain2 = jsonValeur.daily[2].rain
print("Pluie du lendemain : " ..rain2)
else
rain2 = 0
print("Pluie du lendemain 2 : " ..rain2)
end
--Fin Récupération précipitation jour et lendemain
--MAJ widget précipitation jour et lendemain
if rain ~= nil then
commandArray['Variable:Pluie-jour'] = tostring(rain)
print("Pluie du jour bis : " ..rain)
print("IDX 404 : "..getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 10'
else
commandArray['Variable:Pluie-jour'] = '0'
print("Pluie du jour bis 2 : " ..rain)
print("IDX 404 : "..getDeviceName(404))
commandArray[getDeviceName(404)] ='Set Level: 20'
end
if rain2 ~= nil then
commandArray['Variable:Pluie-lendemain'] = tostring(rain2)
print("Pluie du lendemain bis : " ..rain2)
print("IDX 406 : "..getDeviceName(406))
commandArray[getDeviceName(406)] ='Set Level: 10'
else
commandArray['Variable:Pluie-lendemain'] = '0'
print("Pluie du lendemain bis 2 : " ..rain2)
print("IDX 406 : "..getDeviceName(406))
commandArray[getDeviceName(406)] ='Set Level: 20'
end
--Fin MAJ widget précipitation jour et lendemain
Sachant que le problème est sur le debut, j'ai copié la 2eme partie, coller en haut et juste remplacer les rain2 par rain et les 406 par 404, donc c'est exactement la même syntaxe, et j'ai toujours l'erreur '2022-04-06 09:27:01.536 Error: EventSystem: commandArray in script /home/pi/domoticz/scripts/lua/script_time_meteo-arrosage.lua should only return ['string']='actionstring' or [integer]={['string']='actionstring'}
Je pige pas pourquoi ca bloque sur le debut du script et pas la fin alors que c'est identique...
J'y comprends plus rien, je viens juste de modifier le texte de mes print, et ca fonctionne... et je parle bien des textes entre "", pas des variables....
Me reste maintenant le problème avec le début du script qui fonctionne sur le même principe, mais le widget ne se met pas à jour....
Remets nous ton script complet avec les logs correspondant.
Dans ton dernier exemple, tu remets print("IDX 591 : "..getDeviceName(591)) dans toutes les conditions. Ce n'est pas utile : Mets ce print une fois avant le If Cela te permettra de vérifier que c'est le bon widget qui sera changé. rajoute également un print pour savoir quelle est la valeur de weather.
Concernant les print() dans tes conditions, là ce serait de mettre des print(''peu nuageux'), print('partiellement nuageux'), comme ça tu sais quelle condition est remplie.
Tu peux même rajouter un else à la fin pour afficher un print('Condition non reconnue').
Plus ton débogage sera détaillé, plus tu arriveras à comprendre ce qui ce passe dans ton script.