nb_monitor.py
Pendant une campagne de tests NB-IoT, gardez un œil sur la station : ce script pyserial lit le port série du MKR NB 1500, compte les cycles publiés et affiche en rouge chaque ligne contenant un mot-clé d'erreur. Un moniteur léger pour longues durées.
Matériel requis
Une Arduino MKR NB 1500 (microcontrôleur SAMD21, modem u-blox LTE-M/NB-IoT, antenne externe, alimentation LiPo sur J6 ou USB). PC avec Python 3 et pyserial, câble USB vers la carte, carte alimentée et connectée au réseau.
Câblage
Un câble micro-USB suffit ; le port ACM natif du SAMD21 expose le Serial du croquis.
Fonctionnement
readline() consomme le flux sans bloquer le script (timeout 1 s) ; la liste MOTS_CLE_ERREUR centralise la détection, et un bilan est affiché tous les dix événements.
Exécution
Installez le package Arduino SAMD Boards et la bibliothèque MKRNB, sélectionnez la carte, téléversez. Prévoyez une carte SIM IoT (LTE-M ou NB1) activée et une bonne réception : l'attachement au réseau peut demander plusieurs minutes.
Variantes
Poussez les compteurs vers un tableau de bord (InfluxGrafana), ajoutez une notification courriel après trois échecs consécutifs, ou loguez en SQLite pour l'historique.
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.")