Récupérer une information depuis Internet - Niveau facile
Dans ce mini projet, nous allons nous connecter à internet pour récupérer un fichier au format JSON, puis en afficher le contenu. Ce projet est très similaire dans son fonctionnement à celui décrit ici, mais sa mise en oeuvre sera bien plus simple car nous n'utiliserons aucun autre matériel qu'une carte Wemos (ici une ESP32 mais une ESP8266 ferait aussi bien l'affaire).
Nous allons donc afficher le temps qu'il fait dans notre ville. Pour cela, nous utiliserons l'API du site openweathermap.org.
Voici un exemple de ce que l'on obtient lors d'une requête :
https://samples.openweathermap.org/data/2.5/weather?q=London&appid=b6907d289e10d714a6e88b30761fae22
En cliquant sur ce lien avec Firefox par exemple, les données brutes JSON sont mises en forme pour les rendre lisibles. On voit donc que l'on récupère facilement le nom de la ville, les conditions météo actuelles et la température. Ce sont ces informations que l'on va afficher sur notre carte.
Remarque :
Pour les besoins de la démonstration, j'utiliserai l'URL d'exemple. Rien n’empêche de créer un compte gratuit sur le site pour récupérer une clé API permettant de personnaliser la requête pour la ville de son choix !
Méthode : Le programme
Voici le programme.
La partie Wifi est à supprimer si vous avez fait la connexion dans le boot.py
Les codes Wifi sont à compléter
L'adresse DATA_SOURCE pourra être remplacée par une vraie contenant un lieu personalisée et une clé API.
Si on enlève la partie Wifi, le code nécessaire est extrêmement simpe et concis !
import time
import network # Si connexion dans ce script
import sys
import urequests
# Connexion Wifi
# Supprimer cette partie si elle est
# faite automatiquement au demarrage de la carte
# dans le boot.py
############################
# Debut configuration Wifi #
############################
WIFI_SSID = "MON_WIFI"
WIFI_PASSWORD = "MON_PASSWD"
# turn off the WiFi Access Point
ap_if = network.WLAN(network.AP_IF)
ap_if.active(False)
# connect the device to the WiFi network
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(WIFI_SSID, WIFI_PASSWORD)
# wait until the device is connected to the WiFi network
MAX_ATTEMPTS = 20
attempt_count = 0
while not wifi.isconnected() and attempt_count < MAX_ATTEMPTS:
attempt_count += 1
time.sleep(1)
if attempt_count == MAX_ATTEMPTS:
print("could not connect to the WiFi network")
sys.exit()
print(wifi.ifconfig())
################################
# fin de la configuration Wifi #
################################
DATA_SOURCE = "https://samples.openweathermap.org/data/2.5/weather?q=London&appid=b6907d289e10d714a6e88b30761fae22"
response = urequests.get(DATA_SOURCE)
repJson = response.json() # repJson est un dictionnaire
tempf = repJson['main']['temp']
print(repJson['name'])
print("Temp : "+str(tempf-273.15)) # Transformation kelvin vers Celsius
print(repJson['weather'][0]['description'])
Ce qui donne le résultat ci-contre. La ligne repJson = response.json()
permet l'analyse de la réponse au format Json et produit un dictionnaire. A partir de là, il est très simple d'extraire les informations recherchées !
Complément : Prévisions à 5 jours
Ceci peut servir de base à une station météo affichant des prévisions météo à 5 jours : il suffit juste d'utiliser une autre source de donnée :
DATA_SOURCE="https://samples.openweathermap.org/data/2.5/forecast?id=524901&appid=b6907d289e10d714a6e88b30761fae22"
et adapter les chemins d'accès dans le dictionnaire
tempf=repJson['list'][0]['main']['temp']
print(repJson['city']['name'])
print(repJson['list'][0]['weather'][0]['description'])
Le reste est juste une histoire d'interface homme machine pour une présentation claire de cette masse importante d'information. C'est quelque chose qui serait tout à fait réalisable dans le cadre de SNT voire NSI.
Attention : Attention à la mémoire
L'accès aux prévisions à 5 jours nécessite le téléchargement en mémoire d'un fichier très volumineux. Seule une carte ESP32 sera capable de réaliser cette tâche. La carte ESP8266 affichera un message d'erreur pour cause de mémoire insuffisante.