Zum Inhalt springen

HomeStackR
Zurück zur Übersicht

Profi · Kapitel 6 von 14

Node-RED Advanced: Subflows & Fehlerbehandlung

Wenn einfache Flows zu klein werden: Wie du Node-RED mit Subflows, robuster Fehlerbehandlung und Context-Variablen professionell einsetzt.

Lesezeit: ~6 MinAktualisiert 16. August 2026

Affiliate-Links: Als Amazon-Partner verdiene ich an qualifizierten Verkäufen – für dich bleibt der Preis gleich.

Das Wichtigste in Kürze

3 Kernaussagen für Schnellleser

Sobald Node-RED-Flows über zwanzig Nodes hinauswachsen, wird das Canvas unübersichtlich und Fehler schwer auffindbar. Subflows, Join-Nodes, Catch-Nodes und Context-Variablen sind die vier Werkzeuge, die aus improvisierten Bastel-Flows wartbare Smart-Home-Steuerung machen.

  • Node-RED wird mit komplexeren Setups unübersichtlich.
  • Subflows bündeln wiederkehrende Logik, Join-Nodes synchronisieren mehrere Inputs, Catch-Nodes fangen Fehler ab, und Context-Variablen speichern Zustände zwischen Messages.
  • Drei Werkzeuge, die aus Bastel-Flows produktive Smart-Home-Steuerung machen.

Subflows: Code-Wiederverwendung in Node-RED

Wer in Node-RED nach einer Weile komplexere Setups hat, bemerkt schnell: Manche Logik wiederholt sich. Denselben MQTT-Publish-Block, dieselbe Fehlerprüfung, denselben Alert-Mechanismus baust du in Flow Nummer 3, 7 und 12. Subflows sind die Antwort – sie sind wiederverwendbare Flow-Bausteine.

Subflows erstellen und einsetzen

Du erstellst einen Subflow über das Menü in Node-RED. Innen sieht er aus wie ein normaler Flow mit Input- und Output-Nodes. Du definierst, welche Properties (Eingabeparameter) der Subflow akzeptiert. Dann nutzt du den Subflow wie einen normalen Node – er taucht in der Palette auf und kann beliebig oft eingesetzt werden. Änderungen am Subflow wirken sich sofort auf alle Instanzen aus.

Status-Node im Subflow

Die Status-Node zeigt den aktuellen Zustand eines Nodes im Dashboard an – ein kleiner Text unter dem Node-Symbol. Im Subflow nutzt du die Status-Node, um den Laufzustand nach außen zu kommunizieren: "Gesendet", "Fehler", "Warte auf Antwort". So siehst du auf einen Blick, was jede Instanz des Subflows gerade tut, ohne in den Subflow hineinsehen zu müssen.

Pro-Tipp

Benenne Subflows mit einem Präfix nach ihrer Funktion, z.B. sf_mqtt_publish oder sf_alert_handler. So erkennst du im Flow auf Anhieb, welche Nodes Subflows sind und welche Standard-Nodes.

Join-Nodes: Mehrere Inputs synchronisieren

Die Join-Node ist einer der vielseitigsten Nodes in Node-RED – sie wartet auf mehrere Messages und kombiniert sie zu einer. Das ist essenziell, wenn du auf Input von mehreren Sensoren oder Quellen warten musst, bevor du eine Entscheidung triffst. Häufige Fehler entstehen, wenn Timeouts oder msg.parts nicht richtig verstanden werden.

Manueller und automatischer Modus

Im manuellen Modus definierst du exakt, welche Message-Parts du erwartest (z.B. drei Temperaturmessungen von drei Sensoren). Die Join-Node wartet, bis alle drei angekommen sind, und kombiniert sie dann. Im automatischen Modus nutzt du msg.parts – das setzt Split-Node automatisch, wenn du ein Array aufteilst. Die Join-Node wartet dann auf alle Teile, bevor sie weitergeht.

Häufige Fallstricke

Im manuellen Modus ohne expliziten Timeout wartet die Join-Node auf alle konfigurierten Parts. Wenn ein erwarteter Input nicht kommt (weil ein Sensor offline ist), bleibt der Flow stehen – bis ein Neustart oder manueller Reset. Konfiguriere immer einen Timeout, der den Join abbricht und einen Fehler-Output sendet.

