Überblick
Integrationsflows erlauben es, Daten eventbasiert aus niotix an Drittsysteme zu übertragen. Zusätzlich können die zu übertragenden Daten vor der Übertragung gefiltert und transformiert werden. So können die relevanten Datenpakete in dem vom Drittsystem benötigten Datenformat übertragen werden.
Grundsätzlich können in einem Integrationsflow die folgenden Daten verwendet werden:
- Jedes empfangene Datenpaket eines eingehenden Konnektors
- Jede Änderung eines Datenpunktes von einem Virtuellen Gerät
- Jede Änderung eines Datenpunktes von einem Digitalen Zwilling
- Jeder erzeugte Alarmprotokolleintrag
Hierbei werden für einen Integrationsflow zunächst alle erzeugten Daten für den jeweiligen Account berücksichtigt. Um nur die benötigten Datensätze weiter zu verarbeiten, können Filter definiert werden. Beispielsweise können so die Daten auf einen Digitalen Zwilling oder Konnektor eingeschränkt werden (siehe Kapitel “Filter”). Zusätzlich ist es möglich die Daten vor der Weiterleitung über einen Konnektor zu transformieren. Dabei können Daten in die gewünschte Struktur oder das gewünschte Datenformat gebracht werden (siehe Kapitel “Transformationen”). Am Ende eines Integrationsflows steht genau ein Konnektor-Schritt — dieser Schritt kann jedoch mehrere ausgehende Konnektoren enthalten, sodass Daten gleichzeitig an mehrere Zielsysteme weitergeleitet werden können.
Einen Integrationsflow anlegen
Im Navigationspunkt Integrationen > Integrationsflows den Anlegen-Button verwenden, um einen neuen Integrationsflow anzulegen. Es öffnet sich der folgende Dialog:

