[LUA] Données Météo avec API Openweathermap

Vous avez crée un script lua dont vous êtes fier, un .sh génial, un programme python hors du commun, un tuto , c'est ici que vous pouvez les partager.
Soyez précis quant aux prérequis, les manips à faire pour que votre bijou fonctionne (des chmod ?, un apt-get à faire ...)
Décrivez précisément son fonctionnement
Placez votre code entre [Quote] et {/Quote]
Keros
Messages : 391
Enregistré le : 23 juil. 2019, 20:57

[LUA] Données Météo avec API Openweathermap

Message 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
Openweather01.jpg (115.54 Kio) Vu 2900 fois
Modifié en dernier par Keros le 13 avr. 2020, 15:45, modifié 6 fois.

Keros
Messages : 391
Enregistré le : 23 juil. 2019, 20:57

Partie 1

Message 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
Openweather02.jpg (51 Kio) Vu 2895 fois
Notez bien la clé API qui vous est fournie. Vous pourrez la retrouver en revenant sur le site (j'ai effacé la mienne).
Modifié en dernier par Keros le 13 avr. 2020, 11:04, modifié 3 fois.

Keros
Messages : 391
Enregistré le : 23 juil. 2019, 20:57

Partie 2

Message 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
  • Spécifier le chemin vers le fichier JSON.lua (différent selon votre système d'exploitation)

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

--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/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
Openweather05.jpg (28.95 Kio) Vu 2894 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
    Openweather06.jpg (31.92 Kio) Vu 2894 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.
Modifié en dernier par Keros le 23 juin 2020, 00:59, modifié 17 fois.

Keros
Messages : 391
Enregistré le : 23 juil. 2019, 20:57

Partie 3

Message 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

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)
Modifié en dernier par Keros le 03 mai 2020, 19:02, modifié 3 fois.

Keros
Messages : 391
Enregistré le : 23 juil. 2019, 20:57

Partie 4

Message 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 ...
Modifié en dernier par Keros le 13 avr. 2020, 15:23, modifié 3 fois.

Keros
Messages : 391
Enregistré le : 23 juil. 2019, 20:57

Partie 5

Message 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 ;)
Modifié en dernier par Keros le 13 avr. 2020, 15:35, modifié 3 fois.

Keros
Messages : 391
Enregistré le : 23 juil. 2019, 20:57

Partie 6

Message 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 :mrgreen:

Exemples ajouté dans la discussion : Au passage si quelqu'un a réussi à faire un widget météo virtuel, je suis preneur :D
Modifié en dernier par Keros le 04 mai 2020, 17:39, modifié 6 fois.

Keros
Messages : 391
Enregistré le : 23 juil. 2019, 20:57

Partie 7

Message 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 .
Modifié en dernier par Keros le 13 avr. 2020, 11:07, modifié 3 fois.

Keros
Messages : 391
Enregistré le : 23 juil. 2019, 20:57

Partie 8

Message 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 ;)
Modifié en dernier par Keros le 13 avr. 2020, 15:45, modifié 4 fois.

Keros
Messages : 391
Enregistré le : 23 juil. 2019, 20:57

Partie 9

Message 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)
Modifié en dernier par Keros le 08 juin 2020, 22:49, modifié 10 fois.

Répondre