Tableau de bord IoT¶
Objectif : afficher les derniers événements dans une page HTML lisible par un humain.
Ce que vous allez apprendre : combiner IotEventRepository.list_recent et
BaseController.render pour présenter les événements dans un tableau. Après
l'API JSON (côté machine), voici la lecture côté humain.
Dernier palier du niveau intermédiaire de la progression IoT, après Exposer l'API IoT.
Ce que ce starter montre¶
- la lecture des derniers événements (
list_recent) ; - leur affichage dans un tableau HTML via un template Jinja ;
- un état vide clair quand aucun événement n'est encore stocké.
La table iot_events est garantie par la migration livrée.
Classes Forge utilisées¶
| Classe / fonction | Rôle dans ce starter | Référence |
|---|---|---|
IotEventRepository.list_recent |
Lire les derniers événements à afficher. | Forge IoT — stockage |
BaseController.render |
Rendre le tableau de bord HTML. | BaseController |
Tester¶
Ouvrez https://localhost:8000/iot-dashboard : les événements injectés au palier
Simuler une mesure IoT s'affichent dans un tableau. Sans données, la page
affiche un message d'invitation.
Le contrôleur¶
# mvc/controllers/iot_dashboard_controller.py
from forge_mvc_iot.storage import IotEventRepository
class IotDashboardController(BaseController):
@staticmethod
def index(request: Request) -> Response:
try:
events = IotEventRepository().list_recent(limit=50)
except Exception:
events = []
return BaseController.render(
"iot_dashboard/index.html",
context={"events": events},
request=request,
)
Comprendre ce code¶
list_recent(limit=50)renvoie les 50 derniers événements ; on les passe au template via lecontext.- Le
try/exceptgarde la page robuste : pas de table → tableau vide, pas de page d'erreur. - C'est le même repository qu'aux paliers de lecture : on change seulement la sortie (HTML au lieu de JSON).
La vue¶
<!-- mvc/views/iot_dashboard/index.html -->
{% if events %}
<table>
<thead><tr><th>Site</th><th>Capteur</th><th>Type</th><th>Valeur</th><th>Unité</th><th>Horodatage</th></tr></thead>
<tbody>
{% for e in events %}
<tr><td>{{ e.site }}</td><td>{{ e.device_id }}</td><td>{{ e.kind }}</td><td>{{ e.value }}</td><td>{{ e.unit }}</td><td>{{ e.timestamp }}</td></tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>Aucun événement à afficher.</p>
{% endif %}
À retenir¶
- Un tableau de bord =
list_recent+render, rien de plus. - Le même repository alimente l'API JSON et la page HTML.
- Une page de lecture reste robuste quand les données manquent.
Après ce starter¶
Vous avez terminé le niveau intermédiaire : simulation, API, tableau de bord. Faites le point dans le bilan du niveau.