Erfahren Sie, wie Sie die Verbindung zwischen MQTT und dem leistungsstärksten Gateway herstellen.

MQTT-Unterstützung des PHANTOM® Gateway 2.0

Das Gateway 2.0 aus dem drahtlosen Sensorsystem ERBESSD INSTRUMENTS® PHANTOM® sowie der kabelgebundene Monitor DEFIANT™ unterstützen das IoT-Protokoll MQTT. Alle Sensordaten sind über MQTT verfügbar, einschließlich Temperatur, Drehzahl, Frequenzbändern und Kennwerten der kabelgebundenen Kanäle, ebenso die vollständigen Zeitsignale der Schwingungssensoren (die FFT muss der Anwender aus dem Zeitsignal selbst berechnen).

Das Gateway arbeitet als MQTT-Client, der sich mit einem MQTT-Broker Ihrer Wahl verbindet, und veröffentlicht alles Erfasste als einfaches, selbstbeschreibendes JSON.

Sie können die MQTT-Unterstützung gleichzeitig mit allen anderen vom Gateway unterstützten Protokollen nutzen, darunter EI-Analytic™, EI Monitor, OPC UA und Modbus.

Einige der hier beschriebenen Optionen wurden in späteren Gateway-Versionen ergänzt. Wenn Sie eine davon in Ihrer Admin-Konsole nicht finden, aktualisieren Sie das Gateway auf die neueste Firmware.

Protokollunterstützung im Überblick

Punkt Was das Gateway tut
Rolle MQTT-Client. Das Gateway verbindet sich nach außen zu Ihrem Broker, eine eingehende Firewall-Regel ist daher nicht nötig.
MQTT-Version MQTT 3.1.1 (Protokollebene 4). Jeder MQTT-3.1.1- oder MQTT-5.0-Broker akzeptiert die Verbindung, da 5.0-Broker abwärtskompatibel zu 3.1.1-Clients sind.
Transporte mqtt:// (einfaches TCP), mqtts:// (TLS), ws:// (WebSocket), wss:// (WebSocket über TLS).
Port Frei wählbar, 1-65535. Standard ist 1883.
QoS 0, 1 oder 2, unabhängig wählbar für die Veröffentlichung und für das Verwaltungs-Abonnement.
Authentifizierung Anonym oder Benutzername + Passwort. Optional gegenseitiges TLS mit einem X.509-Client-Zertifikat.
Client-ID Standardmäßig PhantomGW-<Gateway-Seriennummer>; kann auf einen beliebigen Wert gesetzt werden.
Payload-Format Offenes UTF-8-JSON. Optional mit gzip komprimiert. Nichts Binäres oder Proprietäres geht über die Leitung.
Lokaler Broker Optionaler eingebetteter Broker auf Port 1883 (nur PHANTOM®-Gateway-Hardware).
Wiederverbindung Automatisch, Wiederholung alle 10 s. Zeitsignale, deren Veröffentlichung fehlschlägt, werden aus dem Offline-Speicher des Gateways erneut gesendet.
Rückkanal Optional. Das Gateway kann ein Verwaltungs-Topic abonnieren und die vollständige Gateway-Management-API über MQTT annehmen.

MQTT-Unterstützung aktivieren

Um die MQTT-Unterstützung in der Admin-Konsole des Gateway 2.0 zu aktivieren, schalten Sie sie auf der MQTT-Konfigurationsseite über das Kontrollkästchen „Enable MQTT connection“ ein.

Füllen Sie anschließend die Optionen Ihres MQTT-Brokers aus. Für die Verbindung zum MQTT-Broker unterstützen wir die folgenden Protokolle:

  • mqtt://
  • mqtts:// (verschlüsselt)
  • ws:// (WebSocket)
  • wss:// (WebSocket verschlüsselt)

Sie müssen den Hostnamen bzw. die IP-Adresse Ihres MQTT-Brokers, den Port und optional Benutzername und Passwort für die Authentifizierung eingeben.