Das niotix-Backend liefert Daten standardmäßig im Format generic. Sollen die Daten an ein System weitergeleitet werden, das JSON erwartet, muss im Integrationsflow vor dem Konnektor-Schritt eine Transformation eingefügt werden — mit Eingabe-Typ generic und Ausgabe-Typ application/json.
- Name: Eindeutiger Name für den Integrationsflow.
- Konto: Das Konto, für das der Integrationsflow gelten soll. Kann nach dem Anlegen nicht mehr geändert werden.
- Auslöser: Bestimmt, welche Art von Daten den Flow auslöst. Es stehen folgende Optionen zur Verfügung:
- BEFORE STATE-HANDLING: Datenstrom nach der Konnektortransformation, aber noch vor der Zuweisung an ein Virtuelles Gerät oder einen Digitalen Zwilling. Jedes eingehende Paket erzeugt eine Nachricht — einmal für
_parsed(vollständiger Messwert-JSON) und je eine für jede einzelne Variable. Metainformationen wiedtwin_idodertwin_tagssind nicht verfügbar. Struktur des Datenobjekts: Before State-Handling Objekt. - AFTER STATE HANDLING: Jede Änderung eines Datenpunktes eines Virtuellen Gerätes oder Digitalen Zwillings. Metainformationen wie
dtwin_id,twin_tags,vdevice_groupsund Custom Properties sind verfügbar. Struktur des Datenobjekts: After State Handling Objekt. - ALARMLOG WAS CREATED/RESOLVED: Wird ausgelöst, sobald ein Alarmprotokolleintrag erstellt oder aufgelöst wird. Struktur des Datenobjekts: Alarmlog-Objekt. Anwendungsbeispiel: Best-Practice-Beitrag — Alarmierungen in Slack & Microsoft Teams
- BEFORE STATE-HANDLING: Datenstrom nach der Konnektortransformation, aber noch vor der Zuweisung an ein Virtuelles Gerät oder einen Digitalen Zwilling. Jedes eingehende Paket erzeugt eine Nachricht — einmal für
- Integrationsflow Schritte: Über das Dropdown können Filter, Transformationen und der abschließende Konnektor zum Flow hinzugefügt werden. Die Reihenfolge lässt sich per Drag-and-drop anpassen.
- Reihenfolge: Der letzte Schritt muss zwingend der Konnektor-Schritt sein. Innerhalb des Konnektor-Schritts können über das -Symbol mehrere ausgehende Konnektoren hinzugefügt werden — die Daten werden dann parallel an alle gewählten Zielsysteme gesendet.
Erläuterung des BEFORE STATE-HANDLING Objektes
Das BEFORE STATE-HANDLING-Objekt enthält die Daten, nachdem der Konnektor sie empfangen und der Gerätetreiber sie in benannte Messwerte aufgeteilt hat — aber bevor eine Zuweisung an ein Virtuelles Gerät oder einen Digitalen Zwilling stattfindet. Das Feld value enthält die vom Gerätetreiber geparsten Messwerte.
Für jedes eingehende Paket werden mehrere Nachrichten erzeugt: eine mit allen Messwerten gemeinsam (meta.parser_variable: "_parsed") und je eine pro einzelnem Messwert. Das Feld meta.parser_variable zeigt an, auf welchen Messwert sich die jeweilige Nachricht bezieht.
{
"meta": {
"account_id": 1250,
"config_id": 557,
"source_identifier": "my-device-external-id",
"parser_variable": "_parsed",
"timestamp": "2024-07-12T13:09:45.901Z"
},
"value": {
"flowtemperature": 72.4,
"returntemperature": 55.1,
"volume": 900
}
}Feldbeschreibungen:
| Feld | Typ | Beschreibung |
|---|---|---|
meta.account_id |
number |
Konto-ID |
meta.config_id |
number |
ID des eingehenden Konnektors |
meta.source_identifier |
string |
Externe ID des Geräts (Identifier aus dem eingehenden Paket) |
meta.parser_variable |
string |
Variablenname, z.B. _parsed oder flowtemperature |
meta.timestamp |
string |
Zeitstempel des Pakets (ISO 8601) |
value |
any |
Datenwert: Objekt mit allen Messwerten (bei _parsed) oder Einzelwert (bei einzelner Variable) |
Felder wie dtwin_id, twin_tags, vdevice_groups, state_id oder unit sind in diesem Kontext nicht verfügbar, da die Daten noch keinem Virtuellen Gerät oder Digitalen Zwilling zugeordnet sind.
Erläuterung des “After state handling” - Objektes
Das AFTER STATE HANDLING-Objekt ist das Standardformat der von niotix ausgehenden Pakete im Integrationsflow. Soll das Datenformat vor der Weiterleitung an ein Drittsystem angepasst werden, muss im Flow vor dem Konnektor-Schritt eine Transformation eingefügt werden.
Im Objekt stehen die folgenden Informationen des zugehörigen Virtuellen Gerätes oder Digitalen Zwillings zur Verfügung. Jede Änderung eines einzelnen Datenpunktes erzeugt dabei eine separate Nachricht im Integrationsflow.
Unterschiede zwischen Virtuellem Gerät und Digitalem Zwilling:
Das Feld twin_category zeigt, ob es sich um ein virtualDevice oder einen digitalTwin handelt. Die Felder vdevice_groups, device_type_id, device_driver_id, operational_status und config_type sind ausschließlich beim Virtuellen Gerät belegt. Beim Digitalen Zwilling sind diese Felder leer oder null. Das Feld twin_ancestor_ids enthält beim Virtuellen Gerät die IDs der übergeordneten Digitalen Zwillinge; beim Digitalen Zwilling auf oberster Hierarchieebene ist es leer. Der Wert source_type ist beim VG typischerweise bridge (Daten kommen von einem Konnektor), beim DT häufig virtual-device (Daten wurden von einem untergeordneten VG übertragen).
{
"meta": {
"timestamp": "2024-07-12T13:09:45.901Z",
"state_id": 1178539,
"dtwin_id": 63797,
"dtwin_title": "My device",
"twin_tags": ["tag1"],
"twin_ancestor_ids": [
63796
],
"twin_category": "virtualDevice",
"vdevice_groups": [
"group1",
"group2",
"group42"
],
"device_type_id": 1957,
"device_driver_id": 1957,
"operational_status": 3,
"geolocation": {
"latitude": 71.17092,
"longitude": 25.783081,
"address": "Storgata 78, 9008 Tromsø, Norway"
},
"unit": null,
"state_identifier": "_parsed",
"state_type": "json",
"account_id": 1250,
"config_id": 557,
"config_type": "bridge-incomingwebhook",
"source_type": "bridge",
"source_identifier": "my-device-external-id",
"parser_variable": "_parsed",
"twin_key_value": {
"key": "value",
"custom": "info",
"additional": "properties"
}
},
"value": {
"persons": 23,
"flowtemperature": 55,
"returntemperature": 35,
"battery": 2.75
}
}{
"meta": {
"timestamp": "2024-07-12T13:09:45.901Z",
"state_id": 1178540,
"dtwin_id": 63797,
"dtwin_title": "My device",
"twin_tags": ["tag1"],
"twin_ancestor_ids": [
63796
],
"twin_category": "virtualDevice",
"vdevice_groups": [
"group1",
"group2",
"group42"
],
"device_type_id": 1957,
"device_driver_id": 1957,
"operational_status": 3,
"geolocation": {
"latitude": 71.17092,
"longitude": 25.783081,
"address": "Storgata 78, 9008 Tromsø, Norway"
},
"unit": "°C",
"state_identifier": "flowtemperature",
"state_type": "number",
"account_id": 1250,
"config_id": 557,
"config_type": "bridge-incomingwebhook",
"source_type": "bridge",
"source_identifier": "my-device-external-id",
"parser_variable": "flowtemperature",
"twin_key_value": {
"key": "value",
"custom": "info",
"additional": "properties"
}
},
"value": 55
}{
"meta": {
"timestamp": "2024-07-12T13:09:45.901Z",
"state_id": 9984231,
"dtwin_id": 12001,
"dtwin_title": "Building A",
"twin_tags": ["city-center", "commercial"],
"twin_ancestor_ids": [],
"twin_category": "digitalTwin",
"vdevice_groups": [],
"device_type_id": null,
"device_driver_id": null,
"operational_status": null,
"geolocation": {
"latitude": 53.5511,
"longitude": 9.9937,
"address": "Rathausmarkt 1, 20095 Hamburg, Germany"
},
"unit": null,
"state_identifier": "status",
"state_type": "json",
"account_id": 1250,
"config_id": null,
"config_type": null,
"source_type": "virtual-device",
"source_identifier": "sensor-001",
"parser_variable": "status",
"twin_key_value": {
"building_type": "office",
"floor_count": "5"
}
},
"value": {
"activeAlarms": 2,
"avgTemperature": 21.5,
"totalEnergy": 1250.5
}
}{
"meta": {
"timestamp": "2024-07-12T13:09:45.901Z",
"state_id": 9984232,
"dtwin_id": 12001,
"dtwin_title": "Building A",
"twin_tags": ["city-center", "commercial"],
"twin_ancestor_ids": [],
"twin_category": "digitalTwin",
"vdevice_groups": [],
"device_type_id": null,
"device_driver_id": null,
"operational_status": null,
"geolocation": {
"latitude": 53.5511,
"longitude": 9.9937,
"address": "Rathausmarkt 1, 20095 Hamburg, Germany"
},
"unit": "kWh",
"state_identifier": "totalEnergy",
"state_type": "number",
"account_id": 1250,
"config_id": null,
"config_type": null,
"source_type": "virtual-device",
"source_identifier": "sensor-001",
"parser_variable": "totalEnergy",
"twin_key_value": {
"building_type": "office",
"floor_count": "5"
}
},
"value": 1250.5
}-
meta: Enthält die Meta-Informationen zu dem Datenpunkt, der sich verändert hat.
- timestamp: Zeitstempel, zu dem die Veränderung registriert wurde. Beispiel:
2024-07-12T13:09:45.901Z - state_id: ID des Datenpunktes. Beispiel:
1178539 - dtwin_id: ID des Digitalen Zwillings oder Virtuellen Gerätes, zu dem dieser Datenpunkt gehört. Beispiel:
63797 - dtwin_title: Titel des Digitalen Zwillings oder Virtuellen Gerätes, zu dem dieser Datenpunkt gehört. Beispiel:
My device - twin_tags: Liste der Tags. Beispiel:
["tag1"] - twin_ancestor_ids: Liste der Digitalen Zwillinge, die in der Hierarchie über diesem Virtuellen Gerät oder Digitalen Zwilling stehen. Beispiel:
[63796] - twin_category: Kategorie des Zwillings oder Gerätes.
virtualDeviceoderdigitalTwin - vdevice_groups: Gruppen, denen das Virtuelle Gerät angehört. Beispiel:
["group1", "group2", "group42"] - device_type_id: ID des Gerätetyps. Beispiel:
1957 - device_driver_id: ID des Gerätetreibers. Beispiel:
1957 - operational_status: Betriebsstatus des Gerätes.
0= nicht gesetzt;1= “Unterwegs”;2= “Betriebsbereit;3= “in Betrieb”;4= “Vorübergehend inaktiv;5= “Stillgelegt”. - geolocation: Geografische Lage des Gerätes.
- latitude: Breitengrad. Beispiel:
71.17092 - longitude: Längengrad. Beispiel:
25.783081 - address: Adresse des Gerätes. Beispiel:
Storgata 78, 9008 Tromsø, Norway
- latitude: Breitengrad. Beispiel:
- unit: Einheit der Messung. Beispiel:
number - state_identifier: Schlüssel des Datenpunktes. Beispiel:
_parsed - state_type: Datentyp des Datenpunktes. Beispiel:
json - account_id: ID des zugehörigen Kontos. Beispiel:
1250 - config_id: ID des Konnektors. Beispiel:
557 - config_type: Typ des Konnektors. Beispiel:
bridge-incomingwebhook - source_type: Quelle des Datenpunktes.
bridge= Konnektor;virtual-device= Virtuelles Gerät;virtual-device-aggregate= Virtuelles Gerät Aggregation;none= keine;timeseries-aggregate= Zeitlich aggregiert;aggregate= Aggregation;random= Zufall - source_identifier: Externer Id / Device Id. Beispiel:
my-device-external-id - parser_variable: Parser-Variable. Beispiel:
_parsed - twin_key_value: Benutzerdefinierte Eigenschaften des Virtuellen Gerätes / Digitalen Zwillings. Beispiel:
{"key": "value", "custom": "info", "additional": "properties"}
- timestamp: Zeitstempel, zu dem die Veränderung registriert wurde. Beispiel:
-
value: Enthält Wert des Datenpunktes.
Alarmlog was created/resolved Objekt
Im ALARMLOG WAS CREATED/RESOLVED - Objekt stehen die folgenden Informationen zur Verfügung:
{
"meta": {
"account_id": 1239,
"account_name": "Dokumentation",
"timestamp": "2024-07-12T11:09:11.152Z"
},
"value": {
"alarm_log_id": 7674,
"alarm_log_parent_id": null,
"alarm_origin_type": "virtual-device",
"alarm_message": "Battery below 3000 mV",
"alarm_origin": {
"id": 63770,
"title": "my-device",
"tags": [],
"groups": [],
"link": "https://niotix.io/#/virtual-devices/63770"
},
"alarm_level": "error",
"log_category": "battery",
"is_resolved": false
}
}
- meta: Enthält die Meta-Informationen zu dem erzeugten Alarmprotokoll-Eintrag.
- account_id: Account für den der Alarmprotokoll-Eintrag erzeugt wurde.
- account_name: Name des Accounts für den der Alarmprotkoll-Eintrag erzeugt wurden.
- timestamp: Zeitstempel zu dem der Alarmprotkoll-Eintrag erzeugt wurde.
- value: Enthält die Informationen zu den Parametern des Alarmprotkoll-Eintrags.
- alarm_log_id: Id des Alarmprotkoll-Eintrags.
- alarm_log_parent_id: Wird ein Alarmprotkoll-Eintrag resolved, wird die Id des ursächlichen Alarmprotkoll-Eintrags hier ausgegeben.
- alarm_origin_type:
virtual-device, wenn die Quelle des Alarmprotkoll-Eintrags ein Virtuelles Gerät ist.smart-group, wenn die Quelle des Eintrags eine Smarte Gruppe ist. - alarm_message: Inhalt der konfigurierten Fehler-/Warnmeldung.
- alarm_origin: Enthält Detailinformationen zur Quell-Entität des Alarmprotokoll-Eintrags.
- id: Id des Virtuellen Gerätes oder der Smarten Gruppe.
- title: Titel des Virtuellen Gerätes oder der Smarten Gruppe.
- tags: Tags stehen nur für Virtuelle Geräte zur Verfügung.
- groups: Gruppen stehen nur für Virtuelle Geräte zur Verfügung.
- link: Link über den das Virtuelle Gerät oder die Smarte Gruppe geöffnet werden kann.
- address: Adresse steht nur für Virtuelle Geräte zur Verfügung.
- alarm_level:
error= Level „Fehler” in der Konfiguration;warning= Level „Warnung” in der Konfiguration. - log_category:
null, wenn die Kategorie nicht gesetzt ist. Sonst eins vonconnectivity,battery,deviceoderpacket-threshold - is_resolved:
false, wenn es sich um einen ungelösten Alarmprotokoll-Eintrag handelt.true, wenn der Eintrag gelöst wurde.
Tipps zur Konnektorkonfiguration im Integrationsflow
Empfohlene Reihenfolge beim Einrichten eines Integrationsflows:
1. Ausgehenden Konnektor anlegen.
2. Bei Bedarf Filter und Transformationen vorbereiten.
3. Integrationsflow anlegen: Auslöser wählen, Filter und Transformation zuweisen, ausgehenden Konnektor als Ziel festlegen.
4. Ergebnis über die Konnektor Logs des ausgehenden Konnektors verifizieren.
Dynamische URLs und Topics: Beim Konnektor Webhook (Outgoing) und MQTT (Outgoing) lassen sich Metadaten als Platzhalter in URL bzw. Topic einsetzen, z. B. https://mein-system.de/devices/{{dtwin_id}}/data/ oder niotix/{{account_id}}/{{dtwin_id}}/state. Eine vollständige Liste der verfügbaren Metawerte findet sich in der Schnellreferenz im Bereich Transformationen.
Kafka-Payload-Format: Der Kafka (Outgoing)-Konnektor erwartet den Payload als Key-Value-Array: [{"key": "mein_schluessel", "value": "mein_wert"}]. Vor dem Kafka-Schritt muss eine Transformation mit Eingabe-Typ generic und passendem Ausgabeformat eingefügt werden.
Übersicht der für Integrationsflows verfügbaren Konnektoren
Es können folgende ausgehende Konnektoren für Integrationsflows verwendet werden: