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:
- Maximale Laufzeit pro Aktor. Die Nebelung schaltet sich zum Beispiel nach fünf Minuten selbst ab, auch wenn kein
OFFeintrifft. Ein hängendes Ventil kann eine Kultur ertränken. - Lokale Übertemperaturabschaltung. Hat der Relaisknoten einen eigenen Temperaturfühler, schaltet er die Heizung oberhalb eines harten Grenzwerts unabhängig von Befehlen ab.
- 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.
- 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. - 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.