Wenn Sie die vollständigen Zeitsignale der Schwingungssensoren empfangen möchten, aktivieren Sie das entsprechende Kontrollkästchen. Zeitsignale sind große Nachrichten; wenn Sie sie nicht verwenden möchten, können Sie die Option deaktiviert lassen.

Die Option „Allow Gateway management though MQTT“ erlaubt Ihnen, das Gateway und seine Sensoren über die MQTT-Verbindung mit der vollständigen Management-API zu steuern.

MQTT-Bildschirm

Nach dem Speichern der Einstellungen startet das Gateway 2.0 neu. Nach dem Neustart versucht es, sich mit dem MQTT-Broker zu verbinden, und zeigt bei Problemen im selben MQTT-Abschnitt oben einen Status an: connecting, connected, reconnecting, closed oder error, einschließlich der Fehlermeldung des Brokers, wenn die Verbindung abgelehnt wird.

Feldreferenz

Feld Beschreibung
Protocol mqtt://, mqtts://, ws:// oder wss://.
MQTT server Hostname oder IP-Adresse Ihres Brokers.
Port Broker-Port. 1883 unverschlüsselt, 8883 TLS, 443/8083 WebSocket sind die üblichen Werte.
Certificate validation Wird nur bei mqtts:// und wss:// angezeigt. Siehe den Sicherheitsabschnitt weiter unten.
CA certificate (PEM format) Fügen Sie Ihre eigene CA ein, wenn die Prüfung auf Custom CA steht.
Username / Password Beide leer lassen für eine anonyme Verbindung.
Publish Topic Basis-Topic für alle veröffentlichten Nachrichten. Pflichtfeld.
Client Id Überschreibt den Standardwert PhantomGW-<Seriennummer>. Leer lassen, um den Standard zu behalten.
Publish QoS 0, 1 oder 2.
Append gateway and sensor serial number as subtopics Macht aus dem flachen Basis-Topic einen Topic-Baum pro Sensor. Siehe den Topic-Abschnitt weiter unten.
Publish vibration waveforms & thermal images Aktiviert die großen collection-Nachrichten. Standardmäßig aus.
Send wired channels overalls Nur DEFIANT™: Never, As fast as possible oder Timeout.
Wired overall send timeout Nur DEFIANT™, wenn die Kadenz Timeout ist: Mindestsekunden zwischen Sendungen je Kanal (1-216000).
Compress (gzip) payload Komprimiert jeden Payload mit gzip.
Allow Gateway management through MQTT Abonniert ein Befehls-Topic. Siehe den Verwaltungsabschnitt weiter unten.
Subscribe topic Topic, das das Gateway abhört, wenn die Verwaltung aktiviert ist.
Subscribe QoS Für dieses Abonnement verwendete QoS.
Client Certificate / Client Key (PEM format) Unter Advanced, nur für mqtts:// und wss://. Aktiviert gegenseitiges TLS.

Sicherheit: TLS und Authentifizierung

Wählen Sie mqtts:// oder wss://, um die Verbindung zu verschlüsseln. Die Auswahl Certificate validation steuert, wie das Broker-Zertifikat geprüft wird:

Modus Verhalten Wann verwenden
Skip certificate validation (insecure) Das Zertifikat wird nicht geprüft. Der Kanal ist verschlüsselt, die Broker-Identität aber nicht bestätigt. Nur für Labor- und Teststellungen.
Validate against included CA list Standardprüfung gegen das mit dem Gateway ausgelieferte Paket öffentlicher CAs. Public-Cloud-Broker (AWS IoT Core, Azure, HiveMQ Cloud, EMQX Cloud, …).
Custom CA Prüfung gegen ein CA-Zertifikat, das Sie im PEM-Format einfügen. Private oder selbstsignierte PKI, On-Premise-Broker.

Das Feld Advanced nimmt ein Client-Zertifikat und den zugehörigen privaten Schlüssel entgegen, beide im PEM-Format, und wird nur mit mqtts:// oder wss:// verwendet. Genau das erwarten Broker, die eine X.509-Geräteidentität verlangen, etwa AWS IoT Core.

