Automatisation IoT

Automatisation de serre avec MQTT et Node-RED : ventilation, chauffage et brumisation

Automatisez une serre avec MQTT : les capteurs publient les données climatiques, un flow Node-RED décide quand aérer, chauffer ou brumiser grâce à l'hystérésis, et les nœuds relais agissent avec des sécurités locales.

Installation d'automatisation de serre avec capteurs de température et d'humidité, ventilateur d'extraction, chauffage et buses de brumisation pilotés via MQTT
Essayez-le sur votre propre broker MQTTObtenez un broker MQTT privé et managé avec l’offre Free et partez d’exemples de code prêts à l’emploi.
Essayer gratuitement Exemples de code Aucune carte bancaire requise

L'automatisation de serre maintient la température et l'humidité dans la plage dont vos plantes ont besoin en commutant automatiquement ventilateurs, chauffage et brumisation, au lieu de compter sur quelqu'un pour ouvrir les ouvrants au bon moment. Dans ce tutoriel, vous allez concevoir les topics MQTT, écrire un flow Node-RED qui commande trois actionneurs avec hystérésis et verrouillages, ajouter un chien de garde contre les données périmées, et rendre les nœuds relais sûrs par eux-mêmes en cas de coupure réseau.

L'architecture

Le système comporte trois parties qui ne communiquent qu'à travers un broker MQTT :

 Climate sensor (ESP32 + SHT31/BME280)
        |  publishes telemetry every 30 s
        v
   MQTT broker  <---->  Node-RED (decision logic)
        ^                     |
        |  publishes /set     |
        +---------------------+
        |
 Relay node (ESP32 + 3 relays): fan, heater, mister
        publishes /state after acting

Séparer la mesure, la logique et l'actionnement présente de réels avantages. Vous pouvez remplacer le capteur sans toucher à la logique, modifier les consignes depuis un téléphone sans rien reflasher, et ajouter plus tard un tableau de bord ou un enregistreur de données comme simple abonné supplémentaire. Si vous avez besoin d'un rappel sur les brokers, lisez d'abord le rôle d'un broker MQTT.

Conception des topics pour l'automatisation de serre

Utilisez le serveur MQTT public gratuit pendant la construction. Remplacez g2w6n3 par votre propre chaîne aléatoire, car ce serveur est partagé, lisible par tous et réservé aux tests.

Topic Sens Payload Retained
connectmq/demo/g2w6n3/greenhouse/climate capteur vers tous {"temp":27.4,"hum":58.2} oui
connectmq/demo/g2w6n3/greenhouse/setpoints téléphone/tableau de bord vers Node-RED {"heat_on":12,"vent_on":28,"mist_on":45} oui
connectmq/demo/g2w6n3/greenhouse/fan/set Node-RED vers relais ON / OFF non
connectmq/demo/g2w6n3/greenhouse/heater/set Node-RED vers relais ON / OFF non
connectmq/demo/g2w6n3/greenhouse/mister/set Node-RED vers relais ON / OFF non
connectmq/demo/g2w6n3/greenhouse/<actuator>/state relais vers tous ON / OFF oui
connectmq/demo/g2w6n3/greenhouse/alarm Node-RED vers tous {"type":"stale_sensor"} non

Les consignes sont retained afin que Node-RED reçoive les valeurs courantes immédiatement après un redémarrage. Les commandes ne le sont pas, pour qu'un relais qui redémarre ne rejoue pas une ancienne instruction.

Construire le flow Node-RED

Créez le flow avec les nœuds suivants. Si vous débutez avec Node-RED, le tutoriel Node-RED MQTT couvre les bases de la configuration du broker.

Nœud Paramètres
Configuration mqtt-broker Serveur broker.connectmq.com, port 1883, client ID nodered-gh-g2w6n3, protocole MQTT 3.1.1
mqtt in « climate » Topic connectmq/demo/g2w6n3/greenhouse/climate, sortie « un objet JSON analysé »
mqtt in « setpoints » Topic connectmq/demo/g2w6n3/greenhouse/setpoints, sortie « un objet JSON analysé »
function « climate logic » Code ci-dessous, 1 sortie, reliée depuis les deux nœuds mqtt in
mqtt out « actuators » Topic vide (repris de msg.topic), QoS 1, retain false
inject « watchdog tick » Répétition toutes les 60 secondes
function « watchdog » Code ci-dessous, relié au même mqtt out

La fonction de logique climatique

const BASE = "connectmq/demo/g2w6n3/greenhouse";

// Valeurs par défaut, remplacées par le message de consignes retained
const sp = flow.get("sp") || { heat_on: 12, heat_off: 14, vent_on: 28, vent_off: 25, mist_on: 45, mist_off: 55, mist_max_temp: 35 };

if (msg.topic.endsWith("/setpoints")) {
    const p = msg.payload || {};
    if (p.heat_on !== undefined) { sp.heat_on = p.heat_on; sp.heat_off = p.heat_on + 2; }
    if (p.vent_on !== undefined) { sp.vent_on = p.vent_on; sp.vent_off = p.vent_on - 3; }
    if (p.mist_on !== undefined) { sp.mist_on = p.mist_on; sp.mist_off = p.mist_on + 10; }
    flow.set("sp", sp);
    node.status({ fill: "blue", shape: "ring", text: "setpoints " + JSON.stringify(p) });
    return null;
}

