Aurora HomeAurora HomeDocs
DocsArchitecture

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

ESP32AP WiFi
Orange PiBroker MQTT
Next.jsAPI + SSE
SQLitePrisma ORM
DashboardSSE Client

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/data toutes ~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.ts démarre le client MQTT au boot du serveur Next.js
  • lib/mqtt-client.ts parse les messages, extrait les valeurs numériques, sauvegarde en DB
  • lib/sensor-emitter.ts émet un événement sensor_update via EventEmitter
  • api/sensor-stream/route.ts stream les mises à jour aux clients SSE connectés
  • Authentification Better Auth, gestion des sessions et profils utilisateurs

Couche Frontend — Dashboard React

  • Hook useSensorData ouvre une connexion SSE et maintient l'état React
  • Les données initiales sont chargées côté serveur via getInitialDataPoints
  • Hook useAnimatedValue pour 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 :

Payload MQTT (topic: sensor/data)
{
  "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.