🛠 Logger Python température + qualité Wi-Fi avec gestion de pannes réseau
Objetivos
Construir el servicio de supervisión adaptado A LOS DOS DEFECTOS DOCUMENTADOS de la Zero 2 W: el throttling a 85 °C y la radio inestable (errores « brcmfmac ... failed: -5 », cortes seguidos tras la actualización a Bookworm — raspberrypi/firmware#1962). El programa debe, por tanto, sobrevivir a la red: tiempos de espera cortos, captura de errores, bucle que nunca muere y registro local.
Hardware
- 1 Raspberry Pi Zero 2 W en la red (2,4 GHz, WPA2)
- 1 máquina «servidor» local escuchando un POST HTTP (un « python3 -m http.server » basta para probar, o Flask)
- Paquetes: « sudo apt install python3-requests iw » (iw proporciona la medición de la señal)
Código completo
#!/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)
Servicio systemd (reinicio automático si el proceso muere realmente) con « Restart=on-failure » y « RestartSec=10 ».
Verificación esperada
El servidor recibe un POST por minuto con temperatura y RSSI. Prueba de robustez: cortar el Wi-Fi desde el router (« sudo ip link set wlan0 down ») — el script muestra « upload rate » y se reanuda tan pronto como vuelve la red sin reinicio. Bajo carga de CPU, se observa la correlación temperatura↔frecuencia en los datos.
Errores frecuentes
- No poner tiempo de espera en requests: el POST se cuelga durante un corte de brcmfmac y el servicio deja de responder — timeout=5 es innegociable.
- Dejar que las excepciones se propaguen fuera del bucle: un solo fallo no capturado mata el servicio; el try/except debe envolver la subida, no todo el programa.
- Parsear la temperatura con /sys/class/thermal: es posible, pero vcgencmd es la medición de referencia en este SoC.
- Descuidar los 512 MB de RAM: un logger que ponga todo en cola en memoria acabará en OOM; limitar la cola (los últimos 20 puntos bastan).
- Apuntar la URL al exterior: en caso de corte de DNS, el tiempo de espera de DNS puede superar el tiempo de espera HTTP — preferir una IP local.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash