MQTT & Capteurs
Communication en temps réel entre le firmware ESP32 et l'application Next.js via le protocole MQTT.
Configuration du broker
Broker
Mosquitto (Orange Pi 3 LTS)IP par défaut
192.168.4.2Port
1883Protocol
MQTT 3.1.1Topic
sensor/dataQoS
0 (fire and forget)L'IP du broker est configurable via la variable d'environnement MQTT_BROKER_URL dans le .env. L'ESP32 scanne automatiquement les IPs 192.168.4.2 à 192.168.4.5 pour trouver le broker.
Format du payload
L'ESP32 publie un objet JSON à chaque cycle de lecture réussie (~toutes les 10 secondes) :
{
"temperature": "22.50 °C",
"humidity": "55.10 %",
"pressure": "1013.25 hPa",
"co2": "650 ppm",
"light": "320 lx"
}Les valeurs sont des chaînes de caractères incluant l'unité. Le serveur Next.js utilise une regex pour extraire la partie numérique avant stockage en base.
Les 3 capteurs I2C
SCD30 (Sensirion)
0x61Capteur NDIR pour CO₂. Adresse fixe. Déclencheur principal du cycle de publication — publie uniquement quand SCD30 signale 'data ready'.
Sensirion I2C SCD30@^1.0.0SDA: GPIO21, SCL: GPIO22, VCC: 3.3VBME280 (Bosch)
0x76 / 0x77Auto-détecté sur 0x76, puis 0x77 en fallback. Mode NORMAL avec oversampling. Température et humidité fusionnées avec SCD30.
Adafruit BME280 Library@^2.3.0SDA: GPIO21, SCL: GPIO22, VCC: 3.3VBH1750
0x23Mode CONTINUOUS_HIGH_RES_MODE. ADDR pin connecté à GND pour adresse 0x23. Non bloquant — lecture uniquement si measurementReady().
claws/BH1750@^1.3.0SDA: GPIO21, SCL: GPIO22, VCC: 3.3V, ADDR: GNDFusion des données
Moyenne SCD30 + BME280
La température et l'humidité sont mesurées par deux capteurs différents. Le firmware calcule la moyenne pour réduire les erreurs de mesure individuelles.
// Fusion des mesures
float avg_temp = (scd_temp + bme_temp) / 2.0;
float avg_hum = (scd_hum + bme_hum) / 2.0;
// Pression uniquement BME280
// CO2 uniquement SCD30
// Lumière uniquement BH1750Cycle de vie MQTT côté Next.js
instrumentation.tsstartMqttClient() appelé au démarrage du serveur
lib/mqtt-client.tsclient.on('connect') → subscribe('sensor/data')
client.on('message')Parse JSON, extrait les 5 valeurs numériques
dataPointRepository.create()5 enregistrements DataPoint créés en SQLite
sensorEmitter.emit('sensor_update')EventEmitter notifie tous les streams SSE actifs
useSensorData hookReact re-render avec les nouvelles valeurs
Reconnexion automatique
Le client MQTT Next.js se reconnecte automatiquement en cas de déconnexion (reconnectPeriod: 5000ms, connectTimeout: 10000ms). Côté ESP32, la fonctionreconnect() re-scanne les IPs du réseau AP en cas de perte de connexion broker.