Aller au contenu

Les événements d'un capteur

Objectif : lire les événements d'un capteur précis et leur nombre, via une
route paramétrée.

Ce que vous allez apprendre : cibler un capteur par site et device_id
avec IotEventRepository.find_by_device, et compter ses événements avec
count_by_device. C'est la lecture filtrée, après le flux global du palier
précédent.

Dernier palier du niveau débutant de la progression IoT, après
Lire les événements IoT.

Ce que ce starter montre

  • une route paramétrée /iot-device/{site}/{device_id} ;
  • les événements d'un capteur via find_by_device ;
  • le nombre d'événements via count_by_device ;
  • la même réponse 503 pédagogique si la table n'existe pas encore.

Lecture seule, aucun broker.

Classes Forge utilisées

Classe / fonction Rôle dans ce starter Référence
request.route Lire site et device_id dans l'URL. Request
IotEventRepository.find_by_device Événements d'un capteur (ordre du plus récent). Forge IoT : stockage
IotEventRepository.count_by_device Nombre d'événements d'un capteur. Forge IoT : stockage

Tester

forge run

Ouvrez https://localhost:8000/iot-device/atelier/capteur-1. La réponse JSON
donne le site, le device_id, le count et la liste events de ce capteur
(ou 503 tant que la table n'est pas créée).

Le contrôleur

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

# mvc/controllers/iot_device_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.storage import IotEventRepository


_STORAGE_NOT_READY = {
    "error": "iot_storage_not_ready",
    "message": (
        "La table iot_events n'est pas encore disponible. "
        "Applique la migration Forge IoT (forge iot:init) avant de lire "
        "les événements."
    ),
}


class IotDeviceController(BaseController):
    """Starter pédagogique : lire les événements d'un capteur précis."""

    @staticmethod
    def index(request: Request) -> Response:
        site = request.route("site")
        device_id = request.route("device_id")
        repo = IotEventRepository()
        try:
            events = repo.find_by_device(site, device_id, limit=20)
            count = repo.count_by_device(site, device_id)
        except Exception:
            return Response.json(_STORAGE_NOT_READY, status=503)
        return Response.json({
            "site": site,
            "device_id": device_id,
            "count": count,
            "events": events,
        })

Comprendre ce code

  • site et device_id viennent de l'URL (route) : on cible le
    capteur sans query string.
  • find_by_device(...) filtre les événements de ce capteur ; count_by_device
    donne le total : deux lectures complémentaires du même repository.
  • Comme au palier précédent, l'absence de table devient un 503 pédagogique.

La route

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

# mvc/routes.py
from mvc.controllers.iot_device_controller import IotDeviceController

with router.group("", public=True) as public:
    public.add("GET", "/iot-device/{site}/{device_id}", IotDeviceController.index, name="iot_device_index")

À retenir

  • find_by_device(site, device_id) filtre les événements d'un capteur.
  • count_by_device(site, device_id) en donne le nombre.
  • Une route paramétrée cible une ressource précise via route.

Après ce starter

Vous avez terminé le niveau débutant : configuration, flux global, lecture
par capteur. Faites le point dans le bilan du niveau.

Bilan du niveau débutant