Node-RED

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.

Node-RED als OPC-UA-Client, der SPS-Variablen abonniert und auf MQTT-Topics nach ISA-95-Ebenen publiziert
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

Mit einem Node-RED-OPC-UA-Flow übernehmen Sie Werte aus modernen SPSen, CNC-Steuerungen und SCADA-Servern und publizieren sie an MQTT, wo viele Konsumenten sie nutzen können, ohne dass jeder eine eigene OPC-UA-Session öffnet. In diesem Tutorial abonnieren Sie OPC-UA-Variablen mit node-red-contrib-opcua, bilden ihre Node-IDs auf MQTT-Topics im ISA-95-Stil ab und publizieren jede Änderung mit Qualität und Quellzeitstempel. Sie können mit einem kostenlosen Simulationsserver und einem kostenlosen MQTT-Broker mitmachen.

Warum OPC UA und MQTT kombinieren

OPC UA ist innerhalb des Werks hervorragend: Es bietet ein reichhaltiges Informationsmodell, durchsuchbare Adressräume, Datentypen, Security und Subscriptions. Für die breite Verteilung ist es weniger bequem. Jeder Client hält eine Session zum Server, Firewalls zwischen Werk und Cloud erschweren direkte Verbindungen, und Steuerungen begrenzen mitunter die Zahl der Sessions, die sie annehmen.

MQTT ergänzt es. Ein einziges Gateway hält eine OPC-UA-Session, empfängt Änderungen über eine OPC-UA-Subscription und publiziert sie an einen Broker. Von dort abonnieren Dashboards, Historians, MES und Cloud-Analytik Topics, die sie verstehen. Der Vergleich OPC UA vs. MQTT beleuchtet die Abwägungen im Detail. Kurz gesagt: OPC UA beschreibt die Maschine, MQTT verteilt die Daten, und Node-RED ist für Pilotprojekte sowie kleine bis mittlere Standorte eine praktische Brücke dazwischen. Diese Kombination ist auch in der Plattform Industrie 4.0 und im Umfeld von RAMI 4.0 ein gängiges Muster.

Was Sie brauchen

Komponente Zweck Beispiel
Node-RED 4.x Das Gateway Laptop, Industrie-PC oder Raspberry Pi
node-red-contrib-opcua OPC-UA-Client-Nodes Über den Paletten-Manager installieren
OPC-UA-Server Datenquelle Eine SPS oder zum Testen ein kostenloser Simulationsserver
MQTT-Broker Verteilung broker.connectmq.com zum Testen, ein privater Broker für die Produktion

Installieren Sie die OPC-UA-Nodes:

cd ~/.node-red
npm install node-red-contrib-opcua
# Node-RED danach neu starten

Das Paket ist groß, weil es den node-opcua-Stack mitbringt; die Installation kann auf einem Raspberry Pi daher einige Minuten dauern.

Als Testserver ist der kostenlose Prosys OPC UA Simulation Server weit verbreitet. Sein Standard-Endpunkt sieht aus wie opc.tcp://<your-pc>:53530/OPCUA/SimulationServer, und er stellt simulierte Variablen wie Counter, Random und Sinusoid bereit. Die Node-IDs unterscheiden sich je nach Version; lesen Sie die genauen IDs daher in der Objects-Ansicht des Servers ab. In vielen Versionen sehen sie aus wie ns=3;i=1001.

Schritt 1: Die Node-IDs finden

Jede OPC-UA-Variable hat eine Node-ID aus Namespace-Index und Bezeichner, zum Beispiel ns=3;i=1001 (numerisch) oder ns=4;s=Line2.Filler.Temperature (String). Sie brauchen diese IDs, bevor Sie abonnieren können.

Zwei Wege, sie zu finden:

  1. Nutzen Sie den OpcUa-Browser-Node in Node-RED: Richten Sie ihn auf den Endpunkt und navigieren Sie ab dem Objects-Ordner.
  2. Nutzen Sie einen Desktop-Client wie UaExpert, wählen Sie eine Variable und kopieren Sie ihre NodeId.

Notieren Sie auch den Datentyp (Double, Int32, Boolean). Der Client-Node braucht ihn beim Schreiben, und er sagt Ihnen, wie der Wert in MQTT zu formatieren ist.

