Architecture du système
Vue d'ensemble de la communication entre l'ESP32, le broker MQTT et l'application web Next.js.
Schéma global
Les 3 couches du système
Couche ESP32 — Collecte des données
- Crée un réseau WiFi en mode Access Point (SSID: "ESP32-AP-Broker")
- Lit les capteurs I2C : SCD30 (CO₂/temp/hum), BME280 (temp/hum/pres), BH1750 (lumière)
- Fusionne temp et humidité (moyenne SCD30 + BME280) pour plus de précision
- Publie un payload JSON sur topic
sensor/datatoutes ~10s (déclenché par SCD30 data-ready) - Scanne les IPs 192.168.4.2–5 pour trouver le broker MQTT automatiquement
Couche Serveur — Next.js App
instrumentation.tsdémarre le client MQTT au boot du serveur Next.jslib/mqtt-client.tsparse les messages, extrait les valeurs numériques, sauvegarde en DBlib/sensor-emitter.tsémet un événementsensor_updatevia EventEmitterapi/sensor-stream/route.tsstream les mises à jour aux clients SSE connectés- Authentification Better Auth, gestion des sessions et profils utilisateurs
Couche Frontend — Dashboard React
- Hook
useSensorDataouvre une connexion SSE et maintient l'état React - Les données initiales sont chargées côté serveur via
getInitialDataPoints - Hook
useAnimatedValuepour les transitions numériques fluides - Recharts AreaChart pour les graphiques historiques
- Application PWA installable via next-pwa + service worker
Format du payload MQTT
L'ESP32 publie sur le topic sensor/data un message JSON avec les valeurs brutes incluant leurs unités :
{
"temperature": "22.50 °C",
"humidity": "55.10 %",
"pressure": "1013.25 hPa",
"co2": "650 ppm",
"light": "320 lx"
}Note : les valeurs sont des chaînes avec unité. Le serveur Next.js extrait la partie numérique avant de stocker dans la base de données.
Décisions architecturales clés
ESP32 en mode Access Point
L'ESP32 crée son propre réseau WiFi plutôt que de se connecter au WiFi domestique. Cela simplifie la configuration initiale : aucune saisie de credentials WiFi nécessaire, l'Orange Pi se connecte directement à l'ESP32.
Fusion des capteurs température/humidité
La température et l'humidité sont mesurées par deux capteurs (SCD30 et BME280) puis moyennées. Cela réduit l'erreur de mesure individuelle et offre une redondance en cas de défaillance d'un capteur.
instrumentation.ts pour le démarrage MQTT
Next.js 14+ propose instrumentation.ts comme point d'entrée pour les effets de démarrage côté serveur. C'est l'endroit idéal pour initialiser la connexion MQTT sans avoir besoin d'un serveur Node.js séparé.
EventEmitter + SSE pour le temps réel
Au lieu de WebSockets, le projet utilise Server-Sent Events (unidirectionnel serveur → client). Le broker interne EventEmitter découple la réception MQTT de la diffusion SSE, permettant plusieurs clients simultanés.