const t = Number(msg.payload.temp);
const h = Number(msg.payload.hum);
if (!Number.isFinite(t) || !Number.isFinite(h) || t < -20 || t > 60 || h < 0 || h > 100) {
    node.warn("Implausible reading ignored: " + JSON.stringify(msg.payload));
    return null;
}
flow.set("lastSeen", Date.now());

const st = flow.get("state") || { fan: "OFF", heater: "OFF", mister: "OFF" };
const next = Object.assign({}, st);

// Chauffage avec hystérésis
if (t <= sp.heat_on) next.heater = "ON";
else if (t >= sp.heat_off) next.heater = "OFF";

// Ventilation avec hystérésis
if (t >= sp.vent_on) next.fan = "ON";
else if (t <= sp.vent_off) next.fan = "OFF";

// Brumisation uniquement s'il fait assez chaud pour évaporer, sans refroidir excessivement la culture
if (h <= sp.mist_on && t > 18 && t < sp.mist_max_temp) next.mister = "ON";
else if (h >= sp.mist_off || t <= 18) next.mister = "OFF";

// Verrouillages : ne jamais chauffer et ventiler en même temps, ne jamais brumiser pendant le chauffage
if (next.heater === "ON") { next.fan = "OFF"; next.mister = "OFF"; }

flow.set("state", next);

const out = [];
for (const a of ["fan", "heater", "mister"]) {
    if (next[a] !== st[a] || msg.forceSend) {
        out.push({ topic: `${BASE}/${a}/set`, payload: next[a] });
    }
}
node.status({ fill: "green", shape: "dot", text: `${t}°C ${h}% F:${next.fan} H:${next.heater} M:${next.mister}` });
return [out];

Retourner [out] envoie chaque message du tableau, l'un après l'autre, par l'unique sortie vers le nœud mqtt out. Les commandes ne sont envoyées que lorsqu'un état change, ce qui limite le trafic et garde les journaux du relais lisibles.

La fonction chien de garde

const BASE = "connectmq/demo/g2w6n3/greenhouse";
const last = flow.get("lastSeen") || 0;
const ageMin = (Date.now() - last) / 60000;

if (last && ageMin > 5 && !flow.get("staleAlarm")) {
    flow.set("staleAlarm", true);
    flow.set("state", { fan: "OFF", heater: "OFF", mister: "OFF" });
    return [[
        { topic: `${BASE}/heater/set`, payload: "OFF" },
        { topic: `${BASE}/mister/set`, payload: "OFF" },
        { topic: `${BASE}/alarm`, payload: JSON.stringify({ type: "stale_sensor", minutes: Math.round(ageMin) }) }
    ]];
}
if (ageMin <= 5) flow.set("staleAlarm", false);
return null;

Si le capteur cesse d'émettre, le chien de garde coupe le chauffage et la brumisation, car agir sur des données périmées est pire que ne rien faire. Le ventilateur n'est pas touché ; en l'absence de données, c'est la sécurité propre au relais (voir ci-dessous) qui décide.

Tester le flow

Simulez un après-midi chaud et sec, puis une nuit froide :

mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-g2w6n3 -r \
  -t 'connectmq/demo/g2w6n3/greenhouse/climate' -m '{"temp":30.2,"hum":40}'

mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-g2w6n3 -r \
  -t 'connectmq/demo/g2w6n3/greenhouse/climate' -m '{"temp":10.5,"hum":80}'

mosquitto_sub -h broker.connectmq.com -p 1883 -i mon-g2w6n3 \
  -t 'connectmq/demo/g2w6n3/greenhouse/+/set' -v

Le premier message doit allumer le ventilateur et la brumisation ; le second doit les éteindre tous les deux et allumer le chauffage. Modifiez les consignes en direct en publiant {"vent_on":26} sur le topic des consignes.

Rendre le nœud relais sûr par lui-même

Node-RED décide, mais le nœud relais ne doit jamais faire aveuglément confiance au réseau. Intégrez ces règles à son firmware :

  1. Durée de fonctionnement maximale par actionneur. La brumisation se coupe d'elle-même au bout de, disons, cinq minutes, même si aucun OFF n'arrive. Une vanne bloquée peut noyer une culture.
  2. Coupure locale en cas de surchauffe. Si le nœud relais dispose de sa propre sonde de température, il coupe le chauffage au-delà d'une limite absolue, quelles que soient les commandes.
  3. État sûr en cas de déconnexion. Lorsque MQTT est coupé depuis plus d'une minute, chauffage et brumisation s'arrêtent. Décidez si le ventilateur doit s'allumer ou s'éteindre selon votre climat ; dans les régions chaudes, la ventilation est généralement le choix par défaut le plus sûr.
  4. Publier l'état après avoir agi. Les topics /state montrent ce qui s'est réellement passé, ce qui permet à Node-RED et aux tableaux de bord de détecter un relais qui ignore les commandes.
  5. Last will. Connectez-vous avec un will offline retained sur un topic de statut, afin qu'un relais absent soit immédiatement visible.

