Um aus Datenstrukturen wie JSON einzelne Werte - für die Nutzung im Objektsystem - extrahieren zu können, nutzen Sie bitte das Leistungsmerkmal “Selektor”.
Der Selektor ist eine Zeichenkette, den Sie im entsprechenden Feld des Eingabeassistenten angeben.
Dieser Selektor dient dazu, einen spezifischen Wert, der in einem verschachtelten JSON enthalten ist, entsprechend der Position in der Datenstruktur zu selektieren (= adressieren), damit der Timberwolf Server diesen Wert mit einem einzelnen Objekt verknüpfen kann.
Dies kann mehrmals angelegt werden. Auf diese Weise können die Positionen mehrerer spezifischen Werte in einer JSON Dateistruktur definiert und verknüpft werden.
Bitte beachten Sie, dass Selektoren sowohl in eingehender als auch ausgehender Richtung (von / zum externen Gerät) genutzt werden können.
Das bedeutet bei ausgehender Richtung, dass aus den Objektverknüpfungen und den angegebenen Selektoren eine JSON-Dateistruktur erzeugt wird, die an das entfernte Gerät gesandt wird. Beachten Sie hierzu die entsprechenden Einstellungen für den Trigger (mit gemeinsamen Trigger wird immer die ganze Datenstruktur als JSON erzeugt und zusammen gesendet)
JSON Arrays als Startelemente bei der Abfrage
Bis Softwareversion 4.0 Insider 5 werden nur Objekte als Startelemente unterstützt. Ab dieser Version kann ein Selektor auch mit [ beginnen. Die eckigen Klammern können eine Zahl für den Array Index oder einen Filter (siehe unten) enthalten.
Senden von JSON Arrays
Bis Softwareversion 4.0 Insider 5 können Selektoren die ein Array erzeugen nicht zum Erzeugen eines JSON beim Senden von Daten genutzt werden.
Übersicht
Einfacher Selektor
In diesem Beispiel befinden sich alle Werte auf einer Ebene und das JSON besteht nur aus einem Objekt, welches durch { } gekennzeichnet ist.
{ "ison": false, "mode": "white", "brightness": 6 }
BEISPIEL Möchte man auf den Helligkeitswert, der im JSON mit dem Schlüssel brightness definiert ist, zugreifen muss lediglich brightness
im Feld Selektor eingetragen werden.
NEU (IP4 V4) Beinhaltet der Schlüssel andere Zeichen als Buchstaben, Zahlen, Unterstrich und Minus-Zeichen (z.B. einen Doppelpunkt), dann muss der Schlüssel in Anführungszeichen in das Feld Selektor eingetragen werden. Beispiel: "test: 3"
Selektor bei verschachtelten Datenstrukturen
Hier soll beispielhaft auf das erste Ereignis zugriffen werden.
{ "src": "shellyplusht-c049ef8ad9c8", "dst": "shellyplusht-c049ef8ad9c8/events", "method": "NotifyEvent", "params": { "ts": 1677071174.05, "events": [ { "component": "sys", "event": "sleep", "ts": 1677071174.05 } ] } }
BEISPIEL In params befindet sich das Objekt events. Mit dem Selektor params.events
kann dieses Objekt angesprochen werden. Zwischen den [ ] wird eine Liste von Werten oder Objekten im JSON eingeschlossen. Mit params.events[0]
wird das erste Element in dieser Array-Liste gewählt. Ergänzt mit event ergibt sich mit params.events[0].event
im Beispiel die Zeichenkette sleep.
Weitergeben an ein Objekt kann dieser Wert im Timberwolf Server beliebig weiterverarbeitet werden, beispielsweise durch eine Logik ausgewertet.
Selektor um ein Array aus einer Auflistung anhand eines Wertes auszuwählen
Im vorigen Beispiel haben wir gesehen, wie ein Element aus einer Array-Liste über den Index (Zahl entsprechend der Position in der Auflistung, mit 0 beginnend) ausgewählt werden kann. Manchmal ist die Position einer Struktur nicht fest und kann sich verändern.
BEISPIEL In diesem JSON hat sich ein Event vom Typ input vor das sys Event gedrängt, welches wir auswerten wollen.
{ "src": "shellyplusht-c049ef8ad9c8", "dst": "shellyplusht-c049ef8ad9c8/events", "method": "NotifyEvent", "params": { "ts": 1677071174.05, "events": [ { "component": "input:0", "id": 0, "event": "single_push", "ts": 1631266595.44 }, { "component": "sys", "event": "sleep", "ts": 1677071174.05 } ] } }
Im Selektor ist hierfür nun die Filter-Schreibweise params.events[component="sys"].event
einzutragen, um damit dasjenige Element aus der Auflistung events auswählen, welches im Schlüssel component einen bestimmten Wert (hier “sys”) gesetzt hat, um dort dann den Wert “sleep” zum Schlüssel “event” zu selektieren.
Senden von Daten in einer JSON-Datenstuktur
Über dem Timberwolf Server erfasste oder beispielsweise durch eine Logik weiterverarbeitete Daten können als ein JSON, welches mehrere Werte gleichzeitig beinhalten kann, an ein anderes Gerät gesendet werden. Empfänger können etwa Aktoren, andere SmartHome-Produkte oder Cloud-Dienste sein.
In diesem Beispiel möchten wir ein JSON erzeugen, welches die aktuelle Leistungsaufnahme darstellt. Das Empfängersystem erwartet ein Objekt welches einen Schlüssel consumption
enthält. In consumption
befinden sich der Schlüssel total
welcher auf eine Zahl verweist. Unter phases
befindet sich ein Array in dem jeder Eintrag den Verbrauch pro Außenleister darstellt.
{ "consumption": { "total": 343, "phases": [ 38.57, 290.38, 14.29 ] } }
Es werden vier Werte benötigt, dazu wurde jeweils eine publizierende Transaktion angelegt. Die Gesamtheit der Transaktionen erzeugt, abhängig von den Trigger-Einstellungen, eine zusammengehörige JSON-Datenstruktur. Um ein komplettes JSON zu senden, wurde im Beispiel der Trigger nur für die Transaktion Verbrauch gesamt aktiviert und dort festgelegt dass eine Wertänderung alle Transaktionen (Applikationen) dieses Topics aussendet.
Durch die Selektoren consumption.phases[0 ... 2]
wird definiert, dass phases eine Array darstellt und an welchen Index der zugehörige Werte eingesetzt werden soll.
Wird ein Array Index im Selektor angegeben, bei dem für einen oder mehrere vorherige Indexe kein Wert vorhanden ist, wird für diese leeren Index-Positionen der Wert NULL eingefügt. Ein fehlender Wert und damit das automatische Einfügen von NULL-Werten aus drei verschiedenen Gründen auftreten:
Es ist keine publizierende Transaktion angelegt, welche den offenen Index befüllen würde
Seit dem Start des Subsystems oder dem erstmaligen Anlegen der Transaktion wurde noch kein Wert aus dem Objektsystem gesendet, welcher durch die publizierende Transaktion ausgesendet werden soll, und eine andere Transaktion hat das aussenden aller Transaktionen des Topics angefordert.
Der Trigger der betroffenen Transaktion wurde beschränkt nur auf das Senden für dieses Objektwertes, damit werden alle anderen Element des JSON ausgelassen.
Kommentar hinzufügen