Page 1 sur 17
[LUA-DzVents] Données Météo avec API Openweathermap
Publié : 13 avr. 2020, 10:51
par Keros
Bonjour,
Suite à la future fermeture de DarkSky (
sujet sur le forum), j'ai cherché une autre API météo.
J'ai choisi l'API OneCall
https://openweathermap.org/api/one-call-api. A l'heure où j'écris ces lignes (le 13 avril 2020) :
- OneCall est gratuit,
- OneCall est prévu pour une migration depuis DarkSky Documentation,
- OneCall permet de faire 1000 appels/jours,
- OneCall permet d'avoir la météo courante,
- OneCall permet d'avoir la météo heure par heure sur 48 heures,
- OneCall permet d'avoir la météo jour par jour sur 7 jours,
- OneCall permet d'avoir un historique sur les 5 derniers jours.
La version gratuite donne également accès à d'autres API. Le principe de fonctionnement est le même.
Sommaire :
EDIT : Ce tuto était basé au départ sur l'API sur 5 jours mais je l'ai passé sur l'API OneCall
La liste des API est disponible sur
https://openweathermap.org/price dont voici une impression d'écran au 13 avril 2020 :

- Openweather01.jpg (115.54 Kio) Consulté 28282 fois
Partie 1
Publié : 13 avr. 2020, 10:52
par Keros
Le tutoriel commence ici :
1 - Récupération d'une clé API
- Enregistrez vous sur le site (Sign Up) et valider le mail de confirmation
- Loguez vous sur le site (Sign In)
- Allez sur votre page de clé API (API Keys)
- Créer une clé (Create key)
Entrer un nom à la clé. J'ai mis Default à la mienne.
Puis générer (Generate)

- Openweather02.jpg (51 Kio) Consulté 28276 fois
Notez bien la clé API qui vous est fournie. Vous pourrez la retrouver en revenant sur le site (j'ai effacé la mienne).
Partie 2
Publié : 13 avr. 2020, 10:52
par Keros
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é 28275 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é 28275 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.
Partie 3
Publié : 13 avr. 2020, 10:53
par Keros
3 - Documentations
La documentation est là :
https://openweathermap.org/api/one-call-api
La documentation pour migrer depuis DarkSky est là :
https://openweathermap.org/darksky-openweather
La documentation pour la conversion date et heure :
https://www.lua.org/pil/22.1.html
La documentation sur l'API JSON de DomoticZ :
https://www.domoticz.com/wiki/Domoticz_API/JSON_URL's
Il existe un site pour vérifier la récupération de vos infos du Json :
https://developer.mozilla.org/en-US/doc ... JSON/parse (merci totof60)
Partie 4
Publié : 13 avr. 2020, 10:53
par Keros
4 - Les autres API gratuit de Openweathermap
Le principe est le même pour les autres API d'Openweathermap. Il faut modifier le lien d'appel
api.openweathermap.org/data/2.5/onecall?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric
Le lien sera
api.openweathermap.org/data/2.5/forecast?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric
Le lien sera
api.openweathermap.org/data/2.5/weather?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric
Le lien sera
api.openweathermap.org/data/2.5/uvi/forecast?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric
Au 13 avril 2020 ...
Partie 5
Publié : 13 avr. 2020, 10:54
par Keros
5 - Tests
Pour la phase de test, il est possible d'enregistrer le Json en local : cela évite de faire appel pour chaque essai.
Pour cela, entrer le lien avec vos paramètres dans votre navigateur préféré
api.openweathermap.org/data/2.5/onecall?lat={lattitude}&lon={longitude}&appid={Clé API}&lang=fr&units=metric et enregistrer la page en WEATHER-TEST.json (par exemple).
Ouvrer le fichier enregistré dans votre navigateur et copier l'adresse (pour moi c'est
file:///home/XXXXXX/Desktop/WEATHER-TEST.json et remplacer le lien dans le script qui devient ;
config=assert(io.popen('/usr/bin/curl "file:///home/XXXXXX/Desktop/WEATHER-TEST.json"))
Lorsque vous aurez toutes les infos souhaitées, remettez le lien
api.openweathermap.org/data/2.5/onecall?lat='..lat..'&lon='..long..'&appid='..api..'&lang=fr&units=metric pour avoir des données à jour

Partie 6
Publié : 13 avr. 2020, 10:54
par Keros
6 - Utilisations possibles
Ce script ce limite à récupérer les données dans des variables. A vous de rajouter des fonctions pour l'adapter à vos besoins !!
Quelques exemples que j'utilise :
Mais il y en a plein d'autres dans ce forum
Exemples ajouté dans la discussion :
Au passage si quelqu'un a réussi à faire un widget météo virtuel, je suis preneur
Partie 7
Publié : 13 avr. 2020, 10:54
par Keros
7 - Fin
Ce script est une adaptation du script de calcul de givre de deennoo.
Malgré l'aide du forum, j'ai galéré plusieurs jours pour arriver à récupérer la météo avec le weather[1].
Ce forum m'a permis de faire beaucoup de choses. C'était à mon tour de vous partager ce que j'avais appris .
Partie 8
Publié : 13 avr. 2020, 10:55
par Keros
8 - Partage
J'espère que ce script vous sera utile.
Partagez nous l'utilisation que vous en faite. Je mettrai à jour les exemples.
Ca donnera certainement des idées aux autres

Partie 9
Publié : 13 avr. 2020, 10:55
par Keros
9 - Mises à jour
11/04/2020 01h42 : Création
11/04/2020 08h58 : Ajout commentaire dans le code + Test en local + exemples d'utilisation
11/04/2020 10h50 : Ajout exemple coordonnées GPS
11/04/2020 16h34 : Ajout infos documentation
11/04/2020 21h46 : Ajout de l'API OneCall
12/04/2020 12h10 : Correction du bug d'appel de l'API avec les "" (Merci Neutrino)
12/04/2020 12h38 : Ajout du code de débogage lors de l'appel.
12/04/2020 21h55 : Ajout exemple pour le calcul de la récupération
13/04/2020 10h24 : Modification pour utilisation de l'API OneCall
13/04/2020 22h03 : Ajout '' sur les variables et suppression du End inutile à la fin (Merci Denis_brasseur)
15/04/2020 22h12 : Ajout exemple weather pour les prévisions du lendemain.
03/05/2020 19h02 : Ajout lien en documentation pour la vérification du parse du Json
08/06/2020 22h47 : Ajout informations concernant la récupération de l'info Rain (Merci Joebuzz et JackG)
24/08/2023 09h53 : Ajout info mise à jour API et disclaimer script LUA<>DzVents