3 ModiJoin-Node: Manuell, Automatisch (via msg.parts) und Reduzieren
10 sEmpfohlener Timeout für Join-Nodes, die auf externe Sensoren warten
1 MBMaximale Message-Größe in Node-RED 3.x (Standard, konfigurierbar in settings.js)

Das Wesentliche in Kürze

Für komplexere Node-RED-Flows sind drei Werkzeuge entscheidend: Subflows (Wiederverwendung), Join-Nodes (Synchronisierung) und robuste Fehlerbehandlung. Wer zurück zum Einstieg will, liest Automatisierungen schreiben.

Fehlerbehandlung: Catch-Node und Circuit Breaker

Produktive Node-RED-Flows müssen mit Fehlern umgehen können. Wenn ein HTTP-Request scheitert, ein MQTT-Gerät antwortet nicht oder ein Function-Node einen JavaScript-Fehler wirft, soll der Flow nicht stumm scheitern – er soll auf den Fehler reagieren.

Catch-Node: Fehler abfangen

Die Catch-Node ist der generische Error-Handler in Node-RED. Du verbindest sie mit einem oder mehreren Nodes (oder mit "alle Nodes im Flow"). Wenn ein verbundener Node einen Fehler wirft, geht die Message an die Catch-Node statt an den normalen Output. Dort kannst du loggen, benachrichtigen oder einen Fallback-Wert setzen.

Ein häufiges Muster: Catch-Node → Function-Node (der msg.error auswertet) → Telegram-Node (der eine Benachrichtigung sendet) + Inject-Node (der einen Retry-Timer startet). So bekommst du bei jedem unerwarteten Fehler sofort eine Nachricht.

Circuit Breaker Pattern

Wenn ein Service immer wieder fehlschlägt (z.B. ein API-Endpunkt ist down), solltest du nicht endlos retries machen – das überlastet den Service und dein System. Das Circuit-Breaker-Pattern löst das: Nach N Fehlern in T Sekunden "öffnet" der Circuit Breaker und blockiert weitere Requests für eine Wartezeit. Danach lässt er einen Test-Request durch – wenn der erfolgreich ist, schließt der Breaker wieder.

In Node-RED implementierst du das mit einer Kombination aus Catch-Node, Counter in einer Context-Variable und einer Rate-Limit-Funktion.

Wusstest du schon?

Der Function-Node hat direkten Zugriff auf msg.error wenn er in einem Error-Handling-Flow läuft. msg.error.message enthält die Fehlermeldung, msg.error.source zeigt den Node, der den Fehler geworfen hat. So kannst du gezielt auf verschiedene Fehlertypen reagieren.

Context-Variablen: Zustand zwischen Messages speichern

Node-RED-Flows sind standardmäßig zustandslos – jede Message wird unabhängig verarbeitet. Context-Variablen sind die Ausnahme: Sie speichern Werte über Messages hinweg.

Flow-Context vs. Global-Context

Flow-Context ist auf einen einzigen Flow beschränkt – nur Nodes im selben Tab haben Zugriff. Global-Context ist für alle Flows sichtbar. Verwende Global-Context für Dinge, die wirklich überall gebraucht werden (z.B. den aktuellen Energiepreis oder den Anwesenheitsstatus). Flow-Context für alles, was nur im aktuellen Flow relevant ist.

Persistenter Context: Daten über Restarts hinaus speichern

Standardmäßig verliert Node-RED alle Context-Variablen beim Neustart. Wenn du willst, dass Daten überlebt werden (z.B. ein Zählerstand, die letzte bekannte Temperatur oder den letzten Schalterstatus), musst du persistenten Context aktivieren. In der settings.js konfigurierst du das mit dem contextStorage-Eintrag.

FileSystem-Storage speichert Context als JSON-Dateien auf der Festplatte – für hochfrequente Schreibvorgänge ist das langsam. Für Performance-kritische Setups (etwa wenn jede MQTT-Message einen Zähler inkrementiert): Redis-Storage oder nur In-Memory-Context (überlebt Restarts nicht) nutzen.

Pro-Tipp

Verwende Global-Context nicht als Datenbank. Für strukturierte Daten, die persistent bleiben müssen, ist eine echte Datenbank (MariaDB, InfluxDB) besser geeignet. Global-Context ist für temporäre, flüchtige Zustände wie global.heizung.wohnzimmer.soll gedacht.

