Aller au contenu

Diagnostiquer le module IoT

Objectif : vérifier que le module IoT est sain et savoir où chercher quand il ne l'est pas.

Ce que vous allez apprendre : le diagnostic Forge IoT.
La commande forge iot:doctor vérifie l'ensemble (paquet, configuration, API, base, broker).
Ce starter expose en JSON son sous-ensemble non invasif, les contrôles qui ne touchent ni la base ni le broker, directement dans l'application.

Dernier palier du niveau avancé de la progression IoT, après Le subscriber MQTT.

Ce que ce starter montre

  • l'appel des vérifications non invasives du diagnostic :
    • check_package_importable : le paquet est installé,
    • check_config_loadable : la configuration se charge,
    • check_http_api_registrable : l'API HTTP peut être branchée ;
  • un statut global healthy + le détail de chaque contrôle, en JSON.

Le diagnostic complet (table en base, connexion broker) reste la commande forge iot:doctor.

Classes Forge utilisées

Classe / fonction Rôle dans ce starter Référence
check_package_importable / check_config_loadable / check_http_api_registrable Vérifications de diagnostic non invasives. Forge IoT : doctor
forge iot:doctor (CLI) Diagnostic complet (avec --db, --mqtt). Forge IoT : doctor

Tester

forge run

Ouvrez https://localhost:8000/iot-doctor : la réponse JSON donne healthy et la liste des contrôles avec leur statut.
Pour le diagnostic complet, en ligne de commande :

forge iot:doctor          # config + paquet + API
forge iot:doctor --db     # + vérifie la table iot_events
forge iot:doctor --mqtt   # + teste la connexion au broker

Le contrôleur

Créez le fichier ci-dessous, complet et copiable tel quel.

# mvc/controllers/iot_doctor_controller.py
from core.http.request import Request
from core.http.response import Response
from core.mvc.controller.base_controller import BaseController

from forge_mvc_iot.cli.doctor import (
    check_config_loadable,
    check_http_api_registrable,
    check_package_importable,
)


# Vérifications sûres : aucune ne touche la base ni le broker.
_SAFE_CHECKS = (
    check_package_importable,
    check_config_loadable,
    check_http_api_registrable,
)


class IotDoctorController(BaseController):
    """Starter pédagogique : diagnostic IoT non invasif exposé en JSON."""

    @staticmethod
    def index(request: Request) -> Response:
        checks = []
        for check in _SAFE_CHECKS:
            result = check()
            checks.append({
                "status": result.status,
                "label": result.label,
                "detail": result.detail,
            })
        healthy = all(c["status"] == "ok" for c in checks)
        return Response.json({"healthy": healthy, "checks": checks})

Comprendre ce code

  • On n'appelle que les contrôles sûrs : aucun ne touche la base ni le broker, donc la route reste rapide et sans effet de bord.
  • Chaque contrôle renvoie un status, un label et un detail : on les expose tels quels.
  • Pour les contrôles invasifs (table, broker), on délègue à la CLI forge iot:doctor, qui les active explicitement via --db / --mqtt.

La route

Déclarez la route dans mvc/routes/__init__.py, à l'intérieur du groupe public.

# mvc/routes/__init__.py
from mvc.controllers.iot_doctor_controller import IotDoctorController

with router.group("", public=True) as public:
    public.add("GET", "/iot-doctor", IotDoctorController.index, name="iot_doctor_index")

À retenir

  • forge iot:doctor diagnostique le module ; ses contrôles non invasifs sont réutilisables en application.
  • Un diagnostic sépare le sûr (config, paquet) de l'invasif (base, broker) : on n'effleure l'infrastructure que sur demande.
  • Savoir diagnostiquer fait partie de l'exploitation d'un module en production.

Après ce starter

Vous avez terminé le niveau avancé et toute la progression IoT : contrat, subscriber temps réel, diagnostic.
Faites le point dans le bilan du niveau.

Bilan du niveau avancé