Node-RED

Node-RED JSON-Node: MQTT-JSON-Payloads parsen

So verarbeiten Sie JSON aus MQTT in Node-RED: wann Sie sich auf die geparste Ausgabe des mqtt in-Nodes verlassen, wann Sie den JSON-Node einsetzen, wie Sie mit JSON Schema validieren und wie Sie die typischen Parse-Fehler beheben.

Node-RED JSON-Node, der in einem Flow einen MQTT-Payload-String in ein JavaScript-Objekt umwandelt
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

Der Node-RED JSON-Node wandelt zwischen JSON-Strings und JavaScript-Objekten um, und er entscheidet darüber, ob msg.payload.temp funktioniert oder undefined liefert. Dieser Leitfaden zeigt, wie JSON über MQTT ankommt, wann Sie das Parsen dem mqtt in-Node überlassen, wann Sie stattdessen den JSON-Node verwenden, wie Sie Payloads mit einem Schema validieren und wie Sie die häufigsten Parse-Fehler beheben.

Warum MQTT-Payloads geparst werden müssen

MQTT selbst kennt kein JSON. Ein Broker transportiert jeden Payload als rohe Bytes, egal ob diese Bytes eine Zahl, eine CSV-Zeile, eine Protobuf-Nachricht oder ein JSON-Dokument sind. Publiziert ein Temperatursensor {"temp": 22.4, "hum": 41}, erhält der Abonnent 26 Bytes und muss entscheiden, was sie bedeuten.

Node-RED bietet zwei Stellen für diese Entscheidung: die Option Output am mqtt in-Node und den separaten JSON-Node. Beide nutzen darunter denselben Parser. Der Unterschied liegt darin, wo die Umwandlung passiert und wie viel Kontrolle Sie behalten. Zur Auffrischung, wie Broker diese Bytes weiterleiten, lesen Sie, was ein MQTT-Broker macht.

Option 1: JSON vom mqtt in-Node parsen lassen

Öffnen Sie einen beliebigen mqtt in-Node und sehen Sie sich das Dropdown Output an. Aktuelle Node-RED-Versionen bieten:

Output-Einstellung Was aus msg.payload wird Geeignet für
auto-detect (parsed JSON object, string or buffer) Objekt bei gültigem JSON, sonst String, bei Binärdaten Buffer Gemischte oder unbekannte Topics
a parsed JSON object Immer ein Objekt; ungültiges JSON löst einen Fehler aus Eigene Topics, die immer JSON tragen
a UTF-8 string String Klartext, CSV, Payloads, die Sie selbst parsen
a Buffer Node.js-Buffer Binärformate wie Protobuf
a Base64 encoded string Base64-Text Binärdaten durch reine Textsysteme schleusen

Für Topics, auf denen jeder Publisher JSON sendet, ist "a parsed JSON object" die sauberste Wahl. Sie erhalten direkt ein Objekt und einen sichtbaren Fehler, wenn ein Gerät sich falsch verhält. Auto-detect ist bequem, wenn Sie mit einer breiten Wildcard abonnieren und manche Topics einfache Werte wie ON oder 21.5 tragen, bedeutet aber, dass nachgelagerte Nodes mit beiden Typen umgehen müssen.

Auto-detect versucht, den Payload zu parsen: Ist er gültiges JSON, erhalten Sie ein Objekt, sonst einen String, oder einen Buffer, wenn die Bytes kein gültiger Text sind. Das ist bequem, aber weniger streng als die Option für geparstes JSON.

Option 2: Den Node-RED JSON-Node verwenden

Der JSON-Node kann an beliebiger Stelle im Flow stehen und wandelt die gewählte Property um. Die Einstellung Action hat drei Modi:

  • Convert between JSON String and Object: Ein String wird zum Objekt, ein Objekt zum String. Das ist der Standard und in beide Richtungen praktisch.
  • Always convert to JavaScript Object: Strings werden geparst, Objekte unverändert durchgereicht.
  • Always convert to JSON String: Objekte werden serialisiert, Strings unverändert durchgereicht. Aktivieren Sie Format JSON string für eine eingerückte, gut lesbare Ausgabe.

