2 - Script Lua
Je vais expliquer en premier le code pour récupérer la météo actuelle et, dans un deuxième temps, expliquer comment récupérer des prévisions.
2.1 - Principe avec la météo actuelle
Pour fonctionner, vous aurez besoin de :
- votre clé API OpenWeather map
- mettre à jour le lien API en fonction de la clé API que vous avez activé
- Spécifier le chemin vers le fichier JSON.lua (différent selon votre système d'exploitation)

Le code ci-dessus est valable pour un script LUA. Pour un script DzVents, se référer à l'exemple indiqué dans la partie 8.

L'URL est a modifié en fonction de l'API auquel vous avez souscri. PAr exemple, OneCall 2.5 utilisé n'est plus disponible avec les nouvelles clé API (et, à l'heure de cette édition du post (24/08/2023, c'est l'API OneCall 3.0 qui est disponible pour les nouvelles demandes de clé API)
Code : Tout sélectionner
--------------------------------------------
----------- Variables à éditer -------------
--------------------------------------------
local api = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' -- Remplacer par votre clé API
local lat = '48.8566969' -- Remplacer par ici votre latittude
local long = '2.3514616' -- Remplacer par votre longitude
-- En cas d'erreur, sélectionner le chemin vers votre fichier JSON.lua en commentant la première ligne et en dé-commentant la ligne pour votre système d'exploitation.
json = (loadfile "scripts/lua/JSON.lua")() -- Relative path for most systems
--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 = {}
-- 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
-- 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
L'appel de l'API se fait avec la ligne
config=assert(io.popen('/usr/bin/curl "api.openweathermap.org/data/2.5/onecall?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric"'))
Vous pouvez visualiser le Json dans votre navigateur en rentrant l'adresse
https://api.openweathermap.org/data/2.5/onecall?lat=LATITTUDE&lon=LONGITUDE&appid=CLE_API&lang=fr&units=metric (il faut remplacer les valeurs LATITTUDE, LONGITUDE et CLE_API par vos valeurs)
Soit le fichier JSON en question :

- Openweather05.jpg (28.95 Kio) Consulté 28272 fois
Les différents lignes pour récupérer des infos sont :
- Température : temp = jsonValeur.current.temp
- Point de rosé : rose = jsonValeur.current.dew_point
- Météo : weather = jsonValeur.current.weather[1].description
- Pluie :
if jsonValeur.hourly[1]["rain"] ~= nil then
rain=jsonValeur.hourly[1]["rain"]["1h"]
else
rain = 0
end
ou une deuxième possibilité :
if (jsonValeur.hourly[1].rain) then
rain=jsonValeur.hourly[1].rain["1h"]
else
rain = 0
end
Note Weather : Dans mon cas, c'est un 1 à weather. Et pourtant c'est 0 sur le Json ... Allez savoir !!
Edit : Neutrino nous a donnée l'explication : "En LUA, les tableaux commence à 1."D'où le 1 à la place du 0.
Vous devez modifier la fin des lignes pour récupérer les valeurs du Json que vous voulez.
Note Rain : Lorsqu'il n'y a pas de pluie, l'information rain n'est pas présente dans le Json ; ce qui engendre une erreur si on cherche à mettre l'info "vide" dans une variable. Merci Joebuz
Note Rain 2 : Petite subtilité pour récupérer l'info de l'heure : il faut écrire "1h" avec des guillemets. Merci JackG
Note Rain 3 : N'oubliez pas que le [1] dans le script correspond au [0] dans le Json.
Astuce : vérifier toujours avec le dt que vous remonter la bonne info.
2.2 - Récupérer des prévisions
Voici le principe qu'il faut comprendre :
Prenons l'exemple qu'il est 20h30. Vous ne pouvez pas dire à l'API Donne moi la météo à 07h. Il faut dire Donne moi la météo dans 11h 20h30 + 11h = 07h.
Concrètement, le Json renvoit les prévisions pour toutes les heures au moment où le script est exécuté. Rappel : OneCall limite les prévisions à 48h.

- Openweather06.jpg (31.92 Kio) Consulté 28272 fois
Reprenons l'exemple, le script est lancé à 20h30 et on souhaite avoir la température le lendemain à 07h.
hourly[0] correspond aux données à 20h, hourly[1] à 21h, hourly[2] à 22h, etc ... hourly[11] à 07h.
JSON indique l'heure de la prévision dans la varaible dt. Elle est au format Unix TimeStamps (heure universelle "internet"). J'ai ajouté une ligne de code pour la convertir.
Le code pour récupérer la température 11 heures après est :
Code : Tout sélectionner
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..' degres et la météo prévoit '.. weather_demain..'.'
Il faut adapter le code en fonction de l'heure où vous l'utiliserez.
Le principe est identique pour récupérer les prévision des jours. Il faut utiliser daily à la place de hourly.