Benutzername und Passwort werden im CONNECT-Paket von MQTT übertragen. Über mqtt:// oder ws:// gehen sie im Klartext über die Leitung; kombinieren Sie Zugangsdaten daher immer mit mqtts:// oder wss://.

Der MQTT-Broker im Gateway

Die PHANTOM®-Gateway-Hardware kann außerdem einen eigenen eingebetteten MQTT-Broker betreiben, sodass eine SPS, ein SCADA oder eine Edge-Anwendung im selben Netz das Gateway ohne externe Infrastruktur direkt abonnieren kann. Beim USB-/PC-Gateway steht das nicht zur Verfügung. Aktivieren Sie ihn mit Enable local MQTT broker.

Eigenschaft Wert
Listener 1883, auf allen Schnittstellen
Authentifizierung Keine (anonym)
TLS Beim lokalen Broker nicht verfügbar
Persistenz Deaktiviert, Nachrichten überstehen keinen Neustart

Der lokale Broker hat sein eigenes Publish Topic sowie eigene Schalter für Append serial, Zeitsignale, Komprimierung und Verwaltung, unabhängig von den Einstellungen des entfernten Brokers. Beide können gleichzeitig laufen: Dieselbe Messung wird dann an Ihren entfernten Broker und an den lokalen veröffentlicht.

mosquitto_sub -h <gateway-ip> -p 1883 -t "phantom/#" -v

Da der lokale Broker keine Authentifizierung hat, betreiben Sie ihn in einem vertrauenswürdigen OT-Netzsegment.

Topic-Struktur

Mit deaktiviertem Append gateway and sensor serial number as subtopics werden alle Nachrichten auf dem eingegebenen Publish Topic veröffentlicht.

Ist die Option aktiviert, baut das Gateway einen Topic-Baum auf. Mit dem Basis-Topic phantom, der Gateway-Seriennummer EIGW12345 und der Sensor-Seriennummer (phantomCode) 40217:

Nachricht Topic dataType
Statusaktualisierung des Sensors phantom/EIGW12345/40217/stateupdate stateupdate
Aktualisierung der Frequenzbänder phantom/EIGW12345/40217/bands bandsUpdate
Zeitsignal / Wärmebild phantom/EIGW12345/40217/collection collection
Kennwerte kabelgebundener Kanäle (DEFIANT™) phantom/EIGW12345/WIRED0/stateupdate wiredOveralls
Zeitsignal kabelgebundener Kanäle (DEFIANT™) phantom/EIGW12345/<Seriennr>/collection wiredCollection
Modbus- / benutzerdefinierte Tags phantom/EIGW12345/customunits customUnitStateUpdate
Antworten der Management-API phantom/EIGW12345 (variabel)

Abonnieren Sie alles mit phantom/#, ein einzelnes Gateway mit phantom/EIGW12345/# oder einen einzelnen Sensor mit phantom/EIGW12345/40217/#.

Unterscheiden Sie immer über das Feld dataType, nicht über das Topic. Wenn Append serial aus ist, treffen alle Nachrichtentypen auf demselben Topic ein.

Payload-Format

Das Gateway beginnt Nachrichten zu veröffentlichen, sobald ein Sensor seine Daten aktualisiert (in seinem eigenen internen Aktualisierungsintervall) oder eine Zeitsignalmessung erfolgt. Die Nachrichten sind UTF-8-JSON-Objekte, ein Objekt pro Nachricht. Nichts ist binär, proprietär oder von einer Schema-Registry abhängig: Sie können sie mit JSON.parse, json.loads, einem json-Node in Node-RED, dem json_v2-Parser von Telegraf oder jedem SCADA-JSON-Tag-Reader verarbeiten.

Für alle Nachrichten gelten zwei Regeln:

  • Felder, die ein Sensor oder eine Firmware nicht liefert, werden weggelassen und nicht als null gesendet. Lesen Sie defensiv.
  • timestamp ist Unix-Zeit in Sekunden, nicht in Millisekunden.

Gemeinsame Variablen aller Sensoren

Variablenname Beschreibung
dataType Nachrichtentyp: stateupdate, bandsUpdate, collection, wiredOveralls, wiredCollection oder customUnitStateUpdate. collection steht für Zeitsignale und Wärmebilder; jede andere Aktualisierung ist stateupdate.
type Sensortyp (siehe Tabelle unten).
phantomCode Seriennummer des Sensors. Hinweis: collection-Nachrichten von Schwingungssensoren verwenden stattdessen serialNumber.
gwSerial Seriennummer des Gateways.
timestamp Zeitpunkt der Messung, in Sekunden seit 1970.
friendlyName Der in der Konsole vergebene Name des Sensors. Wird weggelassen, wenn keiner gesetzt ist.
seq Sequenzzähler der Sensoraktualisierungen. Läuft bei 255 über; ein Sprung bedeutet, dass Advertisements über die Luft verloren gingen.
battery Batteriespannung in Volt.
batteryType Batterietyp (siehe Tabelle unten).
temperature Interne Temperatur des Sensors (in Grad Celsius).
updateInterval Am Sensor eingestelltes Aktualisierungsintervall, in Sekunden.
txPower Sendeleistung des Funkmoduls, in dBm.
advFlags Bitfeld mit den internen Advertising-Flags des Sensors.
version Firmware-Version.
rssi Signalstärke des Sensors, in dBm (nur bei stateupdate).
Sensorcode Sensortyp
3 Triaxialer Beschleunigungssensor (KX222, hoher Bereich)
5 Triaxialer Beschleunigungssensor (KX122, kleiner Bereich)
6 Triaxialer Beschleunigungssensor (KX134)
7 Triaxial universal (Schwingung + Thermoelement + Strom)
8 Triaxial PHANTOM® Gen 4, hoher Bereich
9 Triaxial PHANTOM® Gen 4, kleiner Bereich
10 Wärmebildkamera
12 Repeater
14 PHANTOM® MAX, hoher Bereich
15 PHANTOM® MAX, kleiner Bereich
20 Thermoelement
21 Thermoelement v2
22 Thermoelement v3
25 Infrarot-Temperatur
26 4-20-mA-Sensorknoten
27 Spannungsmesser (0-10 VDC)
30 Strommodul v1
31 Trockenkontakt
32 Strommodul v2 (4 Kanäle)
40 Drehzahl (RPM-Modul)
50 Abstand
60 Universalmodul
202 Display
batteryType Batterie
1 ⅙ D
2 AAA
3 CR2032
4 CR2477
5 AA
6 D

Dies sind die Eigenschaften, die für jeden Sensortyp enthalten sind.

Triaxialer Beschleunigungssensor (3, 5, 6, 8 und 9)

Variablenname Beschreibung
rms Array aus drei Gleitkommazahlen mit dem Geschwindigkeits-RMS in mm/s je Achse.
arms Array aus drei Gleitkommazahlen mit dem Beschleunigungs-RMS in g je Achse.
minRMSFreq Untere Grenze des Geschwindigkeits-RMS-Bands, in Hz.
maxRMSFreq Obere Grenze des Geschwindigkeits-RMS-Bands, in Hz.
minRMSFreqAccel Untere Grenze des Beschleunigungs-RMS-Bands, in Hz.
maxRMSFreqAccel Obere Grenze des Beschleunigungs-RMS-Bands, in Hz.
range Aktuell konfigurierter Messbereich des Beschleunigungssensors, in g.
magneticspeed Nur PHANTOM® MAX (14 und 15): magnetisch ermittelte Drehzahl, in Hz.

Beispiel für eine stateupdate-Nachricht:

{
  "rssi": -63,
  "type": 6,
  "version": 195,
  "phantomCode": 40217,
  "gwSerial": "EIGW12345",
  "timestamp": 1756231043,
  "dataType": "stateupdate",
  "friendlyName": "Pumpe 3 - Motor AS",
  "seq": 184,
  "advFlags": 0,
  "batteryType": 1,
  "battery": 3.61,
  "temperature": 41.25,
  "updateInterval": 300,
  "txPower": 4,
  "minRMSFreq": 10,
  "maxRMSFreq": 1000,
  "rms": [1.42, 0.88, 2.07],
  "range": 16,
  "recordingSettings": 3,
  "minRMSFreqAccel": 1000,
  "maxRMSFreqAccel": 10000,
  "arms": [0.412, 0.298, 0.677]
}