Sie können die Property auch von payload auf etwas anderes ändern, etwa payload.data, wenn ein JSON-Dokument als String in einem anderen Dokument verschachtelt ist. Dieses Muster taucht bei Gateways auf, die Gerätenachrichten in einen Umschlag (Envelope) verpacken.

Verwenden Sie den JSON-Node statt der mqtt in-Einstellung, wenn:

  1. Sie einmal mit einer Wildcard abonnieren, aber nur einige Zweige JSON tragen. Routen Sie zuerst mit einem Node-RED Switch-Node und parsen Sie dann nur den JSON-Zweig.
  2. Sie eine Schema-Validierung brauchen (siehe unten).
  3. Das JSON in einer anderen Property verschachtelt ist.
  4. Sie JSON nicht aus MQTT erhalten, sondern zum Beispiel aus einer HTTP-Anfrage oder einer Datei.

Ausprobieren auf dem öffentlichen Broker

Der öffentliche MQTT-Broker unter broker.connectmq.com ist ein schneller Weg, jede Einstellung ohne Installation auszuprobieren. Publizieren Sie aus einem Terminal einen gültigen und einen ungültigen Payload und ersetzen Sie b52e durch eine eigene Zufallszeichenfolge:

mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-json-b52e \
  -t "connectmq/demo/b52e/room1/env" -m '{"temp": 22.4, "hum": 41}'

mosquitto_pub -h broker.connectmq.com -p 1883 -i demo-json-b52e \
  -t "connectmq/demo/b52e/room1/env" -m '{temp: 22.4}'

Importieren Sie dann diesen Flow. Er abonniert als UTF-8-String und parst mit einem JSON-Node, sodass Sie sowohl den Erfolgs- als auch den Fehlerpfad sehen.

[
  {"id":"tab1","type":"tab","label":"JSON demo"},
  {"id":"brk","type":"mqtt-broker","name":"ConnectMQ public","broker":"broker.connectmq.com","port":"1883","clientid":"nr-json-b52e","autoConnect":true,"usetls":false,"protocolVersion":"4","keepalive":"60","cleansession":true},
  {"id":"in","type":"mqtt in","z":"tab1","name":"env","topic":"connectmq/demo/b52e/+/env","qos":"0","datatype":"utf8","broker":"brk","x":110,"y":100,"wires":[["json"]]},
  {"id":"json","type":"json","z":"tab1","name":"parse","property":"payload","action":"obj","pretty":false,"x":270,"y":100,"wires":[["ok"]]},
  {"id":"ok","type":"debug","z":"tab1","name":"parsed","active":true,"complete":"payload","x":430,"y":100,"wires":[]},
  {"id":"catch","type":"catch","z":"tab1","name":"","scope":["json"],"uncaught":false,"x":110,"y":180,"wires":[["bad"]]},
  {"id":"bad","type":"debug","z":"tab1","name":"parse errors","active":true,"complete":"true","x":290,"y":180,"wires":[]}
]

Die erste Nachricht erscheint in der Debug-Ausgabe "parsed" als aufklappbares Objekt. Die zweite löst den Catch-Node aus, und die vollständige Nachricht einschließlich msg.error.message erscheint unter "parse errors". Verbinden Sie in der Produktion diesen Catch-Ausgang mit einem Zähler oder einem Alarm-Topic statt mit einem Debug-Node, damit Sie merken, wenn ein Firmware-Update anfängt, fehlerhaftes JSON zu senden.

Payloads mit JSON Schema validieren

