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
503pé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¶
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¶
siteetdevice_idviennent 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
503pé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.