IoT-Automatisierung

Gewächshaus-Automatisierung mit MQTT und Node-RED: Lüfter, Heizung und Nebelung

Automatisieren Sie ein Gewächshaus mit MQTT: Sensoren veröffentlichen Klimadaten, ein Node-RED-Flow entscheidet mit Hysterese über Lüften, Heizen und Nebeln, und Relaisknoten schalten mit lokalen Failsafes.

Aufbau zur Gewächshaus-Automatisierung mit Temperatur- und Feuchtesensoren, Abluftventilator, Heizung und Nebeldüsen, gesteuert über MQTT
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

Gewächshaus-Automatisierung hält Temperatur und Luftfeuchte in dem Bereich, den Ihre Pflanzen brauchen, indem sie Lüfter, Heizung und Nebelung automatisch schaltet, statt darauf zu vertrauen, dass jemand im richtigen Moment die Lüftungsklappen öffnet. In diesem Tutorial entwerfen Sie die MQTT-Topics, schreiben einen Node-RED-Flow, der drei Aktoren mit Hysterese und Verriegelungen steuert, ergänzen einen Watchdog für veraltete Daten und machen die Relaisknoten so, dass sie auch bei Netzwerkausfall von sich aus sicher bleiben.

Die Architektur

Das System besteht aus drei Teilen, die nur über einen MQTT-Broker kommunizieren:

 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

Die Trennung von Erfassung, Logik und Aktorik hat echte Vorteile. Sie können den Sensor austauschen, ohne die Logik anzufassen, Sollwerte vom Smartphone aus ändern, ohne etwas neu zu flashen, und später ein Dashboard oder einen Datenlogger als weiteren Subscriber ergänzen. Wenn Sie eine Auffrischung zu Brokern brauchen, lesen Sie zuerst, was ein MQTT-Broker macht.

Topic-Design für die Gewächshaus-Automatisierung

Verwenden Sie während des Aufbaus den öffentlichen MQTT-Broker, der für Tests und Prototypen gedacht ist. Ersetzen Sie g2w6n3 durch Ihre eigene Zufallszeichenfolge, denn der öffentliche MQTT-Broker wird geteilt und ist für jeden lesbar.

Topic Richtung Payload Retained
connectmq/demo/g2w6n3/greenhouse/climate Sensor an alle {"temp":27.4,"hum":58.2} ja
connectmq/demo/g2w6n3/greenhouse/setpoints Smartphone/Dashboard an Node-RED {"heat_on":12,"vent_on":28,"mist_on":45} ja
connectmq/demo/g2w6n3/greenhouse/fan/set Node-RED an Relais ON / OFF nein
connectmq/demo/g2w6n3/greenhouse/heater/set Node-RED an Relais ON / OFF nein
connectmq/demo/g2w6n3/greenhouse/mister/set Node-RED an Relais ON / OFF nein
connectmq/demo/g2w6n3/greenhouse/<actuator>/state Relais an alle ON / OFF ja
connectmq/demo/g2w6n3/greenhouse/alarm Node-RED an alle {"type":"stale_sensor"} nein

Sollwerte sind retained, damit Node-RED nach einem Neustart sofort die aktuellen Werte erhält. Befehle sind nicht retained, damit ein neu startendes Relais keine alte Anweisung erneut ausführt.

Den Node-RED-Flow aufbauen

Erstellen Sie den Flow mit diesen Nodes. Wenn Node-RED neu für Sie ist, behandelt das Node-RED-MQTT-Tutorial die Grundlagen der Broker-Konfiguration.

Node Einstellungen
mqtt-broker-Konfiguration Server broker.connectmq.com, Port 1883, Client ID nodered-gh-g2w6n3, Protokoll MQTT 3.1.1
mqtt in "climate" Topic connectmq/demo/g2w6n3/greenhouse/climate, Ausgabe "a parsed JSON object"
mqtt in "setpoints" Topic connectmq/demo/g2w6n3/greenhouse/setpoints, Ausgabe "a parsed JSON object"
function "climate logic" Code unten, 1 Ausgang, verbunden mit beiden mqtt in-Nodes
mqtt out "actuators" Topic leer (wird aus msg.topic übernommen), QoS 1, Retain false
inject "watchdog tick" Wiederholung alle 60 Sekunden
function "watchdog" Code unten, verbunden mit demselben mqtt out

Die Funktion für die Klimalogik

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

// Standardwerte, überschrieben durch die retained Sollwertnachricht
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);

// Heizen mit Hysterese
if (t <= sp.heat_on) next.heater = "ON";
else if (t >= sp.heat_off) next.heater = "OFF";

