====== Bonus : Ajouter la pression atmosphérique avec l’API OpenWeather ======
Afficher la pression atmosphérique récupérée sur Internet, en complément des données relevées par la sonde DHT22 sur le Raspberry Pi.
===== Créer un compte sur OpenWeather =====
- Aller sur [[https://openweathermap.org|https://openweathermap.org]]
- Cliquer sur "Sign in" en haut de la page.
- Cliquer sur "Create an account".
- Remplir le formulaire et valider le compte.
- Cliquer sur "My API keys".
{{ raspberry:openweather.png?400 }}
6. copier la clé affichée (garde-la précieusement !).
===== Installer la bibliothèque requests =====
###
Nous allons utiliser la **bibliothèque requests** pour faire des **appels à l’API**. Dans votre environnement virtuel Python, vous pouvez taper cette commande :
###
pip3 install requests
###
Dans le haut de votre script, ajoutez l'import de cette bibliothèque :
###
import requests
===== Nouvelles constantes =====
Ajoutons 4 nouvelles constantes :
* Dans la section des couleurs, vous pouvez ajouter une couleur pour l'affichage de la pression atmosphérique.
CYAN = "\033[96m"
* Créer une nouvelle section pour les **coordonnées GPS** d'Arles.
# Coordonnées GPS d'Arles
LATITUDE = 43.6768
LONGITUDE = 4.6303
* Enfin, ajouter la **clé API**.
# Clé API
API_KEY = "Votre_clé"
**Attention** : Ici, nous mettons directement la clé API dans le code. En faisant cela, nous créons une faille de sécurité car nous exposons publiquement une donnée sensible.
===== Création d'une nouvelle fonction =====
###
Cette fonction interroge le **service météo OpenWeather** pour récupérer la **pression atmosphérique actuelle** en fonction de la **position géographique (latitude/longitude)**.
###
def recuperer_pression(api_key, latitude, longitude):
Elle prend en paramètre :
* API_KEY → la clé personnelle d’API fournie par OpenWeather,
* LATITUDE → la latitude du lieu (ex : 43.676 pour Arles),
* LONGITUDE → la longitude du lieu (ex : 4.630 pour Arles).
====URL de l'API====
url = f"https://api.openweathermap.org/data/2.5/weather?lat={latitude}&lon={longitude}&appid={api_key}&units=metric&lang=fr"
On construit dynamiquement l’adresse de l’API avec les bonnes informations :
* **lat** et **lon** pour la géolocalisation,
* **appid** pour inclure la clé d’accès API,
* **units=metric** pour avoir les données en °C et hPa,
* **lang=fr** pour avoir les descriptions météo en français (utile si on affiche d'autres infos comme la description du ciel).
====Bloc try/except====
###
Le mot-clé try signifie : essaie d’exécuter les instructions suivantes. Cela permet d’éviter les **plantages du script** si une erreur survient (ex : pas de connexion Internet, clé API invalide…).
###
try:
....
code de la fonction
....
except:
....
code en cas d'échec de la fonction
....
====Réponse de l'API====
===Appel de l'API===
###
On utilise la bibliothèque requests pour envoyer une requête HTTP vers l’URL de l’API OpenWeather.
###
response = requests.get(url)
===Conversion de la réponse en JSON===
###
La méthode .json() transforme la réponse en **dictionnaire Python**. Cela nous permet de manipuler facilement les informations retournées par l’API.
###
data = response.json()
__Exemple d'une structure JSON__ :
{
"main": {
"temp": 18.5,
"pressure": 1013,
"humidity": 82
}
}
===Récupération de la pression atmosphérique===
pression = data["main"]["pressure"]
###
Ici, on accède à la **donnée "pressure"** qui se trouve dans la **clé "main"** du dictionnaire. C’est cette valeur (en hPa) que l’on souhaite récupérer.
###
===Retour de la fonction===
return pression
On **retourne la valeur de la pression**. Cela signifie que lorsque cette fonction est appelée, elle renverra un nombre (par exemple 1013).
===Gestion des erreurs===
except:
return None
###
Si quelque chose ne fonctionne pas (problème de réseau, mauvaise clé API, réponse inattendue, etc.), on retourne None.
###
====Affichage des données====
pression = recuperer_pression(API_KEY, LATITUDE, LONGITUDE)
###
On utilise ici la fonction //recuperer_pression// (définie plus haut) pour **obtenir la pression atmosphérique actuelle** à partir des coordonnées géographiques (latitude et longitude) et de la clé API. Le résultat (la pression en hPa) est **stocké dans la variable pression**.
###
if pression is not None:
-> if humidity is not None and temperature is not None and pression is not None:
###
On s’assure que la récupération des données a bien fonctionné.
Si la valeur n’est pas None, cela veut dire que l’appel à l’API a réussi, donc on peut afficher la donnée.
Sinon, on ne fait rien (ou on pourrait afficher un message d’erreur pour informer l’utilisateur).
###
print(f"{CYAN}Pression atmosphérique:{RESET} {pression} hPa")
###
On affiche la pression, en couleur cyan, grâce aux **constantes ANSI** définies auparavant (**CYAN et RESET**).
La valeur est suivie de l’**unité hPa (hectopascals)**, utilisée en météorologie pour mesurer la pression atmosphérique.
###
----
Suite vers [[jardin_fonction_round|Utilisation de la fonction round()]]