Triaxialer Beschleunigungssensor mit dataType „collection“

Variablenname Beschreibung
serialNumber Seriennummer des Sensors. Diese Nachricht verwendet serialNumber, nicht phantomCode.
sampleRate Abtastrate, mit der diese Messung aufgenommen wurde, in Hz.
data Enthält die Zeitsignaldaten in drei Arrays, eines je Achse. Zwei der Arrays können leer sein, wenn ein Einachsmodus gewählt wurde. Die Werte in den Arrays sind in G (9,8 m/s²).
isAlarm true, wenn die Aufzeichnung durch eine Alarmbedingung ausgelöst wurde.
rpm Drehzahl zum Aufnahmezeitpunkt. Wird weggelassen, wenn nicht verfügbar.
temperature Interne Sensortemperatur bei der Aufnahme, in Grad Celsius. Wird von den Sensoren geliefert, die sie messen.
{
  "serialNumber": 40217,
  "sampleRate": 3200,
  "gwSerial": "EIGW12345",
  "timestamp": 1756231043,
  "type": 6,
  "dataType": "collection",
  "friendlyName": "Pumpe 3 - Motor AS",
  "isAlarm": false,
  "rpm": 1478,
  "temperature": 41.25,
  "data": [
    [0.0123, -0.0044, 0.0187],
    [0.0091, 0.0102, -0.0058],
    [-0.021, 0.0176, 0.0031]
  ]
}

Die drei Sample-Arrays sind in diesem Beispiel gekürzt; eine echte Nachricht enthält die vollständige Aufzeichnung. Die Anzahl der Samples je Achse ist data[n].length, und die Dauer der Aufzeichnung in Sekunden ist data[n].length / sampleRate.

Nachricht der Frequenzbänder (dataType „bandsUpdate“)

Triaxiale Sensoren, die erweiterte Banddaten senden, veröffentlichen zusätzlich zur Statusaktualisierung ein bandsUpdate.

Variablenname Beschreibung
rpmMin / rpmMax Drehzahlfenster, für das die Bänder ausgewertet wurden.
bands[].min / .max Bandgrenzen, ausgedrückt in unit: hz (ganzzahlig) oder orders (eine Dezimale).
bands[].measurement velocity oder acceleration.
bands[].output Auf das Band angewandter Detektor (rms, peak, …).
bands[].values Ergebnis je Achse, { x, y, z }.
bands[].valueUnit mm/s bei Geschwindigkeitsbändern, mg bei Beschleunigungsbändern.
{
  "dataType": "bandsUpdate",
  "serialNumber": 40217,
  "phantomCode": 40217,
  "type": 6,
  "version": 195,
  "gwSerial": "EIGW12345",
  "timestamp": 1756231043,
  "seq": 184,
  "rpmMin": 1450,
  "rpmMax": 1495,
  "bands": [
    {
      "min": 1.0,
      "max": 2.5,
      "measurement": "velocity",
      "unit": "orders",
      "output": "rms",
      "values": { "x": 1.12, "y": 0.74, "z": 1.88 },
      "valueUnit": "mm/s"
    }
  ]
}

Nachricht der Wärmebildkamera (10)

Bei dataType: "stateupdate" meldet die Kamera avgImageTemperature, die mittlere Bildtemperatur in Grad Celsius.

Bei dataType: "collection" wird das vollständige Bild veröffentlicht:

