🛠 Logger Python température + qualité Wi-Fi avec gestion de pannes réseau
Objectifs
Construire le service de supervision adapté AUX DEUX DÉFAUTS DOCUMENTÉS de la Zero 2 W : le throttling à 85 °C et le radio instable (erreurs « brcmfmac ... failed: -5 », coupures suivies après l'upgrade Bookworm — raspberrypi/firmware#1962). Le programme doit donc survivre au réseau : timeouts courts, capture des erreurs, boucle qui ne meurt jamais, et journalisation locale.
Matériel
- 1 Raspberry Pi Zero 2 W sur le réseau (2,4 GHz, WPA2)
- 1 machine « serveur » locale écoutant un POST HTTP (un « python3 -m http.server » suffit pour tester, ou Flask)
- Paquets : « sudo apt install python3-requests iw » (iw fournit la mesure du signal)
Code complet
#!/usr/bin/env python3
"""Température SoC + RSSI Wi-Fi vers un tableau de bord local.
Pensé pour la Zero 2 W : throttling à 85 °C et radio 2,4 GHz capricieux."""
import subprocess, time
import requests
WLAN = "wlan0"
URL = "http://192.168.1.10:8080/ingest"
def soc_temp_c:
# vcgencmd parle au GPU : lecture fiable (les zones sysfs traînent).
out = subprocess.check_output(["vcgencmd", "measure_temp"], text=True)
return float(out.split("=")[1].split("'")[0]) # "temp=48.3'C"
def wifi_rssi:
out = subprocess.run(["iw", "dev", WLAN, "station", "dump"],
capture_output=True, text=True).stdout
for line in out.splitlines:
if "signal" in line:
return int(line.split[1]) # dBm : > -70 bien, < -85 marginal
return None
while True:
payload = {"host": "zero2w", "temp_c": soc_temp_c, "rssi_dbm": wifi_rssi}
try:
requests.post(URL, json=payload, timeout=5)
except requests.RequestException as e:
# Les micro-coupures brcmfmac arrivent : on journalise, on continue.
print("upload rate:", e, flush=True)
time.sleep(60)
Service systemd (redémarrage auto si le process meurt vraiment) avec « Restart=on-failure » et « RestartSec=10 ».
Vérification attendue
Le serveur reçoit un POST par minute avec température et RSSI. Test de robustesse : couper le Wi-Fi côté box (« sudo ip link set wlan0 down ») — le script affiche « upload rate » puis reprend dès le retour du réseau sans redémarrage. En charge CPU, on observe la corrélation température↔fréquence dans les données.
Erreurs fréquentes
- Pas de timeout sur requests : le POST hang pendant une coupure brcmfmac et le service ne rend plus — timeout=5 est non négociable.
- Laisser les exceptions remonter hors de la boucle : un seul échec non capturé tue le service ; le try/except doit entourer l'upload, pas tout le programme.
- Parser la température avec /sys/class/thermal : possible, mais vcgencmd est la mesure de référence sur ce SoC.
- Négliger les 512 Mo de RAM : un logger qui met tout en file d'attente mémoire finira en OOM ; borner la file (les 20 derniers points suffisent).
- Pointer l'URL vers l'extérieur : en cas de coupure DNS, le timeout DNS peut dépasser le timeout HTTP — préférer une IP locale.
Autres tutoriels pour cette carte
- Premier démarrage de la Zero 2 W sans écran (headless)
- Se connecter au Wi-Fi (et comprendre les limites 2,4 GHz / WPA2)
- Surveiller la température et la fréquence de la Zero 2 W
- GPIO en Python : LED et bouton avec gpiozero
- Le tour de passe-passe « clé USB Linux » : Ethernet sur USB (g_ether)
- Serveur de blocage de pub réseau avec Pi-hole
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash