Überblick
Diese Seite beschreibt den Weg der Nachrichten vom Gateway bis in niotix – bis zu dem Punkt, an dem sie in den Konnektor Logs sichtbar sind. Einordnung, Anwendungsfälle und Voraussetzungen stehen auf der Übersichtsseite MQTT-Gateways; das Auslesen des Messgeräts in der Modbus-Konfiguration.
Die Anleitung geht vom Standard-Broker der niotix-SaaS (consumers.mq.iot-hub.com, Port 8883) aus. Für private SaaS-Instanzen und On-Premise-Installationen gelten abweichende Adressen – maßgeblich sind immer die Verbindungsdaten des eigenen mqttbroker-Konnektors.
Schritt 1: mqttbroker-Konnektor anlegen
- Unter Integrationen → Konnektoren einen neuen Konnektor vom Typ mqttbroker anlegen, Instanz-Name und Beschreibung vergeben (z. B. „Ortsnetzstationen – Gateways").
- „Validieren & Speichern" – niotix erzeugt automatisch Parent-Topic, Benutzername und Passwort.
- In der Konnektor-Detailansicht im Tab Verbindungsdaten die vier Angaben ablesen, die das Gateway benötigt:
Angabe |
Bedeutung |
|---|---|
| URL | Adresse des niotix-Brokers inkl. Port – auf der SaaS mqtts://consumers.mq.iot-hub.com:8883 |
| Benutzername | automatisch erzeugt |
| Passwort | automatisch erzeugt, schreibgeschützt |
| Topic | das Parent-Topic im Format consumers/<uuid> – der Zugriffsbereich dieses Konnektors |
Das Gateway darf ausschließlich unterhalb des Parent-Topics publizieren (consumers/<uuid>/…). Ein Publish oder Subscribe außerhalb dieses Namensraums führt dazu, dass der Broker die Verbindung trennt – ohne Fehlermeldung am Gerät.
Die Zugangsdaten werden an das Team, das das Gateway konfiguriert, über einen sicheren Kanal (z. B. Passwortmanager) übergeben – nicht per E-Mail-Verteiler. Ein mqttbroker-Konnektor kann von beliebig vielen Gateways genutzt werden; die Stationen unterscheiden sich über das Topic.
Schritt 2: Gateway als MQTT-Client konfigurieren
Die Bezeichnungen der Felder unterscheiden sich je Hersteller; die Werte sind für alle Gateways gleich:
Parameter |
Wert |
|---|---|
| Broker-URL / Host, Port | aus den Verbindungsdaten: mqtts://consumers.mq.iot-hub.com, Port 8883 (SaaS) |
| Protokoll | MQTT 3.1.1 |
| TLS | eingeschaltet, einseitig (Server-TLS). Kein Client-Zertifikat, kein Client-Schlüssel. Nur wenn das Gateway keinen aktuellen Trust Store besitzt, das Root-Zertifikat ISRG Root X1 hinterlegen – siehe TLS und Zertifikate |
| Benutzername / Passwort | aus den Verbindungsdaten |
| Client-ID | pro Gateway bzw. Station eindeutig – zwei Clients mit derselben ID werfen sich am Broker gegenseitig aus der Verbindung |
| Keep-Alive | unter 60 s, z. B. 50 s |
| QoS (Publish) | 0 |
| Retain | aus |
| Clean Session | ein |
| Zeit | NTP aktiv; Zeitstempel in UTC |
| Sendetakt | gleich dem Modbus-Lesetakt – bei 1-Minuten-Mittelwerten also 1 Minute |
QoS 0 ist bei zyklischen Messwerten die richtige Wahl: Ein verlorener Minutenwert ist tolerierbar, eine Wiederholung brächte keinen Gewinn. QoS 1 ist nur für ereignisartige Daten (z. B. Störmeldungen) zu erwägen.
Viele Gateways bieten einen Schalter für TLS – oft als „SSL" bezeichnet – zusätzlich zur Protokollauswahl mqtts://. Ist nur das Protokoll gewählt, der Schalter aber aus, sendet das Gerät unverschlüsselt gegen den TLS-Port – der Broker trennt die Verbindung ohne aussagekräftige Meldung.
Schritt 3: Topic-Struktur festlegen
Die folgende Topic-Struktur und die Variablennamen sind die von Digimondo empfohlene und in Projekten abgestimmte Konvention (Best Practice). Verbindlich vorgegeben ist nur das Parent-Topic aus dem mqttbroker-Konnektor – alle weiteren Segmente und die Namen im Payload können grundsätzlich frei gestaltet werden; die Konvention erspart projektspezifische Transformationen.
Das Topic besteht aus einem statischen Teil, der je Station einmal konfiguriert wird, und einem variablen Teil:
<parent_topic>/<namespace>/<stations_name>/<device_serial_number>/<variable_topic>
Segment |
Inhalt |
|---|---|
<parent_topic> |
consumers/<uuid> aus den Verbindungsdaten – für alle Stationen konstant |
<namespace> |
konstantes Zwischensegment zur Strukturierung, wird im Projekt festgelegt (z. B. digiONS) |
<stations_name> |
Kennung der Station, z. B. Station_001 |
<device_serial_number> |
Seriennummer des Messgeräts. Sie unterscheidet mehrere Geräte einer Station. Bevorzugt liest das Gateway sie dynamisch per Modbus aus (UMG 801: Register 4174) und setzt sie ins Topic; sonst einmalig vom Typenschild eintragen |
<variable_topic> |
abhängig von der Variante: Messgruppe (T1) oder Messgruppe und Variable (T2), siehe unten |
Regeln: Segmente mit genau einem / verbinden, kein / am Ende, keine Leerzeichen; nur Buchstaben, Ziffern, _ und -; die Zeichen +, # und $ sind innerhalb eines Segments nicht zulässig.
Entscheidend für den variablen Teil ist, ob das Gateway mehrere Messwerte in einer Nachricht zusammenfassen kann:
| Variante 1 – empfohlen | Variante 2 | |
|---|---|---|
| Nachricht | eine je Messgruppe und Zyklus | eine je Messwert und Zyklus |
| Topic-Struktur | T1 – endet auf der Messgruppe | T2 – endet auf <messgruppe>__<variable> |
| Nachrichtenformat | M1 – Zeitstempel + alle Werte der Messgruppe | M2 – Zeitstempel + ein Wert |
| Wann | das Gateway kann Nachrichten aus mehreren Datenpunkten zusammensetzen (Template) | das Gateway publiziert je Datenpunkt ein eigenes Topic (typisch bei Fernwirkstationen) |
Eine Messgruppe fasst die Werte eines Messorts zusammen – beim UMG 801 das Basisgerät (basic_device: Spannungen, Geräteinformationen) und je ein Abgang (basic_device_meas_group_01, …_02, current_module_meas_group_01 …).
Variante 1: eine Nachricht je Messgruppe (T1/M1)
consumers/<uuid>/digiONS/Station_001/12345678/basic_device
consumers/<uuid>/digiONS/Station_001/12345678/basic_device_meas_group_01
Variante 2: eine Nachricht je Messwert (T2/M2)
consumers/<uuid>/digiONS/Station_001/12345678/basic_device__phaseVoltageL1Avg
consumers/<uuid>/digiONS/Station_001/12345678/basic_device_meas_group_01__currentL1Avg
Das letzte Segment ist der Extended Variable Name: Messgruppe und Variablenname, getrennt durch einen doppelten Unterstrich. So bleibt das Topic auch bei 20 Abgängen mit jeweils einem currentL1Avg eindeutig.
Schritt 4: Nachrichtenformat
Für den ersten Durchstich genügen wenige Register (siehe Minimal-Testset). Beispiel UMG 801 (1-Minuten-Mittelwerte):
| Messgruppe | Variable | Register | Format, Einheit |
|---|---|---|---|
basic_device |
phaseVoltageL1Avg |
5000 | Float (2 Reg.), V |
basic_device_meas_group_01 |
currentL1Avg |
5012 | Float (2 Reg.), A |
basic_device_meas_group_01 |
totalActivePowerAvg |
5030 | Float (2 Reg.), W |
consumers/<uuid>/digiONS/Station_001/12345678/basic_device_meas_group_01
{
"ts": "2026-09-21T09:12:00Z",
"currentL1Avg": 12.3,
"totalActivePowerAvg": 8450.0
}consumers/<uuid>/digiONS/Station_001/12345678/basic_device__phaseVoltageL1Avg
{
"ts": "2026-09-21T09:12:00Z",
"value": 230.4
}- M1: ein Zeitstempel für alle Werte der Messgruppe; die Schlüssel sind die Variablennamen der Registerliste, flach – keine Verschachtelung, keine Arrays. Die Messgruppe
basic_devicesendet Spannungen und Geräteinformationen auf dieselbe Weise auf ihr eigenes Topic. - M2: je Messwert eine Nachricht;
valueist ein einzelner Skalar im Datentyp der Registerliste (Fließkommazahl mit Dezimalpunkt, Zähler als Integer, Meldungen als Boolean).
Für beide Varianten gilt:
ts– ISO-8601-String in UTC, FormatYYYY-MM-DDThh:mm:ssZ, z. B."2026-09-21T09:12:00Z"; Millisekunden (…:00.123Z) und die Schreibweise+00:00sind zulässig, lokale Zeit ohne Zonenangabe oder Unix-Zeitstempel nicht. Der Zeitstempel ist der Zeitpunkt der Modbus-Abfrage und wird vom Gateway gesetzt.- Werte als JSON-Number (kein String), Einheiten wie vom Messgerät geliefert (V, A, W, var). Umrechnungen wie W → kW erfolgen zentral in niotix, nicht im Gateway.
- Gültiges JSON: Der Zeitstempel steht in Anführungszeichen. Ungültiges JSON wird von niotix als Rohstring weitergereicht und lässt sich nicht weiterverarbeiten.
Variablennamen (camelCase, Suffix Avg für geräteseitige Mittelwerte) und Registerauswahl sind Teil der gerätespezifischen Registerliste, die Digimondo bereitstellt. Die Zuordnung dieser Namen zu Datenpunkten in niotix ist unter Nächste Schritte skizziert.
Schritt 5: MQTT (Incoming)-Konnektor anlegen
Unter Integrationen → Konnektoren einen Konnektor vom Typ MQTT (Incoming) anlegen und mit den Verbindungsdaten des mqttbroker aus Schritt 1 füllen:
Feld |
Wert |
|---|---|
| Instanz-Name | z. B. „Ortsnetzstationen – Eingang" |
| URL | die URL aus den Verbindungsdaten (SaaS: mqtts://consumers.mq.iot-hub.com:8883) |
| Username / Password | Benutzername und Passwort aus den Verbindungsdaten |
| Topic | das Parent-Topic mit Wildcard: consumers/<uuid>/# |
| Template | zunächst Pass-through |
| Server-Zertifikat (CA), Client-Zertifikat, Client-Schlüssel | leer |
| Self-signed certificate | reject |
| Client-ID | leer (wird automatisch erzeugt) |
| Clean session | Yes |
| QoS | Standard |
Mit „Validieren & Speichern" baut niotix die Verbindung zum Broker auf und abonniert das Topic. Alle Einstellungen im Detail: MQTT (Incoming).
Pass-through reicht für den Nachweis der Verbindung: Die Nachrichten werden unverändert in die Konnektor Logs geschrieben. Die Transformation in das niotix-Standardformat (Datenformat für eingehende Daten) wird im nächsten Schritt im Feld Template hinterlegt.
Verbindung prüfen
In dieser Reihenfolge, damit jede Ebene einzeln geprüft wird:
- Status Logs des MQTT (Incoming)-Konnektors (Stift-Symbol in der Konnektorliste → Tab Status Logs): Die Verbindung von niotix zum Broker steht – erfolgreiche Verbindungsversuche erscheinen als Statusmeldung.
- Das Gateway publiziert das kleine Test-Set aus Schritt 4.
- Konnektor Logs (Tab Konnektor Logs derselben Detailansicht): Jede empfangene Nachricht erscheint als Paket mit dem Topic und dem geparsten Payload unter
value(Beispiel unten). - Für den Dauerbetrieb eine Konnektor-Überwachung einrichten, damit ausbleibende Nachrichten einer Station gemeldet werden.
So sieht ein Paket der Variante 1 in den Konnektor Logs aus:
{
"ts": "2026-09-21T09:12:00Z",
"currentL1Avg": 12.3,
"totalActivePowerAvg": 8450.0,
"topic": "consumers/<uuid>/digiONS/Station_001/12345678/basic_device_meas_group_01",
"value": {
"ts": "2026-09-21T09:12:00Z",
"currentL1Avg": 12.3,
"totalActivePowerAvg": 8450.0
}
}
Die Suche in den Konnektor Logs umfasst Payload und Metadaten – nach Seriennummer, Stationsname oder Variablenname filtern. Der Suchbegriff wird in der URL gespeichert, sodass eine gefilterte Ansicht als Link weitergegeben werden kann. Details: Konnektor Logs.
Der Zeitstempel eines Eintrags in den Konnektor Logs ist die Verarbeitungszeit in niotix, nicht der Messzeitpunkt. Für die Prüfung des Sendetakts ist das Feld ts im Payload maßgeblich.
Als unabhängige Gegenprobe kann ein zweiter MQTT-Client mit denselben Verbindungsdaten auf consumers/<uuid>/# subscriben (z. B. mosquitto_sub, mit eigener Client-ID). Erscheinen die Nachrichten dort, aber nicht in den Konnektor Logs, liegt die Ursache auf der niotix-Seite; erscheinen sie auch dort nicht, beim Gateway.
Fehlerbehebung
Symptom |
Prüfen |
|---|---|
| Keine Verbindungsmeldung in den Status Logs | URL und Port des MQTT (Incoming) mit den Verbindungsdaten vergleichen; Benutzername und Passwort exakt übernommen? |
| Gateway meldet keine Verbindung | TLS wirklich aktiviert (nicht nur mqtts:// gewählt)? Zugangsdaten korrekt? Bei privatem APN oder Firewall: Broker-Host auf Port 8883 freigegeben (Firewall-Whitelist)? |
| Verbindung steht, aber keine Pakete in den Konnektor Logs | Publiziert das Gateway unterhalb des Parent-Topics consumers/<uuid>/…? Ein Topic außerhalb führt zur Trennung durch den Broker. Stimmt das Subscribe-Topic des Konnektors (consumers/<uuid>/#)? |
| Verbindung bricht wiederholt ab | Client-ID doppelt vergeben (zwei Gateways oder Gateway und Testclient mit derselben ID)? Keep-Alive auf unter 60 s senken. |
Pakete kommen an, value ist ein String |
Der Payload ist kein gültiges JSON – häufig fehlen Anführungszeichen um den Zeitstempel oder ein Template-Platzhalter wurde nicht ersetzt. |
| Pakete fehlen sporadisch | Sendet das Gateway JSON-Arrays mit mehr als 50 Objekten? Diese werden verworfen. Zeitstempel ts der Pakete auf Lücken prüfen, nicht die Log-Zeiten. |
Nächste Schritte
Sobald die Nachrichten in den Konnektor Logs sichtbar sind, folgt die Zuordnung zu Datenpunkten. Dafür wird im Feld Template des MQTT (Incoming)-Konnektors eine JavaScript-Transformation hinterlegt, die jede Nachricht in das niotix-Standardformat überführt. Je nach Anwendungsfall gehen die Daten direkt an einen Digitalen Zwilling oder zunächst an ein Virtuelles Gerät:
| Ziel Digitaler Zwilling | Ziel Virtuelles Gerät | |
|---|---|---|
| Adressierung | routing mit Referenz-Id-Schlüssel und -Wert – z. B. Seriennummer und Messgruppe aus dem Topic (Dynamisches Datenrouting) |
identifier = Externe Id des Virtuellen Geräts – z. B. die Seriennummer aus dem Topic |
| Messwert | variable (Variablenname) und data.value je Wert |
data.value.payload mit den Schlüssel-Wert-Paaren der Nachricht |
| Zeitstempel | data.time aus ts des Payloads |
data.time aus ts; liefert das Gerät keinen Zeitstempel, setzt niotix die Empfangszeit |
| Variablen umbenennen / mappen | im Template | tendenziell im Gerätetreiber des Virtuellen Geräts |
Format und Beispiele: Datenformat für eingehende Daten; Template-Editor: Eingehende Konnektoren; Referenz-Id und Datenpunkte am Zwilling: Dynamisches Datenrouting; Parsen und Mappen am Virtuellen Gerät: Gerätetreiber.
Verwandte Themen
- MQTT-Gateways – Überblick und Voraussetzungen
- Modbus-Konfiguration
- MQTT-Konnektoren – mqttbroker, MQTT (Incoming), TLS und Zertifikate
- Konnektoren – Konnektor Logs und Status Logs
- Konnektor-Überwachung
- Firewall-Whitelist
- Datenformat für eingehende Daten