Variablenname Beschreibung
columns Bildbreite in Pixeln.
rows Bildhöhe in Pixeln.
frames Anzahl der Einzelbilder in der Nachricht.
frameRate Bildrate der Aufnahme.
data Array aus frames Bildern; jedes Bild ist ein Array aus rows Zeilen; jede Zeile enthält columns Temperaturen in Celsius.
{
  "phantomCode": 60912,
  "serialNumber": 60912,
  "gwSerial": "EIGW12345",
  "timestamp": 1756231400,
  "type": 10,
  "dataType": "collection",
  "columns": 32,
  "rows": 24,
  "frames": 1,
  "frameRate": 1,
  "data": [
    [
      [24.31, 24.55, 25.02],
      [24.28, 24.61, 25.14]
    ]
  ]
}

Nachricht des Thermoelement-Temperaturknotens (20, 21 und 22)

Variablenname Beschreibung
tcTemperature Array aus drei Gleitkommazahlen mit der Temperatur jedes Thermoelement-Kanals in Celsius.

Nachricht des Infrarot-Temperaturknotens (25)

Variablenname Beschreibung
ambientTemperature Vom Infrarotsensor gemessene Umgebungstemperatur in Celsius.
objectTemperature Temperatur des Objekts, auf das der Infrarotsensor zeigt, in Celsius.
emissivity Für das Messobjekt konfigurierter Emissionsgrad.

4-20-mA-Sensor (26) und Spannungsmesser (27)

Variablenname Beschreibung
voltage Array aus vier Gleitkommazahlen mit der gemessenen Spannung je Kanal.

Drehzahlsensor (RPM) (40)

Variablenname Beschreibung
rpm Gleitkommawert mit der aktuellen Drehzahl in RPM.
rpmTimeout Sekunden ohne Impuls, nach denen der Sensor die Drehzahl null meldet.

Abstandssensor (50)

Variablenname Beschreibung
distance Gemessener Abstand, in mm.

Universalmodul (60)

Variablenname Beschreibung
rms Array mit dem RMS je Achse. Geschwindigkeit in mm/s oder Beschleunigung in g, je nach gpFlags.
sensitivity Konfigurierte Empfindlichkeit des Aufnehmers, in mV/g.
gpFlags Bitfeld. Bit 0 gibt an, ob rms eine Geschwindigkeits- oder eine Beschleunigungsmessung ist.

Stromsensor (30 und 32)

Variablenname Beschreibung
instCurrent Array aus vier Gleitkommazahlen mit dem Momentanstrom jedes der vier Sensorkanäle, in Ampere.
averageCurrent Array aus vier Gleitkommazahlen mit dem mittleren Strom jedes der vier Sensorkanäle, in Ampere.
minCurrent Array aus vier Gleitkommazahlen mit dem minimalen Strom jedes der vier Sensorkanäle, in Ampere.
maxCurrent Array aus vier Gleitkommazahlen mit dem maximalen Strom jedes der vier Sensorkanäle, in Ampere.
accumulatedCurrent Array aus vier Gleitkommazahlen mit dem kumulierten Strom jedes der vier Sensorkanäle.
accumulatedStart Beginn des Kumulationsfensters, in Sekunden seit 1970.
accumulatedEnd Ende des Kumulationsfensters, in Sekunden seit 1970.
currentProbeType Auf jedem Kanal konfigurierter Wandlertyp.
currentOffsets Auf jeden Kanal angewandter Kalibrier-Offset.
currentMultiplier Auf jeden Kanal angewandter Kalibrierfaktor.
{
  "dataType": "stateupdate",
  "type": 32,
  "phantomCode": 51844,
  "gwSerial": "EIGW12345",
  "timestamp": 1756231102,
  "rssi": -71,
  "version": 118,
  "battery": 3.58,
  "batteryType": 4,
  "temperature": 33.1,
  "instCurrent": [12.4, 12.1, 12.8, 0.0],
  "averageCurrent": [12.3, 12.0, 12.7, 0.0],
  "minCurrent": [11.9, 11.6, 12.2, 0.0],
  "maxCurrent": [13.1, 12.9, 13.4, 0.0],
  "accumulatedCurrent": [842.5, 838.1, 851.9, 0.0],
  "accumulatedStart": 1753553200,
  "accumulatedEnd": 1756231102
}

Trockenkontaktsensor (31)

Variablenname Beschreibung
dryContactsState Boolesches Array der Größe 4 mit dem Zustand des Eingangs. True bedeutet Kontakt geschlossen, false bedeutet offen.
debounce Auf die Eingänge angewandte Entprellzeit.

Kabelgebundene Kanäle des DEFIANT™

Die Kennwerte der kabelgebundenen Kanäle werden gemäß der Kadenz von Send wired channels overalls veröffentlicht (Never, As fast as possible oder begrenzt durch Wired overall send timeout). Im Payload beginnt wiredChannel bei 1, und es werden nur die Kennwerte aufgenommen, die für diesen Kanal tatsächlich berechnet werden.

{
  "dataType": "wiredOveralls",
  "wiredChannel": 1,
  "gwSerial": "EIDF98765",
  "timestamp": 1756231500,
  "sensorType": "accelerometer",
  "friendlyName": "Ventilator 12 - innen",
  "accel_rms": 0.482,
  "velocity_rms": 2.14,
  "displacement_rms": 18.7,
  "gE": 0.93,
  "rpm": 1786,
  "accel_truepeak": 1.84,
  "accel_peaktopeak": 3.52,
  "accel_kurtosis": 3.11
}

Verfügbare Schlüssel:

Gruppe Schlüssel
Beschleunigung accel_rms, accel_truepeak, accel_peaktopeak, accel_lowfreq, accel_medfreq, accel_highfreq, accel_kurtosis, accel_skewness
Geschwindigkeit velocity_rms, velocity_truepeak, velocity_peaktopeak, velocity_lowfreq, velocity_medfreq, velocity_highfreq, velocity_kurtosis, velocity_skewness
Beschleunigungshüllkurve gE, ge_truepeak, ge_peaktopeak, ge_lowfreq, ge_medfreq, ge_highfreq, ge_kurtosis, ge_skewness
Weg displacement_rms, displacement_truepeak, displacement_peaktopeak, displacement_offset
Drehzahl rpm
Analog / diskret voltage_discrete, voltage_average, discrete_value
Phase zwischen Kanälen phase_channel_1phase_channel_16

Solange sich der DEFIANT™ im Projektmodus (Route/Aufzeichnung) befindet, ist die Veröffentlichung von wiredOveralls ausgesetzt.

Kabelgebundene Zeitsignale werden als wiredCollection veröffentlicht, mit einem einzelnen data-Array, das bereits mit der Kanalkalibrierung und der Sensorempfindlichkeit skaliert ist:

{
  "dataType": "wiredCollection",
  "wiredChannel": 1,
  "gwSerial": "EIDF98765",
  "timestamp": 1756231500,
  "sensorType": "accelerometer",
  "sampleRate": 25600,
  "data": [0.0041, -0.0093, 0.0128]
}

Modbus- und benutzerdefinierte Tags

Werte, die das Gateway von Modbus-Geräten anderer Hersteller oder von kabelgebundenen benutzerdefinierten Einheiten liest, werden über MQTT als customUnitStateUpdate weiterveröffentlicht. units und values sind parallele Arrays, und ein Feld wiredChannel kommt hinzu, wenn der Wert von einem kabelgebundenen Kanal des DEFIANT™ stammt.

{
  "dataType": "customUnitStateUpdate",
  "gwSerial": "EIGW12345",
  "timestamp": 1756231600,
  "source": "gateway",
  "clientName": "Kompressor-SPS",
  "tagName": "DischargePressure",
  "functionType": "holdingRegister",
  "address": 40012,
  "byteOrder": "ABCD",
  "tagDataType": "float32",
  "machineCode": "COMP-01",
  "pointIndex": 2,
  "units": ["bar"],
  "values": [7.42]
}

Payload-Komprimierung

Die Option Compress (gzip) payload verpackt jeden JSON-Payload vor dem Veröffentlichen in einen gzip-Strom, was Zeitsignal-Nachrichten üblicherweise um 60 bis 80 % verkleinert. Der Payload besteht dann aus rohen gzip-Bytes, nicht aus Text, und muss vor dem Parsen dekomprimiert werden:

import gzip, json
import paho.mqtt.client as mqtt

def on_message(client, userdata, msg):
    raw = msg.payload
    if raw[:2] == b"\x1f\x8b":            # gzip-Magic-Number
        raw = gzip.decompress(raw)
    data = json.loads(raw)
    print(data["dataType"], data.get("phantomCode") or data.get("serialNumber"))

client = mqtt.Client()
client.username_pw_set("phantom", "ihr-passwort")
client.tls_set()                          # erforderlich für mqtts://
client.on_message = on_message
client.connect("broker.example.com", 8883)
client.subscribe("phantom/#", qos=1)
client.loop_forever()

Lassen Sie die Komprimierung aus, wenn Ihre Plattform Payloads nicht dekomprimieren kann; viele SCADA-JSON-Tag-Reader können das nicht.

Fernverwaltung über MQTT

Wird Allow Gateway management through MQTT aktiviert, abonniert das Gateway das Subscribe topic und führt die dort empfangenen JSON-Befehle aus. Antworten werden auf dem normalen Publish-Topic veröffentlicht, mit angehängtem /<gwSerial>, wenn Append serial aktiv ist. Jeder Befehl muss die Seriennummer des Ziel-Gateways in gwSerial enthalten; ein Gateway ignoriert Befehle, die an eine andere Seriennummer gerichtet sind.

Ein Zeitsignal von einem bestimmten Sensor anfordern:

{
  "type": "requestWaveform",
  "gwSerial": "EIGW12345",
  "phantomCode": 40217
}

Die Gateway-Management-API aufrufen:

{
  "type": "observeerequest",
  "gwSerial": "EIGW12345",
  "action": "getstate"
}

Das Gateway antwortet mit denselben JSON-Dokumenten, die die Admin-Konsole über WebSocket erhält, ergänzt um ein Feld gwSerial, damit Sie die Antworten zuordnen können. Das action-Vokabular deckt den vollen Funktionsumfang der Konsole ab, darunter getstate, deviceinfo, setbasicconfig, setfriendlyname, pair, unpair, restart, startfwupdate, getofflinefiles und wiredcollectnow. Wenden Sie sich an einen Support-Mitarbeiter von ERBESSD INSTRUMENTS®, um eine Kopie der Dokumentation der Management-API zu erhalten.

Dies ist ein privilegierter Steuerkanal. Aktivieren Sie ihn nur auf einem authentifizierten, TLS-geschützten Broker mit einer ACL, die einschränkt, wer auf dem Subscribe-Topic veröffentlichen darf. Lassen Sie ihn deaktiviert, wenn Sie nur Telemetrie benötigen.

MQTT-Version und Payload-Format

MQTT-Version. Der Client des Gateways verbindet sich auf Protokollebene 4, also MQTT 3.1.1. Das ist die interoperable Basis: MQTT-5.0-Broker akzeptieren 3.1.1-Clients, eine MQTT-5.0-Infrastruktur funktioniert also ohne Änderungen. Was die Gateway-Sitzung nicht nutzt, sind die 5.0-exklusiven Funktionen wie Shared Subscriptions, Topic-Aliase, Request/Response-Korrelationseigenschaften, Session-Ablauf und Reason Codes. Wenn Sie diese weiter hinten in der Kette brauchen, beenden Sie die 3.1.1-Sitzung des Gateways an Ihrem Broker und sprechen Sie 5.0 zwischen Broker und Anwendungen.

Ist der Payload proprietär? Nein. Es ist offenes JSON mit stabilen Feldnamen, oben vollständig dokumentiert. Zum Lesen sind weder eine Schema-Registry noch eine Lizenz oder ein SDK erforderlich.

Schnellstart mit mosquitto_sub

mosquitto_sub -h broker.example.com -p 8883 --cafile /etc/ssl/certs/ca-certificates.crt -u phantom -P "ihr-passwort" -t "phantom/#" -q 1 -v

Nur die schlanken Statusaktualisierungen filtern:

mosquitto_sub -h broker.example.com -t "phantom/+/+/stateupdate" -v