Aurora HomeAurora HomeDocs
DocsMQTT & Capteurs

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.2

Port

1883

Protocol

MQTT 3.1.1

Topic

sensor/data

QoS

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) :

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

0x61
CO₂ (ppm)Température (°C)Humidité (%)

Capteur NDIR pour CO₂. Adresse fixe. Déclencheur principal du cycle de publication — publie uniquement quand SCD30 signale 'data ready'.

Librairie : Sensirion I2C SCD30@^1.0.0
Câblage : SDA: GPIO21, SCL: GPIO22, VCC: 3.3V

BME280 (Bosch)

0x76 / 0x77
Température (°C)Humidité (%)Pression (hPa)

Auto-détecté sur 0x76, puis 0x77 en fallback. Mode NORMAL avec oversampling. Température et humidité fusionnées avec SCD30.

Librairie : Adafruit BME280 Library@^2.3.0
Câblage : SDA: GPIO21, SCL: GPIO22, VCC: 3.3V

BH1750

0x23
Luminosité (lux)

Mode CONTINUOUS_HIGH_RES_MODE. ADDR pin connecté à GND pour adresse 0x23. Non bloquant — lecture uniquement si measurementReady().

Librairie : claws/BH1750@^1.3.0
Câblage : SDA: GPIO21, SCL: GPIO22, VCC: 3.3V, ADDR: GND

Fusion 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.

src/main.cpp (fusion)
// 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 BH1750

Cycle de vie MQTT côté Next.js

1
Boot Next.jsinstrumentation.ts

startMqttClient() appelé au démarrage du serveur

2
Connexion MQTTlib/mqtt-client.ts

client.on('connect') → subscribe('sensor/data')

3
Message reçuclient.on('message')

Parse JSON, extrait les 5 valeurs numériques

4
Stockage DBdataPointRepository.create()

5 enregistrements DataPoint créés en SQLite

5
Broadcast SSEsensorEmitter.emit('sensor_update')

EventEmitter notifie tous les streams SSE actifs

6
Dashboard mis à jouruseSensorData hook

React 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.