Re: [LUA] Données Météo avec API Openweathermap
Publié : 24 nov. 2020, 21:30
Tu peux nous copier ton script stp en masquant les cordonnées GPS et ta clé API (comme tu l'a déjà fait dans le lien).
Reprenez le contrôle de votre domotique
https://easydomoticz.com/forum/
Code : Tout sélectionner
----------- Variables à éditer -------------
--------------------------------------------
local api = '79xxxxxxxxxxxxxxxxx75' -- Remplacer par votre clé API
local lat = '4x.xxxxxx' -- Remplacer par ici votre latittude
local long = '0.xxxxx' -- 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/xxxxxx/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 = {}
-- 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')) -- Testé sans succès
-- config=assert(io.popen('usr/bin/curl https://api.openweathermap.org/data/2.5/onecall?lat=4x.xxxxx&lon=0.xxxxx&exclude=minutely,hourly,daily&appid=79xxxxxxxxxxxxxxxxx75&lang=fr&units=metric')) -- Testé sans succès
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')
print(blocjson) -- pour Test
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[1]
rose = jsonValeur.current.dew_point[1]
weather = jsonValeur.current.weather[1].description
-- L'utilisation des données (ici j'écris un 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.'
print(msg)
--------------------------------------------
--------- Fin code à modifier -------------
--------------------------------------------
return commandArray
Code : Tout sélectionner
lien = '/usr/bin/curl "https://api.openweathermap.org/data/2.5/onecall?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric"'
print('Lien : '..lien)
config=assert(io.popen(lien))En tout cas merci encore pour ton investissement.Bizarre vous avez dit bizarre
C'est avec plaisir
Code : Tout sélectionner
--[[ script_time_meteo.lua
auteur = joebuz
modification : g@rycooper
mise a jour = 03/01/2021
creation = 03/05/2020
Cree depuis ce topic
auteur = Keros
https://easydomoticz.com/forum/viewtopic.php?f=17&t=9892
Date = 13/04/2020
Ce script necessite l'inscription prealable a l'API Openweathermap : https://openweathermap.org
liste des commandes : https://openweathermap.org/api/one-call-api
--]]
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 = 'V1.1'
local time = os.date("*t") -- Si vous souhaitez execute ce script toutes les X min
local start_hour = '06:00' -- Si vous souhaitez execute ce script tous les jours a 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
-- EXEMPLE 4 on rajoute les probabilités de pluie et neige
local proba_pluie_h = {} -- Ajoutez, modifiez ou supprimez les variables proba_pluie_h[]
-- en changeant le N° entre [] correspondant à l'heure souhaitée pour l'associer au device concerné dans dz
proba_pluie_h[1]=27 -- renseigner l'idx du device % probabilité pluie à 1 heure associé, nil si non utilisé
proba_pluie_h[2]=28 -- renseigner l'idx du device % probabilité pluie à 2 heures associé, nil si non utilisé
proba_pluie_h[4]=29 -- renseigner l'idx du device % probabilité pluie à 4 heures associé, nil si non utilisé
proba_pluie_h[6]=30 -- renseigner l'idx du device % probabilité pluie à 6 heures associé, nil si non utilisé
proba_pluie_h[12]=31 -- renseigner l'idx du device % probabilité pluie à 12 heures associé, nil si non utilisé
proba_pluie_h[24]=32 -- renseigner l'idx du device % probabilité pluie à 24 heures associé, nil si non utilisé
-- L'api fournie 36 probabilités de neige, 1 par heure.
local proba_neige_h={} -- comme pour la pluie Ajoutez, modifiez ou supprimez les variables proba_neige_h[]
-- en changeant le N° entre [] correspondant à l'heure souhaitée pour l'associer au device concerné dans dz
proba_neige_h[1]=33 -- renseigner l'idx du device % probabilité neige à 1 heure associé, nil si non utilisé
proba_neige_h[2]=34 -- renseigner l'idx du device % probabilité neige à 2 heures associé, nil si non utilisé
proba_neige_h[4]=35 -- renseigner l'idx du device % probabilité neige à 4 heures associé, nil si non utilisé
proba_neige_h[6]=36 -- renseigner l'idx du device % probabilité neige à 6 heures associé, nil si non utilisé
proba_neige_h[12]=37 -- renseigner l'idx du device % probabilité neige à 12 heures associé, nil si non utilisé
proba_neige_h[24]=38 -- renseigner l'idx du device % probabilité neige à 24 heures associé, nil si non utilisé
local seuil_notification= nil -- pourcentage au delà duquel vous souhaitez être notifié, nil si non utilisé
--------------------------------------------
----------- Variables a editer -------------
--------------------------------------------
local api = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx' -- Remplacer par votre cle API
local lat = 'xxxxxxxxxxxx' -- Remplacer par ici votre latittude
local long = 'xxxxxxxxxxxxx' -- Remplacer par votre longitude
--Selectionner le chemin vers votre fichier JSON.lua en decommentant la ligne pour votre systeme d'exploitation
--json = (loadfile "/home/votrenomutilise/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 a editer ----------
--------------------------------------------
commandArray = {}
log(scriptName.." "..scriptVersion.." - "..actual_hour)
-- Les script_time sont executes 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 executer le script toutes les X min
-- if actual_hour==start_hour then -- pour executer le script a heure fixe
-- L'appel et l'enregistrement des previsions 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 a 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"
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
proba_pluie_h = jsonValeur.hourly[i].rain
proba_neige_h = jsonValeur.hourly[i].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)
end
--------------------------------------------
-- EXEMPLE 4 -
-- Probabilité pluie et neige
for i in pairs(proba_pluie_h) do
if proba_pluie_h[i] ~= nil then
pluie = tonumber(proba_pluie_h[i])
commandArray[#commandArray+1] = {['UpdateDevice'] = proba_pluie_h[i]..'|0|'.. pluie}
if seuil_notification ~= nil and pluie > seuil_notification then
commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte : '.. pluie ..' % de probabilité de pluie dans '.. i ..'heure(s)'}
end
end
if proba_neige_h[i] ~=nil then
neige = tonumber(proba_neige_h[i])
commandArray[#commandArray+1] = {['UpdateDevice'] = proba_neige_h[i]..'|0|'.. neige}
if seuil_notification ~= nil and neige > seuil_notification then
commandArray[#commandArray+1] = {['SendNotification'] = 'Alerte : '.. neige ..' % de probabilite de neige dans '.. i ..'heure(s)'}
end
end
end
--------------------------------------------
--------- Fin code a modifier -------------
--------------------------------------------
return commandArray
Code : Tout sélectionner
proba_pluie_h = jsonValeur.hourly[i].rain
proba_neige_h = jsonValeur.hourly[i].snowCode : Tout sélectionner
proba_pluie_h[1]=27 -- renseigner l'idx du device % probabilité pluie à 1 heure associé, nil si non utilisé
proba_pluie_h[2]=28 -- renseigner l'idx du device % probabilité pluie à 2 heures associé, nil si non utilisé
proba_pluie_h[4]=29 -- renseigner l'idx du device % probabilité pluie à 4 heures associé, nil si non utilisé
proba_pluie_h[6]=30 -- renseigner l'idx du device % probabilité pluie à 6 heures associé, nil si non utilisé
proba_pluie_h[12]=31 -- renseigner l'idx du device % probabilité pluie à 12 heures associé, nil si non utilisé
proba_pluie_h[24]=32 Code : Tout sélectionner
proba_pluie_h = jsonValeur.hourly[i].rain