Performance: Wenn Flows langsam werden

Node-RED auf einem Raspberry Pi 4 oder einem Beelink Mini S12 Pro(öffnet in neuem Tab) läuft problemlos mit hunderten Nodes. Aber wenn Flows sehr viele Messages pro Sekunde verarbeiten oder komplexe JavaScript-Berechnungen ausführen, kann Performance zum Thema werden. Hier sind die häufigsten Optimierungen:

  • Rate-Limit-Nodes einsetzen: Wenn ein Sensor jede Sekunde einen Wert sendet, du ihn aber nur alle 5 Sekunden brauchst, schalte eine Rate-Limit-Node dazwischen. Das reduziert die Message-Frequenz drastisch.
  • Delay-Nodes statt setTimeout: Nutze die eingebaute Delay-Node statt JavaScript setTimeout in Function-Nodes. Die eingebaute Node ist effizienter und kann Messages queuen.
  • Große Payloads vermeiden: Sende nie ganze Arrays oder große Objekte durch den Flow, wenn du nur ein einzelnes Feld brauchst. Extrahiere das Feld in einer Function-Node am Anfang des Flows.
  • Komplexe Logik in Function-Nodes isolieren: Statt viele kleine Function-Nodes zu verketten, konsolidiere die Logik in einer einzigen Node. Das reduziert den Overhead.
500+Messages/Sekunde auf einem Raspberry Pi 4 – mehr als genug für typische Smart-Home-Flows
256 MBStandard-Heap-Limit für Node.js; konfigurierbar via NODE_OPTIONS=--max-old-space-size=512 in systemd-Service-Unit

Node-RED produktiv einsetzen

Subflows, Join-Nodes und Fehlerbehandlung sind nicht nur nette Features – sie sind der Unterschied zwischen einem Bastel-Flow und einer verlässlichen Smart-Home-Automatisierung. Mit persistentem Context und sauberem Performance-Management läuft Node-RED stabil, auch wenn dein System wächst.

Häufig gestellte Fragen

Wann brauche ich einen Subflow statt einer normalen Node-Kette?
Immer wenn dieselbe Logik in mehreren Flows auftaucht – z. B. ein MQTT-Publish-Block mit Fehlerprüfung, ein Alert-Handler oder ein Standard-Formatter. Subflows ermöglichen dir, die Logik einmal zu definieren und überall einzusetzen. Änderungen am Subflow wirken sich automatisch auf alle Instanzen aus.
Wie konfiguriere ich einen Timeout für Join-Nodes richtig?
Im manuellen Modus den Timeout in Millisekunden oder Sekunden einstellen. 10 Sekunden sind für externe Sensoren ein guter Ausgangspunkt. Der Timeout-Output der Join-Node gibt dir die Möglichkeit, einen Fehler zu behandeln – z. B. Benachrichtigung senden und den Flow zurückzusetzen.
FileSystem oder Redis für persistenten Context?
FileSystem-Storage ist einfach einzurichten und für niedrigfrequente Daten (Zählerstände, Konfiguration) ausreichend. Für hochfrequente Schreibvorgänge – etwa wenn jede MQTT-Message einen Zähler inkrementiert – ist Redis deutlich schneller. In-Memory-Context ist am schnellsten, überlebt aber keine Neustarts.
Wie finde ich Performance-Engpässe in meinem Flow?
Der eingebaute Debugger in Node-RED ist der Anfang: Timestamps in Debug-Nodes zeigen, wo Zeit verloren geht. Rate-Limit-Nodes und Delay-Nodes lösen die meisten Engpässe. Für systematisches Profiling kannst du den Node.js-Profiler nutzen oder die Performance-Metrics in Node-RED 3.x aktivieren.
Wie debugge ich Flows, die mit Catch-Nodes Fehler abfangen?
Füge nach der Catch-Node immer eine Debug-Node ein, die msg.error ausgibt. So siehst du Fehlermeldung, Quelle und Stack-Trace. msg.error.message enthält die Fehlermeldung, msg.error.source zeigt den Node, der den Fehler geworfen hat. Ohne Debug-Node sind gefangene Fehler unsichtbar.