und wieder REGEX

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
HABuserJM
Beiträge: 102
Registriert: 18. Apr 2021 11:30
Answers: 0
Wohnort: Berlin

und wieder REGEX

Beitrag von HABuserJM »

Hallo,

ich habe leider das Systen von REGEX noch nicht so richtig verstanden, deshalb hier mein Problem:

Ich habe eine Sonoff Zigbee-Bridge mit Tasmota, über welche ich die Daten der verbundenen Sensoren auswerte. Da leider alle Daten über denselben Topic "tele/zb_bridge/SENSOR" kommen, muss ich die Sensoren über die Incoming Value Transformations unterscheiden, was bisher bei den definierten Channel über REGEX z.B. nach dieser Regel funktioniert:

Code: Alles auswählen

REGEX:(.*0xE579.*Power.*)∩JSONPATH:$.ZbReceived.0xE579.Power
Nun habe ich Zigbee 4-fach Schalter, die mir im JSON-String sowohl die gedrückte Taste, als auch den Wert übermitteln:

Code: Alles auswählen

{
	"ZbReceived":{
		"0xC498":{
			"Device":"0xC498",
			"Name":" 4switch01",
			"0006!FD":"00",
			"LidlPower":0,
			"Endpoint":1,
			"LinkQuality":53
		}
	}
}
Endpoint ist die Tastennummer (1-4) und LidlPower der Wert (0= Klick; 1= Doppelklick). Ich will also über Endpoint den Channel selektieren und LidlPower auswerten, nur wie sage ich REGEX, dass es nicht nur .*Endpoint.* durchlässt, sondern auch den Wert von Endpoint?

HABuserJM
Beiträge: 102
Registriert: 18. Apr 2021 11:30
Answers: 0
Wohnort: Berlin

Re: und wieder REGEX

Beitrag von HABuserJM »

glaub ich habs genau nach dieser Frage dann selbst hinbekommen:

Code: Alles auswählen

REGEX:(.*0xC498.*Endpoint":1.*)∩JSONPATH:$.ZbReceived.0xC498.LidlPower

Benutzeravatar
udo1toni
Beiträge: 15248
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: und wieder REGEX

Beitrag von udo1toni »

Da besteht ein Missverständnis.
Gewöhnlich reicht JSONPATH, um das einzelne Datum innerhalb des JSON Objekts zu selektieren, also z.B.

Code: Alles auswählen

JSONPATH:$.ZbReceived.0xC498.LidlPower
für den Wert 0 im oben geposteten Payload oder auch

Code: Alles auswählen

JSONPATH:$.ZbReceived.0xC498.Name
für den Wert 4switch01
Das Problem beginnt in der Situation, wenn im selben Topic (hier also tele/zb_bridge/SENSOR) auch Payloads vorkommen, die anders aufgebaut sind bzw. eventuell auch nur die abgefragten Paths nicht beinhalten, also z.B. ein anderes Device als 0xC498. Wenn ein solches Payload übertragen wird, gibt es in openHAB eine Fehlermeldung, weil der Pfad nicht ausgeführt werden kann.
Um diesen Fehler zu unterdrücken, wird REGEX vorangestellt. Es stellt also sicher, dass nur passende JSON Objekte überhaupt an JSONPATH weitergereicht werden. Ansonsten matcht REGEX nicht und gibt einen leeren String weiter, und JSONPATH erkennt, dass es kein JSON Objekt zum Parsen gibt.
Schau Dir in einem Mitschnitt den Verlauf der Payload des Topics an. Es könnte z.B. gut sein, dass es ausreicht, die Device ID anzugeben, also so:

Code: Alles auswählen

REGEX:(.*0xC498.*)
Dabei bedeutet diese RegularExpression: nimm eine beliebige Anzahl beliebiger Zeichen, denen die Zeichenfolge 0xC498 folgt und der eine weitere beliebig lange Folge beliebiger Zeichen folgt und gib diese weiter.

Der . ist dabei das Symbol für ein beliebiges Zeichen (und das meint tatsächlich beliebig).
Der * bedeutet "beliebig viele Wiederholungen des vorhergehenden Zeichens", incl. keinmal. Wenn das Zeichen mindesten einmal vorkommen muss, schreibt man stattdessen ein + hin.
Die Klammern () bedeuten, dass dieser Teil weitergegeben wird. Im "richtigen" ;) REGEX kann man beliebig viele geklammerte Teile definieren und diese werden dann als Teil 1 - n definiert, so dass man in einem Antwortstring z.B. auch Teile eines Strings ersetzen, umstellen, oder mehrfach verwenden kann. In openHAB geht das nicht, es gibt nur einen (Teil-) String, der zurückgegeben werden kann; dieser kann nicht durch REGEX weitergehend manipuliert werden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten