nb_monitor.py
Durante una campaña de pruebas NB-IoT, vigila la estación: este script pyserial lee el puerto serie del MKR NB 1500, cuenta los ciclos publicados y muestra cada línea con palabra clave de error. Un monitor ligero para largas jornadas.
Hardware
Una Arduino MKR NB 1500 (microcontrolador SAMD21, módem u-blox LTE-M/NB-IoT, antena externa, alimentación LiPo en J6 o USB). PC con Python 3 y pyserial, cable USB a la placa, placa alimentada y unida a la red.
Cableado
Basta un cable micro-USB; el puerto ACM nativo del SAMD21 expone el Serial del sketch.
Funcionamiento
readline() consume el flujo sin bloquear (timeout 1 s); la lista MOTS_CLE_ERREUR centraliza la detección y un balance se imprime cada diez eventos.
Ejecución
Instala el paquete Arduino SAMD Boards y la librería MKRNB, selecciona la placa y carga. Prevé una SIM IoT (LTE-M o NB1) activada y buena recepción: la conexión a la red puede tardar varios minutos.
Variantes
Envía los contadores a un panel (InfluxGrafana), añade un aviso por correo tras tres fallos seguidos o registra en SQLite para el histórico.
nb_monitor.py
#!/usr/bin/env python3
"""Surveille les logs serie d'un MKR NB 1500 et alerte sur les echecs.
Usage : python nb_monitor.py [port]
"""
import sys
import time
import serial
MOTS_CLE_ERREUR = ("KO", "ECHEC", "perdu", "restart")
def surveiller(port: str) -> None:
with serial.Serial(port, 9600, timeout=1) as carte:
ok = ko = 0
debut = time.time()
print(f"Surveillance de {port} (Ctrl+C pour finir)")
while True:
ligne = carte.readline().decode(errors="replace").strip()
if not ligne:
continue
if any(m in ligne for m in MOTS_CLE_ERREUR):
ko += 1
print(f"[{time.time() - debut:6.0f}s] ERREUR: {ligne}")
elif "publie" in ligne or "OK" in ligne:
ok += 1
if (ok + ko) % 10 == 0:
print(f"bilan: {ok} OK / {ko} KO")
if __name__ == "__main__":
try:
surveiller(sys.argv[1] if len(sys.argv) > 1 else "/dev/ttyACM0")
except KeyboardInterrupt:
print("\nArrete.")