// Lüften mit Hysterese
if (t >= sp.vent_on) next.fan = "ON";
else if (t <= sp.vent_off) next.fan = "OFF";

// Nebeln nur, wenn es warm genug zum Verdunsten ist und die Kultur nicht auskühlt
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";

// Verriegelungen: nie gleichzeitig heizen und lüften, nie beim Heizen nebeln
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];

Mit return [out] wird jede Nachricht im Array nacheinander über den einzigen Ausgang an den mqtt out-Node gesendet. Befehle werden nur bei einer Zustandsänderung gesendet; das hält den Datenverkehr gering und die Relaisprotokolle lesbar.

Die Watchdog-Funktion

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;

Wenn der Sensor keine Daten mehr meldet, schaltet der Watchdog Heizung und Nebelung ab, denn auf Basis alter Daten zu handeln ist schlimmer, als nichts zu tun. Der Lüfter bleibt unangetastet; ohne Daten entscheidet der eigene Failsafe des Relais (siehe unten).

Den Flow testen

Simulieren Sie einen heißen, trockenen Nachmittag und anschließend eine kalte Nacht:

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

Die erste Nachricht sollte Lüfter und Nebelung einschalten; die zweite sollte beide ausschalten und die Heizung einschalten. Ändern Sie Sollwerte live, indem Sie {"vent_on":26} auf das Sollwert-Topic veröffentlichen.

Den Relaisknoten eigenständig sicher machen

Node-RED entscheidet, aber der Relaisknoten darf dem Netzwerk nie blind vertrauen. Bauen Sie diese Regeln in seine Firmware ein:

  1. Maximale Laufzeit pro Aktor. Die Nebelung schaltet sich zum Beispiel nach fünf Minuten selbst ab, auch wenn kein OFF eintrifft. Ein hängendes Ventil kann eine Kultur ertränken.
  2. Lokale Übertemperaturabschaltung. Hat der Relaisknoten einen eigenen Temperaturfühler, schaltet er die Heizung oberhalb eines harten Grenzwerts unabhängig von Befehlen ab.
  3. Sicherer Zustand bei Verbindungsverlust. Fällt MQTT länger als eine Minute aus, gehen Heizung und Nebelung aus. Entscheiden Sie für Ihr Klima, ob der Lüfter an- oder ausgehen soll; in heißen Regionen ist Lüften meist der sicherere Standard.
  4. Nach dem Schalten den Zustand veröffentlichen. Die /state-Topics zeigen, was tatsächlich passiert ist; so erkennen Node-RED und Dashboards ein Relais, das Befehle ignoriert.
  5. Last Will. Verbinden Sie sich mit einem retained offline-Will auf einem Status-Topic, damit ein fehlendes Relais sofort sichtbar wird.

Zur Relaisverdrahtung und einem ESP32-Sketch, der Befehls-Topics abonniert, siehe das Tutorial ESP32-Relais mit MQTT. Heizungen und Lüfter mit Netzspannung müssen über korrekt dimensionierte Schütze geschaltet werden, die von einer Fachkraft installiert wurden.

Tipps zur Feinabstimmung

  • Hysteresebänder von 2 bis 3 °C verhindern kurzes Takten, das Relais und Motoren verschleißt.
  • Die Sensorplatzierung ist wichtiger als die Sensorgenauigkeit: Schützen Sie den Sensor vor direkter Sonne, montieren Sie ihn auf Pflanzenhöhe und sorgen Sie für Luftzirkulation.
  • Tag- und Nachtsollwerte lassen sich leicht ergänzen: Ein inject-Node bei Sonnenauf- und -untergang kann neue retained Sollwerte veröffentlichen.
  • Alles protokollieren. Ein Node-RED-Flow oder eine Telegraf-Instanz, die greenhouse/# abonniert, liefert Ihnen den Verlauf, um die Sollwerte über eine Saison hinweg abzustimmen.

Das Gesamtbild aus Sensoren, Konnektivität und Topic-Design für einen ganzen Betrieb beschreibt der Leitfaden zu Smart Farming IoT; für die Bewässerung kombinieren Sie dieses Gewächshaus mit der automatischen Bewässerungsanlage. Betreibt ein Gartenbaubetrieb mehrere Häuser oder Standorte, lohnt sich eine Topic-Hierarchie nach dem Vorbild eines industriellen Unified Namespace (UNS), etwa gaertnerei/standort-bodensee/haus-4/klima, damit jedes Haus nach demselben Schema auffindbar ist.

