Dans les logs j'ai ça
mais j'ai aussi l'erreur2021-01-24 18:35:03.772 Status: LUA: [Meteo] Le 01/25/21 a 05:00:00, il fera -2.66 degres et la meteo prevoit chutes de neige.
2021-01-24 18:35:03.772 Status: LUA: [Meteo] MAJ capteur station meteo 2 : -3.07 C |75 % |1004 hPa
2021-01-24 18:35:03.772 Status: LUA: [Meteo] MAJ capteur vent 3 : -3.07|-9.46 C ; 5.14|5.14 m/s SW
2021-01-24 18:35:03.772 Status: LUA: [Meteo] MAJ capteur pluie 4 : 0 mm
2021-01-24 18:35:03.772 Status: LUA: [Meteo] MAJ capteur UV 5 : 0
2021-01-24 18:35:03.772 Status: LUA: [Meteo] MAJ capteur neige 30 : 3.7 mm
et le capteur "neige" n'est pas mis à jour.021-01-24 18:36:00.951 Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_meteo.lua: /home/pi/domoticz/scripts/lua/script_time_meteo.lua:155: attempt to index a nil value (field 'snow')
La ligne 155 est celle-ci :
Code : Tout sélectionner
somme = somme + jsonValeur.hourly[1].snow["1h"] --Même principe.
Code : Tout sélectionner
local function log(p_message)
-- Decommenter la ligne du dessous pour afficher les logs / Commenter pour ne pas afficher les logs
print("[Meteo] " .. p_message)
end
local scriptName = 'Meteo'
local scriptVersion = 'V2.0'
local time = os.date("*t") -- Si vous souhaitez exécuté ce script toutes les X min
local start_hour = '06:00' -- Si vous souhaitez exécuté ce script tous les jours à 6h
local actual_hour = os.date("%H:%M")
local statmetDeviceIdx = 2 -- EXEMPLE 3 - 1) Idx de votre dispositif Temperature+Humidite+Barometre
local vtDeviceIdx = 3 -- EXEMPLE 3 - 2) Idx de votre dispositif Vent
local rainDeviceIdx = 4 -- EXEMPLE 3 - 3) Idx de votre dispositif Precipitations
local uvDeviceIdx = 5 -- EXEMPLE 3 - 4) Idx de votre dispositif UV
local snowDeviceIdx = 30 -- EXEMPLE 3 - 5) Idx de votre dispositif Neige
local douzeHeurespluieDeviceIdx = 31
local douzeHeuresneigeDeviceIdx = 32
--------------------------------------------
----------- Variables à éditer -------------
--------------------------------------------
local api = 'xxxxxxxxxxxxxxxxxxxx' -- Remplacer par votre cle API
local lat = 'xx.xxxxxxxxx' -- Remplacer par ici votre latittude
local long = 'x.xxxxxxxx' -- Remplacer par votre longitude
--Sélectionner le chemin vers votre fichier JSON.lua en décommentant la ligne pour votre système d'exploitation
json = (loadfile "/home/pi/domoticz/scripts/lua/JSON.lua")() -- For PI
--json = (loadfile "/volume1/@appstore/domoticz/var/scripts/lua/JSON.lua")() -- For Syno
--json = (loadfile "/home/votrenomutilisé/domoticz/scripts/lua/JSON.lua")() -- For Linux
--------------------------------------------
---------- Fin variables à éditer ----------
--------------------------------------------
commandArray = {}
log(scriptName.." "..scriptVersion.." - "..actual_hour)
-- Les script_time sont exécutés toute les minutes par Domoticz
-- Limite de l'API : 1000 appels/jour, il y a 1440 minutes/jour
-- A modifier si vous souhaitez toutes les 5, 10, 30, ... minutes (ici 25 minutes)
if (time.min % 1)==0 then -- pour exécuter le script toutes les X min
--if actual_hour==start_hour then -- pour exécuter le script à heure fixe
-- 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 -----
--------------------------------------------
-- EXEMPLE 1 - Temps Actuel
-- L'enregistrement des donnees souhaitees 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
-- L'utilisation des donnees (ici j'ecris une ligne dans le LOG de DomoticZ)
msg = 'Il fait '..temp..' degres et la meteo indique '..weather..' avec un point de rose a '..rose..' degres.'
log(msg)
---------------------------------------------
-- EXEMPLE 2 - Temps dans X heures
-- le [12] signifie dans 12h e modifier selon l'heure d'appel du script
temp_demain = jsonValeur.hourly[12].temp
weather_demain = jsonValeur.hourly[12].weather[1].description
-- Code pour afficher et convertir la date et l'heure de la prevision
time_prevision = jsonValeur.hourly[12].dt
heure_prevision = (os.date("%x a %X", time_prevision))
msg = 'Le '..heure_prevision..', il fera '..temp_demain..' degres et la meteo prevoit '.. weather_demain..'.'
log(msg)
--------------------------------------------
-- EXEMPLE 3 -
-- dans Materiel cree un capteur virtuel Dummy que vous appelez comme vous voulez
-- 1) Creer un capteur virtuel Temp + humidite + barometre et renseignez en haut de ce script pour "statmetDeviceIdx"
-- 2) Creer un capteur virtuel Vent+Temperature+Refroidissement et renseignez en haut de ce script pour "local vtrDeviceIdx"
-- 3) Creer un capteur virtuel Precipitations et renseignez en haut de ce script pour "local rainDeviceIdx"
-- 4) Creer un capteur virtuel UV et renseignez en haut de ce script pour "local uvDeviceIdx"
-- 5) Creer un capteur virtuel Precipitations pour la neige et renseignez en haut de ce script pour "local snowRainDeviceIdx"
temp = jsonValeur.current.temp
tempFeels = jsonValeur.current.feels_like
windSpeed = jsonValeur.current.wind_speed
windSpeed2 = windSpeed*10 -- je ne sais pas pourquoi Domoticz divise la valeur de winSpeed par 10 !?
--windGust = jsonValeur.current.wind_gust -- Ne fonctionne pas ??
windGust = windSpeed
windGust2 = windGust*10
windDirection = jsonValeur.current.wind_deg
--rain = jsonValeur.current.rain -- Ne fonctionne pas ??
rain = jsonValeur.daily[1].rain
UVIndex = jsonValeur.current.uvi
pressionAtm = jsonValeur.current.pressure
humidity = jsonValeur.current.humidity
clouds = jsonValeur.current.clouds
snow = jsonValeur.daily[1].snow
-- 1) MAJ du capteur station meteo
commandArray[statmetDeviceIdx] = {['UpdateDevice'] = statmetDeviceIdx..'|0|'..temp..';'..humidity..';0;'..pressionAtm..';0'}
log('MAJ capteur station meteo '..statmetDeviceIdx..' : '..temp..' C |'..humidity..' % |'..pressionAtm..' hPa')
-- 2) MAJ du capteur Virtuel de Vent
local function quadrants(degrees)
local quadrants = {"NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"}
if degrees > 348.75 or degrees <= 11.25 then
return "N"
else
local index = tonumber(math.floor((degrees - 11.25) / 22.5)+1)
return quadrants[index]
end
end
local direction = quadrants(windDirection)
commandArray[vtDeviceIdx] = { ['UpdateDevice'] = vtDeviceIdx..'|0|'..windDirection..';'..tostring(direction)..';'..windSpeed2..';'..windGust2..';'..temp..';'..tempFeels }
log('MAJ capteur vent '..vtDeviceIdx..' : '..temp..'|'..tempFeels..' C ; '..windSpeed..'|'..windGust..' m/s '..direction)
-- 3) MAJ du capteur de pluie
if (jsonValeur.daily[1].rain) then
rain = jsonValeur.daily[1].rain
else
rain = 0
end
commandArray[rainDeviceIdx] = { ['UpdateDevice'] = rainDeviceIdx..'|1|0;'..rain }
log('MAJ capteur pluie '..rainDeviceIdx..' : '..rain..' mm')
-- 4) MAJ du capteur d'UV
commandArray[uvDeviceIdx] = { ['UpdateDevice'] = uvDeviceIdx..'|1|'..UVIndex..';0' }
log('MAJ capteur UV '..uvDeviceIdx..' : '..UVIndex)
-- 5) MAJ du capteur de neige
if (jsonValeur.daily[1].snow) then
snow = jsonValeur.daily[1].snow
else
snow = 0
end
commandArray[snowDeviceIdx] = { ['UpdateDevice'] = snowDeviceIdx..'|1|0;'..rain }
log('MAJ capteur neige '..snowDeviceIdx..' : '..snow..' mm')
local somme = 0 -- Somme des quantités. Peut être placée en en-tête.
for i=1, 12 do --On parcourt les 12 prochaines heures.
if (jsonValeur.hourly[i].rain) then --Pluie prévue ?
somme = somme + jsonValeur.hourly[i].rain["1h"] --Si oui, on additionne la quantité annoncée à cette heure à la somme des quantités. Sinon, on ne fait rien.
end
if (jsonValeur.hourly[i].snow) then --Neige prévue ?
somme = somme + jsonValeur.hourly[1].snow["1h"] --Même principe.
end
if (i == 12) then
quantiteDouzeHeures = somme
end
end
commandArray[douzeHeurespluieDeviceIdx] = { ['UpdateDevice'] = douzeHeurespluieDeviceIdx..'|1|0;'..quantiteDouzeHeures }
commandArray[douzeHeuresneigeDeviceIdx] = { ['UpdateDevice'] = douzeHeuresneigeDeviceIdx..'|1|0;'..quantiteDouzeHeures }
--------------------------------------------
--------- Fin code à modifier -------------
--------------------------------------------
end
return commandArray1 capteur température + humidite + barometre
1 capteur vent
1 capteur UV
1 capteur pluie (précipatation)
1 capteur neige (précipatation)
1 capteur pluie 12h (type précipitation qui représente la quantité de pluie qu'il devrait tomber dans les 12 prochaines heures)
1 capteur neige 12h (type précipitation qui représente la quantité de neige qu'il devrait tomber dans les 12 prochaines heures)