Re: [LUA] Données Météo avec API Openweathermap
Publié : 24 avr. 2020, 06:53
Apres détection j'obtiens ça :
Reprenez le contrôle de votre domotique
https://easydomoticz.com/forum/
Code : Tout sélectionner
--[[ script_time_meteo.lua tested on domoticz 2020.2
author/auteur = joebuz
update/mise à jour = 03/05/2020
creation = 03/05/2020
Created from this topic
author/auteur = Keros
https://easydomoticz.com/forum/viewtopic.php?f=17&t=9892
Date = 13/04/2020
Ce script nécessite l'inscription préalable à l'API Openweathermap : https://openweathermap.org
liste des commandes : https://openweathermap.org/api/one-call-api
--]]
local function log(p_message)
-- Décommenter 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 = 'V1.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 tempDeviceIdx = 178 -- EXEMPLE 3 - 1) Idx de votre disositif Température
local vtrDeviceIdx = 179 -- EXEMPLE 3 - 2) Idx de votre dispositif Vent+Température+Refroidissement
local rainDeviceIdx = 180 -- EXEMPLE 3 - 3) Idx de votre dispositif Précipitations
local uvDeviceIdx = 181 -- EXEMPLE 3 - 4) Idx de votre dispositif UV
local atmDeviceIdx = 182 -- EXEMPLE 3 - 5) Idx de votre dispositif Baromètre
local humDeviceIdx = 183 -- EXEMPLE 3 - 6) Idx de votre dispositif humidité (pourcentage)
local cloudDeviceIdx = 184 -- EXEMPLE 3 - 6) Idx de votre dispositif couverture nuageuse (pourcentage)
--------------------------------------------
----------- Variables à éditer -------------
--------------------------------------------
local api = 'MonAPI' -- Remplacer par votre clé API
local lat = 'MaLatitude' -- Remplacer par ici votre latittude
local long = 'MaLongitude' -- 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/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 = {}
log(scriptName.." "..scriptVersion.." - "..actual_hour)
-- Les script_time sont exécutés toute les 1 minute 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 20 minutes)
if (time.min % 20)==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 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
-- L'utilisation des données (ici j'écris une ligne dans le LOG de DomoticZ)
msg = 'Il fait '..temp..' degres et la météo indique '..weather..' avec un point de rosé à '..rose..' degres.'
log(msg)
---------------------------------------------
-- EXEMPLE 2 - Temps dans X heures
-- le [11] signifie dans 11h à modifier selon l'heure d'appel du script
temp_demain = jsonValeur.hourly[11].temp
weather_demain = jsonValeur.hourly[11].weather[1].description
-- Code pour afficher et convertir la date et l'heure de la prévision
time_prevision = jsonValeur.hourly[11].dt
heure_prevision = (os.date("%x à %X", time_prevision))
msg = 'Le '..heure_prevision..', il fera '..temp_demain..' degrés et la météo prévoit '.. weather_demain..'.'
log(msg)
--------------------------------------------
-- EXEMPLE 3 -
-- dans Matériel créé un capteur virtuel Dummy que vous appelez comme vous voulez
-- 1) Puis créer un capteur virtuel de température à partir du Dummy que vous venez de créé
-- Dans dispositif, notez l'IDX du capteur température que vous venez de créer et renseignez en haut de ce script pour "local tempDeviceIdx"
-- 2) Créer un capteur virtuel Vent+Température+Refroidissement et renseignez en haut de ce script pour "local vtrDeviceIdx"
-- 3) Créer un capteur virtuel Précipitations et renseignez en haut de ce script pour "local rainDeviceIdx"
-- 4) Créer un capteur virtuel UV et renseignez en haut de ce script pour "local uvDeviceIdx"
-- 5) Créer un capteur virtuel Baromètre et renseignez en haut de ce script pour "local atmDeviceIdx"
-- 6) Créer un capteur virtuel Pourcentage et renseignez en haut de ce script pour "local humDeviceIdx"
-- Créer un capteur virtuel Pourcentage et renseignez en haut de ce script pour "local cloudDeviceIdx"
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
-- 1) MAJ du capteur Virtuel de Température
commandArray[tempDeviceIdx] = { ['UpdateDevice'] = tempDeviceIdx..'|0|'..temp }
log('MAJ tempDevice '..tempDeviceIdx..' : '..temp..'°C')
-- 2) MAJ du capteur Virtuel de Vent+Température+Refroidissement
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[vtrDeviceIdx] = { ['UpdateDevice'] = vtrDeviceIdx..'|0|'..windDirection..';'..tostring(direction)..';'..windSpeed2..';'..windGust2..';'..temp..';'..tempFeels }
log('MAJ vtrDevice '..vtrDeviceIdx..' : '..temp..'|'..tempFeels..'°C ; '..windSpeed..'|'..windGust..'m/s '..direction)
-- 3) MAJ du capteur de pluie
commandArray[rainDeviceIdx] = { ['UpdateDevice'] = rainDeviceIdx..'|1|0;'..rain }
log('MAJ rainDevice '..rainDeviceIdx..' : '..rain..'mm')
-- 4) MAJ du capteur d'UV
commandArray[uvDeviceIdx] = { ['UpdateDevice'] = uvDeviceIdx..'|1|'..UVIndex..';0' }
log('MAJ uvDevice '..uvDeviceIdx..' : '..UVIndex)
-- 5) MAJ du capteur baromètre
commandArray[atmDeviceIdx] = { ['UpdateDevice'] = atmDeviceIdx..'|0|'..pressionAtm }
log('MAJ atmDevice '..atmDeviceIdx..' : '..pressionAtm)
-- 6) MAJ du capteur humidité et du capteur couverture nuageuse
commandArray[humDeviceIdx] = { ['UpdateDevice'] = humDeviceIdx..'|0|'..humidity }
log('MAJ humDevice '..humDeviceIdx..' : '..humidity)
commandArray[cloudDeviceIdx] = { ['UpdateDevice'] = cloudDeviceIdx..'|0|'..clouds }
log('MAJ cloudDevice '..cloudDeviceIdx..' : '..clouds)
--------------------------------------------
--------- Fin code à modifier -------------
--------------------------------------------
end
return commandArraySalut,joebuz a écrit : 04 mai 2020, 15:04
Autre chose, pour la pression atmosphérique, j'ai créé un capteur virtuel Baromètre pour essayer, la valeur est bien mise à jour quand je regarde dans les dipositifs mais dans l'onglet Meteo de Domoticz cela ne m'affiche aucune valeure et je n'ai plus l'icône du baromètre
Capture.PNG
Si qqn a une idée du pourquoi ?
Voilà, encore une fois je précise que je débute et ce script et un script d'essai non optimisé, soyez indulgent![]()
Code : Tout sélectionner
commandArray[atmDeviceIdx] = { ['UpdateDevice'] = atmDeviceIdx..'|0|'..pressionAtm}Code : Tout sélectionner
commandArray[atmDeviceIdx] = { ['UpdateDevice'] = atmDeviceIdx..'|0|'..pressionAtm..';0' }