Open-Meteo, disponible sur le site https://open-meteo.com est une API météo open source offrant un accès gratuit pour une utilisation non commerciale. Aucune inscription ou clé API n’est requise. Toutefois, dans le cadre d’une utilisation non commerciale, il convient de respecter les conditions suivantes:

  • Moins de 10.000 appels API par jour, 5.000 par heure et 600 par minute.
  • Utilisation des services API gratuits qu’à des fins non commerciales.
  • Acceptation de la licence CC-BY 4.0, comme spécifié dans les conditions de licence .
  • Open-meteo se réserve le droit de bloquer les applications et les adresses IP qui utilisent abusivement ses services sans préavis.

L’utilisation non commerciale est définie comme étant élaborée par Creative Commons . Pour faciliter la compréhension, voici quelques exemples qualifiés d’utilisation non commerciale :

  • Utilisation des services pour des sites Web ou des applications privés ou à but non lucratif sans abonnement ni publicité.
  • Utilisation à des fins de domotique personnelle.
  • Utilisation pour la recherche publique menée dans des institutions publiques.
  • Intégration des services dans un contenu éducatif.

Pour consulter l’ensemble des conditions, voir cette page

Cette API permet notamment d’acquérir les conditions météo courante, des prévisions jusqu’à 16 jours, des statistiques ou relevés depuis environ 80 ans pour n’importe quelle position définie par sa latitude et sa longitude. Les données peuvent être récupérées sous forme de fichiers json ou csv.

Le but de ce projet est d’utiliser un « vieux » M5stack modèle Core2 effectuant des requêtes périodiques sur open-meteo afin d’afficher les conditions météorologiques courantes. Il semble qu’actuellement (mai 2024) ce composant ne soit plus disponible à la vente. Mais l’on peut implémenter ce projet facilement pour tout esp32 équipé d’un écran minimum 320×260 pixels , d’une sd-card et programmable en blockly ou python.

La réalisation

En plus de la station météo courante, nous voulons afficher la date et l’heure toutes les secondes:

La structure de l’écran comporte sur la première ligne la date et l’heure courante. Ensuite, nous trouvons une icône représentant l’état du ciel, trois lignes d’informations et un graphique:

  • quantité de pluie en mm tombé depuis la dernière heure
  • la pression atmosphérique au niveau de la mer exprimée en hectoPascals
  • La direction, vitesse en km/h et force Beaufort du vent (sur la photo précécente, le vent vient du SO (Sud Ouest) à une vitesse de 23 km/h, soit un degré Beaufort de 4.
  • En bas de l’écran, se trouve la valeur de la température (degré Celsius) et un graphique permettant de visualiser les températures sur une période d’environ trois jours.

Icône état du ciel

L’api open-meteo permet de récupérer l’état courant du ciel par un code « weather code wmo »:

CodeDescription
0Ciel clair
1, 2, 3Généralement clair, partiellement nuageux et couvert
45, 48Brouillard et dépôt de brouillard givre
51, 53, 55Bruine : intensité légère, modérée et dense
56, 57Bruine verglaçante : Intensité légère et dense
61, 63, 65Pluie : intensité légère, modérée et forte
66, 67Pluie verglaçante : intensité légère et forte
71, 73, 75Chutes de neige : intensité légère, modérée et forte
77Grains de neige
80, 81, 82Averses de pluie : légères, modérées et violentes
85, 86Averses de neige légères et fortes
95 Orage : léger ou modéré
96, 99 Orage avec grêle faible et forte

Normalement, on devrait définir une icône pour chacune de ces valeurs de code (ce qui impliquerait 28 icônes). Afin de simplifier la réalisation, nous avons opté pour une représentation avec 19 icônes. Nous avons défini une icône pour les codes:

0, 1 , 2, 3, 45, 51 ,63, 65, 66, 67, 71, 73, 74, 80, 81, 82, 85, 86, 95

ainsi, par exemple, nous avons décidé que le code 48 aurait la même icône que le code 45. Ces choix ainsi que le nombre d’icônes, étant subjectifs, nous avons utilisé un fichier texte ima.ini qui doit être stocké sur la sd-card et qui contient les équivalences:

Plain Text

On retrouve à gauche du signe = tous les codes wmo possibles et à droite du signe égal le code de substitution. La convention de nommage pour les icônes de substitution est égale à la valeur du code concaténée avec le suffixe png.

Voici par exemple le contenu de la sd-card:

A titre indicatif, ces icônes peuvent être librement téléchargées à partir d’un site github

Pour l’application, il convient de redimensionner les icônes provenant de ce site en 64×64

L’interface graphique

Cet interface a été réalisée avec uiflow version 1.0

L’application

Dans ce paragraphe, nous allons décrire les 15 blocs définis pour cette application. Pour chaque bloc, nous donnons le code python associé en omettant les déclarations globales afin d’améliorer la lisibilité. En fin d’article, le source complet est disponible.

  • Bloc de démarrage

Il est indispensable de commencer par initialiser la sd-card. Ensuite, nous nous connectons au réseau wifi, configurons l’horloge, démarrons trois tâches périodiques:

Python
  • tâche période 1000 ms : affichage de la date et l’heure toutes les secondes
Python
  • tâche période 90000 ms : mise à jour des conditions météo toutes les 15 minutes
Python
  • tâche période 21600000 : resynchronisation de l’horloge interne toutes les 6 heures
Python

Le bloc getmeteo permet d’acquérir et de mettre à jour l’affichage:

Python

Le bloc load_meteo effectue la requête http sur le site open-meteo, ne pas oublier de modifier les valeurs de l’url pour les adapter à la latitude et la longitude désirées

https://api.open-meteo.com/v1/forecast?
latitude=XXXXXX
&longitude=XXXXXX
&current=temperature_2m,precipitation,weather_code,cloud_cover,pressure_msl,
wind_speed_10m,wind_direction_10m,wind_gusts_10m
&timezone=auto
Python

Décrivons maintenant les blocs d’affichage:

  • Affichage de la température
Python
  • Affichage du ciel
Python
  • Affichage de la pression atmosphérique
Python
  • Affichage du vent
Python
  • Affichage des précipitations
Python

Enfin, voici quelques fonctions de mise en page utilisées dans les blocs d’affichage

  • Fonction get_data

Retourne la valeur définie par la clé « key » du champ « current » des données json

Python
  • Fonction get_path

Retourne le nom de l’image stockée sur la sd-card à partir du weather-code (wmo) et du fichier ima.ini décrit précédemment.

Python
  • Fonction km_to_beaufort

Convertit une vitesse en km/h en degrés Beaufort

Python
  • Fonction angle_to_direction

Convertit un angle compris entre 0 et 360 degrés en libellé de secteur

Python

Source

Python