Pour le câblage des relais et un sketch ESP32 qui s'abonne aux topics de commande, consultez le tutoriel relais ESP32 MQTT. Les chauffages et ventilateurs en tension secteur doivent être commutés par des contacteurs correctement dimensionnés, installés par une personne qualifiée.

Conseils de réglage

  • Des écarts d'hystérésis de 2 à 3 °C évitent les cycles courts, qui usent relais et moteurs.
  • L'emplacement du capteur compte davantage que sa précision : protégez-le du soleil direct, montez-le à hauteur des plantes et assurez-lui une circulation d'air.
  • Des consignes de jour et de nuit sont faciles à ajouter : un nœud inject au lever et au coucher du soleil peut publier de nouvelles consignes retained.
  • Enregistrez tout. Un flow Node-RED ou une instance Telegraf abonnés à greenhouse/# vous donnent l'historique nécessaire pour ajuster les consignes au fil d'une saison.

Pour une vue d'ensemble des capteurs, de la connectivité et de la conception des topics à l'échelle d'une exploitation, lisez le guide agriculture intelligente IoT, et associez cette serre au système d'arrosage automatique pour l'irrigation.

Surveiller la serre à distance

Une automatisation n'est digne de confiance que si vous pouvez voir ce qu'elle fait. Trois vues couvrent la plupart des besoins. Une page Node-RED Dashboard avec des jauges de température et d'humidité, des interrupteurs reflétant les topics /state des actionneurs et des curseurs qui publient de nouvelles consignes offre aux producteurs un panneau de commande simple sur téléphone. Un historien, comme Telegraf écrivant dans InfluxDB, vous permet de comparer les nuits de cette semaine avec celles de la semaine passée et de repérer un chauffage qui tourne plus longtemps qu'avant. Enfin, une vue des topics en direct côté broker montre chaque message de commande et d'état au moment où il passe.

Lorsque le broker est ConnectMQ, l'explorateur de topics en direct et le tableau de bord du portail fournissent cette dernière vue sans rien installer, et le client MQTT intégré au navigateur est pratique pour publier une consigne de test depuis un ordinateur portable dans la serre. Quel que soit l'outil, comparez régulièrement /set et /state : une commande jamais confirmée signale un relais défaillant, un fil desserré ou un nœud qui a perdu le Wi-Fi.

Passer en production

Une fois la logique au point, quittez le serveur MQTT public gratuit. Créez un broker privé, basculez le nœud mqtt-broker sur le port 8883 avec TLS activé, et saisissez le nom d'utilisateur, le mot de passe et le client ID qui vous ont été délivrés. Chaque appareil reçoit ses propres identifiants. Un broker MQTT managé maintient le broker en fonctionnement même quand le PC de la serre s'arrête, et vous permet de consulter le climat de n'importe où. Le guide de l'automatisation IoT montre comment ce modèle s'étend aux maisons et aux bâtiments.

Faites tourner votre serre sur ConnectMQ

ConnectMQ offre à votre serre un broker privé avec TLS, un explorateur de topics en direct pour suivre commandes et états, et des règles d'alerte à seuil comme alarme de secours contre le gel ou la surchauffe. Créez un broker Serverless gratuit sur app.connectmq.com, sans carte bancaire, et pointez-y Node-RED et vos nœuds ESP32.

Questions fréquentes

L'automatisation de serre peut-elle fonctionner sans internet ?

Oui, si le broker et Node-RED sont sur le réseau local. Avec un broker cloud, vous gagnez l'accès à distance : placez donc les sécurités critiques dans le firmware des relais pour que la serre reste protégée en cas de coupure.

Quel capteur de température est le meilleur pour une serre ?

Un SHT31 ou SHT4x supporte mieux l'humidité élevée qu'un DHT22. Quel que soit votre choix, protégez-le du soleil direct avec un abri anti-rayonnement ventilé.

Pourquoi mon ventilateur s'allume-t-il et s'éteint-il sans arrêt ?

L'écart entre les seuils d'allumage et d'extinction est trop faible, ou le capteur se trouve dans le flux d'air du ventilateur. Élargissez l'hystérésis et déplacez le capteur.

Est-ce à Node-RED ou à l'ESP32 de prendre les décisions de commande ?

Utilisez Node-RED pour la logique flexible et les consignes, et gardez des limites de sécurité simples sur l'ESP32 pour que les actionneurs se mettent en position sûre en cas de perte de connexion.

Articles liés

Guide d'installation de Zigbee2MQTT : du coordinateur au tableau de bord

Installez Zigbee2MQTT avec Docker, configurez le coordinateur et la connexion MQTT, appairez et renommez les appareils, pilotez-les via MQTT et affichez leurs états sur un tableau de bord, en testant d'abord sur le serveur MQTT public gratuit.

8 min de lecture

Tous les articles →

Votre broker MQTT privé, à quelques clics

Créez un compte, récupérez les identifiants de votre broker et connectez votre premier appareil — aucun serveur à installer, mettre à jour ou dimensionner.