Das Gewächshaus aus der Ferne beobachten

Automatisierung ist nur vertrauenswürdig, wenn Sie sehen können, was sie tut. Drei Ansichten decken die meisten Bedürfnisse ab. Eine Node-RED-Dashboard-Seite mit Anzeigen für Temperatur und Luftfeuchte, Schaltern, die die /state-Topics der Aktoren zeigen, und Schiebereglern, die neue Sollwerte veröffentlichen, gibt Gärtnern ein einfaches Bedienfeld auf dem Smartphone. Ein Historian, etwa Telegraf mit InfluxDB, erlaubt es, die Nächte dieser Woche mit denen der Vorwoche zu vergleichen und eine Heizung zu erkennen, die länger läuft als früher. Und eine Live-Topic-Ansicht auf der Brokerseite zeigt jeden Befehl und jede Zustandsnachricht in Echtzeit.

Wenn ConnectMQ der Broker ist, liefern der Live-Topic-Explorer und das Dashboard des Portals diese letzte Ansicht ohne jede Installation, und der MQTT-Client im Browser ist praktisch, um vom Laptop im Gewächshaus einen Test-Sollwert zu veröffentlichen. Welches Werkzeug Sie auch nutzen: Vergleichen Sie regelmäßig /set mit /state. Ein Befehl, der nie bestätigt wird, deutet auf ein defektes Relais, ein lockeres Kabel oder einen Knoten ohne WLAN hin.

Umstieg auf den Produktivbetrieb

Sobald die Logik funktioniert, verlassen Sie den öffentlichen MQTT-Broker. Erstellen Sie einen privaten Broker, stellen Sie den mqtt-broker-Node auf Port 8883 mit aktiviertem TLS um und tragen Sie Ihren ausgegebenen Benutzernamen, das Passwort und die Client ID ein. Jedes Gerät erhält eigene Zugangsdaten. Ein verwalteter MQTT-Broker hält den Broker am Laufen, auch wenn der Gewächshaus-PC ausfällt, und lässt Sie das Klima von überall prüfen. Der Leitfaden zur IoT-Automatisierung zeigt, wie sich dieses Muster auf Wohnungen und Gebäude übertragen lässt.

Betreiben Sie Ihr Gewächshaus mit ConnectMQ

ConnectMQ gibt Ihrem Gewächshaus einen privaten Broker mit TLS, einen Live-Topic-Explorer zum Beobachten von Befehlen und Zuständen sowie Schwellwert-Alarmregeln als Reservealarm bei Frost oder Überhitzung. Erstellen Sie unter app.connectmq.com einen kostenlosen Serverless-Broker, ohne Kreditkarte, und richten Sie Node-RED und Ihre ESP32-Knoten darauf aus.

Häufig gestellte Fragen

Kann eine Gewächshaus-Automatisierung ohne Internet laufen?

Ja, wenn Broker und Node-RED im lokalen Netzwerk laufen. Mit einem Cloud-Broker gewinnen Sie Fernzugriff; legen Sie deshalb die kritischen Failsafes in die Relais-Firmware, damit das Gewächshaus auch bei einem Ausfall sicher bleibt.

Welcher Temperatursensor eignet sich am besten für ein Gewächshaus?

Ein SHT31 oder SHT4x kommt mit hoher Luftfeuchte besser zurecht als ein DHT22. Egal welchen Sie wählen: Schützen Sie ihn mit einem belüfteten Strahlungsschutz vor direkter Sonne.

Warum schaltet mein Lüfter ständig ein und aus?

Der Abstand zwischen Ein- und Ausschaltschwelle ist zu klein, oder der Sensor sitzt im Luftstrom des Lüfters. Vergrößern Sie die Hysterese und versetzen Sie den Sensor.

Sollte Node-RED oder der ESP32 die Regelentscheidungen treffen?

Nutzen Sie Node-RED für flexible Logik und Sollwerte, und behalten Sie einfache Sicherheitsgrenzen auf dem ESP32, damit die Aktoren bei Verbindungsverlust in einen sicheren Zustand gehen.

Verwandte Artikel

Zigbee2MQTT einrichten: Vom Koordinator bis zum Dashboard

Installieren Sie Zigbee2MQTT mit Docker, konfigurieren Sie Koordinator und MQTT-Verbindung, lernen Sie Geräte an und benennen Sie sie um, steuern Sie sie per MQTT und zeigen Sie ihre Zustände auf einem Dashboard an, zuerst getestet auf einem kostenlosen öffentlichen MQTT-Broker.

8 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.