Schritt 2: Den OPC-UA-Client konfigurieren

Fügen Sie einen OpcUa-Client-Node hinzu und legen Sie eine Endpunkt-Konfiguration an:

  • Endpunkt: opc.tcp://<server-host>:53530/OPCUA/SimulationServer
  • Security Policy: None und Modus None für den ersten Test
  • Action: SUBSCRIBE
  • Intervall: 1000 ms (das Publishing-Intervall der OPC-UA-Subscription)

Fügen Sie dann pro Variable einen OpcUa-Item-Node hinzu, mit dem Item auf die Node-ID und dem Typ auf den Datentyp der Variablen gesetzt. Verbinden Sie einen einzigen Inject-Node, der einmalig nach 2 Sekunden auslöst, mit allen Item-Nodes und die Item-Nodes mit dem Client. Beim Start des Flows bittet jedes Item den Client, diesen Node zu überwachen, und ab dann gibt der Client bei jeder Wertänderung eine Nachricht aus, mit dem Wert in msg.payload und der Node-ID in msg.topic.

Deployen Sie und fügen Sie hinter dem Client einen Debug-Node hinzu. Sie sollten sehen, wie Counter hochzählt und Random sich jede Sekunde ändert. Zeigt der Client-Status einen Verbindungsfehler, prüfen Sie die Endpunkt-URL, vor allem den Hostnamen: Viele Server melden ihren eigenen Hostnamen, der vom Node-RED-Rechner aus auflösbar sein muss.

Schritt 3: OPC-UA-Node-IDs auf ISA-95-MQTT-Topics abbilden

Auf ein Topic wie opcua/ns=3;i=1001 zu publizieren würde technisch funktionieren, aber niemand nachgelagert weiß, was es bedeutet. Ordnen Sie jede Node-ID stattdessen einem Platz in Ihrer Anlagenhierarchie zu: Unternehmen oder Standort, Bereich, Linie, Zelle und Tag. Das ist die Idee hinter ISA-95-Topic-Strukturen und dem Unified Namespace (UNS): Die ISA-95-Hierarchie wird zur Topic-Struktur des UNS auf dem MQTT-Broker. Der Leitfaden zu ISA-95-MQTT-Topics erklärt die Ebenen.

Eine Lookup-Tabelle in einem Function-Node hält das Mapping explizit und überprüfbar:

// Function node "opc ua to isa-95 topic"
// OPC-UA-Node-IDs auf Anlagenpfade und Tag-Namen abbilden.
const PREFIX = "connectmq/demo/a7f3k2";    // Demo-Präfix für den öffentlichen Broker
const MAP = {
    "ns=3;i=1001": { path: "plant1/packaging/line2/filler", tag: "counter", unit: "" },
    "ns=3;i=1002": { path: "plant1/packaging/line2/filler", tag: "pressure", unit: "bar" },
    "ns=3;i=1004": { path: "plant1/packaging/line2/capper", tag: "torque", unit: "Nm" }
};

const nodeId = String(msg.topic);
const entry = MAP[nodeId];
if (!entry) {
    node.warn("Unmapped node ID: " + nodeId);
    return null;
}

// Qualität: node-opcua-Statuscodes liefern einen Namen wie "Good" oder "Bad..."
let quality = "Good";
if (msg.statusCode && typeof msg.statusCode === "object" && msg.statusCode.name) {
    quality = msg.statusCode.name;
}

const value = typeof msg.payload === "number"
    ? Math.round(msg.payload * 1000) / 1000
    : msg.payload;

msg.topic = `${PREFIX}/${entry.path}/${entry.tag}`;
msg.payload = {
    value: value,
    unit: entry.unit,
    quality: quality,
    sourceTimestamp: msg.sourceTimestamp || new Date().toISOString(),
    nodeId: nodeId
};
msg.retain = true;
return msg;

Das resultierende Topic, zum Beispiel connectmq/demo/a7f3k2/plant1/packaging/line2/filler/pressure, hat acht Ebenen. Das passt zum Limit von acht Topic-Ebenen auf dem öffentlichen Broker; auf einem privaten Broker würden Sie das Demo-Präfix weglassen und könnten eine Unternehmensebene ergänzen.