Gültiges JSON ist nicht dasselbe wie korrektes JSON. Ein Gerät sendet vielleicht "temp": "22.4" als String oder lässt nach einer Firmware-Änderung ein Feld weg. Der JSON-Node kann Payloads gegen ein JSON Schema prüfen: Setzen Sie vor dem Node msg.schema auf ein Schema-Objekt, und ungültige Nachrichten lösen einen Fehler aus, dessen Validierungsdetails in msg.schemaError stehen.

Setzen Sie das Schema mit einem Change-Node oder einer kleinen Funktion:

msg.schema = {
    type: "object",
    required: ["temp", "hum"],
    properties: {
        temp: { type: "number", minimum: -40, maximum: 125 },
        hum:  { type: "number", minimum: 0, maximum: 100 }
    },
    additionalProperties: true
};
return msg;

Platzieren Sie dies vor dem JSON-Node und behalten Sie den Catch-Node aus der Demo. Nachrichten, die die Validierung nicht bestehen, landen mit einer lesbaren Begründung im Fehlerpfad, was das Debugging deutlich erleichtert, statt NaN-Werten durch ein Dashboard hinterherzujagen. Das Schema wird auf der Objektseite geprüft; es funktioniert also sowohl beim Parsen eines Strings als auch dann, wenn der Payload bereits ein Objekt ist.

JSON zurück an MQTT publizieren

Der mqtt out-Node serialisiert Objekte automatisch: Ist msg.payload ein Objekt, wird es als JSON-String gesendet. In den meisten Flows brauchen Sie vor dem Publizieren keinen JSON-Node. Fügen Sie einen mit Always convert to JSON String nur hinzu, wenn eine bestimmte Property serialisiert werden soll oder Sie eine formatierte Ausgabe für Menschen möchten.

Ein subtiler Punkt: Publizieren Sie eine Zahl wie 21.5 direkt, sendet der Node den Text 21.5. Abonnenten mit auto-detect sehen das als gültiges JSON und erhalten eine Zahl, Abonnenten mit UTF-8 dagegen einen String. Legen Sie pro Topic eine Konvention fest und dokumentieren Sie sie.

JSON-Fehler in Node-RED beheben

Symptom Wahrscheinliche Ursache Lösung
Unexpected token o in JSON at position 1 Payload ist bereits ein Objekt und wird erneut geparst Zusätzlichen JSON-Node entfernen oder mqtt in-Output auf String stellen
msg.payload.temp ist undefined Payload ist noch ein String mqtt in auf geparstes JSON stellen oder einen JSON-Node hinzufügen
Unexpected token } in JSON Abschließendes Komma oder Schlüssel ohne Anführungszeichen aus der Firmware Publisher korrigieren; JSON verlangt Schlüssel in Anführungszeichen und keine abschließenden Kommas
Debug zeigt einen Buffer Output auf Buffer gestellt oder Binär-Payload mit auto-detect UTF-8-String oder geparstes JSON als Output verwenden
Zahlen kommen als Strings an Publisher setzt Werte in Anführungszeichen Mit Schema validieren und Firmware korrigieren oder mit einem Change-Node umwandeln
Seltsame Zeichen am Anfang UTF-8-Byte-Order-Mark mancher Tools Mit einem Function-Node entfernen oder Publisher korrigieren

Die meisten dieser Fehler entstehen durch doppeltes oder fehlendes Parsen. Fügen Sie direkt nach mqtt in einen Debug-Node mit "complete msg object" ein; die Seitenleiste zeigt, ob payload ein String, ein Objekt oder ein Buffer ist.

