Re: [LUA] Quantité de précipitation avec OpenWeatherMap
Publié : 24 janv. 2021, 18:42
Bonjour Vianncy, merci pour tes conseils. Malheureusement je ne sais pas comment créer des variables ... Le script fonctionne en partie.
Dans les logs j'ai ça
La ligne 155 est celle-ci :
Le script complet est celui-ci :
Mes capteurs sont :
1 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)
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)