Mit retain erhält jeder neue Abonnent sofort den letzten Wert jedes Tags, und genau so sollte sich ein Unified Namespace verhalten: Der Topic-Baum bildet den aktuellen Zustand ab. Behalten Sie Qualität und Quellzeitstempel im Payload. Ein Historian muss wissen, wann sich der Wert an der Quelle geändert hat, nicht wann Node-RED ihn weitergeleitet hat, und ein Wert mit Qualität "Bad" sollte nicht so in Trends einfließen, als wäre er echt.

Schritt 4: An MQTT publizieren

Fügen Sie einen mqtt out-Node mit leeren Feldern für Topic und Retain hinzu, damit die Eigenschaften der Nachricht verwendet werden. Verbinden Sie sich zum Testen mit broker.connectmq.com auf Port 1883 mit einer eindeutigen Client-ID; das ist der kostenlose öffentliche MQTT-Broker. Ersetzen Sie also a7f3k2 durch eine eigene Zufallszeichenfolge und publizieren Sie dort keine echten Produktionsdaten.

Prüfen Sie die Ausgabe in einem Terminal:

mosquitto_sub -h broker.connectmq.com -p 1883 -i sub-opcua-a7f3k2 -v \
  -t 'connectmq/demo/a7f3k2/plant1/#'

Jede Zeile zeigt ein Topic und einen JSON-Payload mit Wert, Einheit, Qualität und Zeitstempel.

Zurück nach OPC UA schreiben (mit Bedacht)

Derselbe Client-Node unterstützt die Action WRITE. Ein MQTT-Befehls-Flow würde ein eigenes Befehls-Topic abonnieren, Wert und Bereich in einem Function-Node validieren, msg.topic auf eine feste Node-ID setzen und die Nachricht über einen OpcUa-Item-Node mit dem richtigen Datentyp senden. Wie bei jedem OT-Schreibpfad gilt: Lassen Sie niemals die eingehende Nachricht die Node-ID bestimmen, protokollieren Sie jeden Schreibvorgang und publizieren Sie ein Bestätigungs-Topic. Viele Standorte betreiben das Gateway nur lesend, bis ein klarer Bedarf besteht.

Security für die Produktion

Das Test-Setup verwendet keine Security. Für eine echte Steuerung gilt:

  1. Eine sichere Policy verwenden. Wählen Sie in der Endpunkt-Konfiguration Basic256Sha256 mit dem Modus SignAndEncrypt.
  2. Zertifikaten vertrauen. Bei der ersten Verbindung lehnt der Server das Client-Zertifikat von Node-RED meist ab. Verschieben Sie es auf dem Server in die Liste vertrauenswürdiger Zertifikate (bei Prosys im Tab Certificates) und verbinden Sie sich erneut.
  3. Einen eigenen Benutzer verwenden. Richten Sie für das Gateway einen OPC-UA-Benutzer mit reinem Lesezugriff ein, sofern der Server Benutzerauthentifizierung unterstützt.
  4. Die MQTT-Seite schützen. Verbinden Sie sich mit einem privaten Broker über TLS auf Port 8883 mit Zugangsdaten, nicht mit dem öffentlichen Broker.

Diese Maßnahmen passen auch zu den Anforderungen von IEC 62443 an die Segmentierung und Absicherung von OT-Netzen.

Fehlerbehebung bei Node-RED-OPC-UA-Flows

Symptom Wahrscheinliche Ursache Lösung
BadCertificateUntrusted oder Verbindung abgelehnt Client-Zertifikat nicht vertrauenswürdig Auf dem Server vertrauen, dann erneut deployen
Verbindet sich, scheitert dann mit Hostnamen-Fehler Server meldet einen nicht auflösbaren Hostnamen Hosts-Eintrag ergänzen oder die gemeldete Adresse des Servers konfigurieren
BadNodeIdUnknown Falscher Namespace-Index oder Bezeichner Erneut browsen; Namespace-Indizes können sich zwischen Servern unterscheiden
Keine Nachrichten nach dem Deployment Items wurden nie an den Client gesendet Sicherstellen, dass der Inject beim Start einmal auslöst
Werte kommen nur alle paar Sekunden Großes Publishing- oder Sampling-Intervall Intervall im vom Server erlaubten Rahmen senken
Speicherbedarf des Gateways wächst Hunderte Items einzeln abonniert Items gruppieren und die Zahl der Subscriptions klein halten

Das Muster skalieren

Für eine Handvoll Maschinen funktioniert eine Node-RED-Instanz pro Standort mit einer Mapping-Tabelle gut. Wächst die Tabelle, verlagern Sie sie in eine JSON-Datei oder in den Flow-Kontext, der beim Start geladen wird, damit Ingenieure Änderungen prüfen können, ohne Code anzufassen. Sind viele Hersteller und Protokolle im Spiel, kombinieren Sie diesen Flow mit dem Node-RED-Modbus-Gateway für ältere Geräte und ziehen Sie Node-RED mit Sparkplug B in Betracht, wenn Ihre Konsumenten die Birth-, Death- und Zustandsbehandlung von Sparkplug erwarten. Kommerzielle Gateways lohnen eine Prüfung, sobald Sie Hunderte Tags pro Standort mit zentraler Konfiguration brauchen.

Alle diese Gateways brauchen einen Broker, dem sie vertrauen können. Ein Cloud-MQTT-Broker erlaubt Gateways an mehreren Standorten, über ausgehende TLS-Verbindungen in einen gemeinsamen Namespace zu publizieren. ConnectMQ erkennt Topic-Strukturen nach ISA-95 und Unified Namespace und zeigt Geräte im Portal nach Unternehmen, Standort, Bereich, Linie und Zelle an, sodass Sie leicht prüfen können, ob Ihre Mapping-Tabelle die beabsichtigte Hierarchie erzeugt hat. Zur Auffrischung, was ein MQTT-Broker in dieser Architektur leistet, oder zur Konfiguration der MQTT-Nodes lesen Sie das Node-RED-MQTT-Tutorial.

Ihre OPC-UA-Daten an ConnectMQ publizieren

Registrieren Sie sich unter app.connectmq.com für den kostenlosen Serverless-Plan, ohne Kreditkarte. Legen Sie einen Broker an, tragen Sie den generierten Benutzernamen, das Passwort und die Client-ID in Ihren Node-RED-MQTT-Konfigurations-Node ein, wechseln Sie auf Port 8883 mit TLS und entfernen Sie das Demo-Präfix aus der Mapping-Tabelle. Ihre OPC-UA-Tags erscheinen dann im ConnectMQ-Portal, geordnet nach ISA-95-Ebenen.

Häufig gestellte Fragen

Welches Node-RED-Paket wird für OPC UA verwendet?

Das am weitesten verbreitete Paket ist node-red-contrib-opcua, aufgebaut auf dem node-opcua-Stack. Es bietet Client-, Item-, Browser- und Server-Nodes zum Lesen, Schreiben, Abonnieren und Testen.

Sollte ich OPC-UA-Werte in Node-RED pollen oder abonnieren?

Abonnieren Sie, wann immer der Server es unterstützt. Der Server sendet dann nur Änderungen im eingestellten Intervall, was die Steuerung schont und schnellere Aktualisierungen liefert als Polling.

Warum OPC-UA-Node-IDs auf ISA-95-MQTT-Topics abbilden?

Node-IDs sind nur innerhalb eines Servers aussagekräftig. Topics im ISA-95-Stil beschreiben, woher die Daten im Werk stammen, sodass jeder Konsument sie finden und verstehen kann, ohne den OPC-UA-Adressraum zu kennen.

Kann Node-RED sich mit OPC-UA-Servern mit aktivierter Security verbinden?

Ja. Wählen Sie eine Security Policy wie Basic256Sha256 mit SignAndEncrypt und vertrauen Sie dem Client-Zertifikat von Node-RED auf dem Server. Authentifizierung mit Benutzer und Passwort wird ebenfalls unterstützt.

Verwandte Artikel

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

Node-RED in Docker für MQTT-Projekte betreiben

Ein praxisnaher Node-RED-Docker-Leitfaden: das offizielle Image starten, Flows auf einem persistenten Volume halten, Docker Compose nutzen, zusätzliche Nodes installieren, Secrets über Umgebungsvariablen übergeben und per TLS mit einem MQTT-Broker verbinden.

7 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.