Checkliste mit Best Practices

  1. Wählen Sie pro Flow genau eine Parse-Stelle, entweder den mqtt in-Node oder einen JSON-Node, niemals beide.
  2. Verwenden Sie "a parsed JSON object" für eigene Topics und auto-detect nur für gemischte Wildcards.
  3. Validieren Sie kritische Payloads mit einem Schema und leiten Sie Fehler über einen Catch-Node.
  4. Halten Sie Payloads möglichst klein und flach; verschachtelte Umschläge erschweren jedem Konsumenten die Arbeit.
  5. Legen Sie die Geräteidentität ins Topic, nicht nur in den Payload. Unser Leitfaden zum Node-RED Function-Node zeigt, wie Sie das Topic in Felder zerlegen. In der Industrie folgt das Topic dabei idealerweise der ISA-95-Hierarchie eines Unified Namespace (UNS), etwa acme/werk-stuttgart/montage/linie-1/temperatur.
  6. Dokumentieren Sie das Payload-Format jedes Topics zusammen mit Ihrem Plan für die Topic-Benennung.

Für einen vollständigen Einstieg behandelt das Node-RED-MQTT-Tutorial Broker-Konfiguration, Dashboards und Alarme in einem Flow. Der offizielle Leitfaden zum Arbeiten mit Nachrichten auf nodered.org erklärt Nachrichtenstruktur und JSON-Node noch ausführlicher.

Ihre JSON-Flows zu ConnectMQ umziehen

Der öffentliche Broker ist geteilt und für jeden lesbar, echte Gerätedaten gehören daher auf einen privaten Broker. ConnectMQ ist ein vollständig verwalteter MQTT-Broker mit TLS auf Port 8883 und einem Topic-Explorer im Portal, in dem Sie das exakte JSON jedes Geräts prüfen können, bevor es Node-RED erreicht. Registrieren Sie sich unter app.connectmq.com für den kostenlosen Serverless-Plan, ohne Kreditkarte, fügen Sie dann die generierten Zugangsdaten in Ihren Broker-Node ein und aktivieren Sie TLS. Der kostenlose Plan unterstützt Nachrichten bis 256 KB, was für typische JSON-Telemetrie mehr als genug ist.

Häufig gestellte Fragen

Brauche ich nach dem mqtt in-Node einen JSON-Node?

Nein, wenn der Output des mqtt in-Nodes auf "a parsed JSON object" oder auto-detect steht und der Payload gültiges JSON ist. Ein zusätzlicher JSON-Node kann dann Fehler durch doppeltes Parsen verursachen.

Wie wandle ich in Node-RED ein Objekt in einen JSON-String um?

Verwenden Sie den JSON-Node mit der Aktion "Always convert to JSON String", optional mit Format JSON string für eine lesbare Ausgabe. Auch der mqtt out-Node serialisiert Objekte automatisch.

Kann der JSON-Node Datentypen validieren?

Ja. Setzen Sie vor dem Node msg.schema auf ein JSON Schema; Nachrichten, die nicht passen, lösen einen Fehler aus, den Sie mit einem Catch-Node behandeln können, mit Details in msg.schemaError.

Warum liefert auto-detect manchmal eine Zahl statt eines Objekts?

Ein Payload wie 42 oder true ist gültiges JSON, daher parst auto-detect ihn in eine Zahl oder einen Boolean. Erwarten Sie immer ein Objekt, prüfen Sie den Typ in einem Switch-Node oder verwenden Sie ein Schema.

Verwandte Artikel

Node-RED als OPC-UA-Client zu MQTT mit ISA-95-Topics

Mit node-red-contrib-opcua OPC-UA-Variablen auf einer SPS oder einem Simulationsserver abonnieren, Node-IDs auf MQTT-Topics im ISA-95-Stil abbilden und Werte mit Qualität und Zeitstempel publizieren.

9 Min. Lesezeit

Node-RED Diagramm-Verlauf: MQTT-Chartdaten über Neustarts hinweg behalten

Dashboard-Diagramme vergessen alles, wenn Node-RED neu startet. Dieser Leitfaden zeigt zwei zuverlässige Wege, den Node-RED Diagramm-Verlauf für MQTT-Daten zu behalten: dateibasierten Context-Speicher und eine kleine SQLite-Tabelle, beide beim Start in Dashboard 2.0 zurückgespielt.

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.