Seite 1 von 1

Daten vom Stromzaehler mit Serial Binding

Verfasst: 17. Mär 2022 16:55
von thmssprin
Ich bin neu hier und habe noch nicht so viel Ahnung. Ich habe Openhab 3 und versuche über das Serial Binding Daten von meinem Stromzähler auszulesen. Ich bekomme auch jede Menge Daten angezeigt. Diese werden einmal pro Sekunde aktualisiert. Diese Daten bekomme ich nur komplett und zusammenhängend. Wie kann ich diese Daten einzeln erfassen?
Ich möchte zum Beispiel den Wert von Position "1-0:56.7.0*255" als Zahl "121.07" weiterverarbeiten.
Das ganze soll auch mit negativen Zahlen funktionieren. "1-0:76.7.0*255" Zahl "-9.94".

Leider komme ich hier nicht weiter.

Vielen Dank
Thomas


2022-03-17 14:35:40.001 [INFO ] [openhab.event.ChannelTriggeredEvent ] - serial:serialBridge:64c3a4da0c:data triggered PRESSED

1-0:0.0.0*255(1EBZ0100000000)
1-0:96.1.0*255(1EBZ0100000000)
1-0:1.8.0*255(000115.63274193*kWh)
1-0:2.8.0*255(000017.80069989*kWh)
1-0:16.7.0*255(000319.98*W)
1-0:36.7.0*255(000208.85*W)
1-0:56.7.0*255(000121.07*W)
1-0:76.7.0*255(-000009.94*W)
1-0:32.7.0*255(233.7*V)
1-0:52.7.0*255(233.3*V)
1-0:72.7.0*255(234.1*V)
1-0:96.5.0*255(001C4104)
0-0:96.8.0*255(001FA4D0)
!

Re: Daten vom Stromzaehler mit Serial Binding

Verfasst: 17. Mär 2022 21:55
von udo1toni
Herzlich willkommen im Forum!

Am einfachsten machst Du das mit dem REGEX Transformation Service, zu finden in den Addons (über die Lupe nach REGEX suchen oder in der Rubrik Other Addons bis auf Transformation Addons runter scrollen und dort direkt auswählen).

Der Channel, auf dem die Daten ankommen, müsste vom Typ String sein. Da Du an mehreren Werten interessiert bist, verlinkst Du diesen Channel mit mehreren Items vom Typ Number (und zum Testen noch einen String Channel, den wir später wieder löschen können). Beim Linken kannst Du ein Link Profile setzen, dort wählst Du regex aus und setzt ein passendes Statement, um nur die Zahl zu matchen.
Z.B. für die -9,94 sähe der Ausdruck vermutlich so aus: .*:76.7.0\*255\((.*)\*W\).*
falls Du Dich nicht mir REGEX auskennst: der . steht für ein beliebiges Zeichen. Der * steht für beliebig viele Wiederholungen des vorherigen Zeichens. Der Backslash \ escaped die Steuerzeichen, \( steht also für eine öffnende Klammer im zu zerlegenden String. () markiert den Teil des Textes, der übernommen werden soll, falls der Ausdruck matcht, Das Beispiel lautet also : Beginne am Anfang des übergebenen Strings (ein Datenpaket) und suche nach der Zeichenfolge <:76.7.0*255(> (ohne die spitzen Klammern) Ab da übernimm alle Zeichen, bis Du die Zeichenfolge *W) findest. In der Folge sollte das verlinkte Item die Zeichenfolge <-000009.94> übergeben bekommen (im String Item). Ein Number Item verarbeitet die übergebene Zeichenfolge automatisch als Dezimalzahl, wobei der . der Dezimaltrenner ist. Das Number Item wird alle führenden Nullen ignorieren und als Wert -9,94 anzeigen.

Für die anderen Werte setzt Du dann jeweils passend andere REGEX Ausdrücke.

Re: Daten vom Stromzaehler mit Serial Binding

Verfasst: 17. Mär 2022 21:59
von thmssprin
Vielen Dank für die schnelle Hilfe.

Re: Daten vom Stromzaehler mit Serial Binding

Verfasst: 17. Mär 2022 23:18
von udo1toni
Immer gerne! Klappt es denn?

Re: Daten vom Stromzaehler mit Serial Binding

Verfasst: 18. Mär 2022 11:17
von thmssprin
Ich verstehe den Befehl Regex noch nicht. Da muss ich noch etwas lernen und probieren.

Ihr Beispiel habe ich übernommen.
.*:76.7.0\*255\((.*)\*W\).*

Als Ergebnis habe ich die Zahl -9.94 erhalten. So ein Wert wollte ich haben. Es funktioniert.
Für die anderen Werte wollte ich es auch so machen. Dazu habe ich den Ausdruck etwas abgeändert.

.*:56.7.0\*255\((.*)\*W\).*
.*:32.7.0\*255\((.*)\*V\).*
.*:1.8.0\*255\((.*)\*kWh\).*

Da funktioniert es nicht mehr. Ich bekomme dort einen rein zufälligen Zahlenwert der sich nicht mehr ändert.
Trotzdem nochmal vielen Dank. Ich werde mich mit der Sache noch weiter beschäftigen.

Thomas

Re: Daten vom Stromzaehler mit Serial Binding

Verfasst: 18. Mär 2022 21:34
von udo1toni
Ja, REGEX kann etwas tricky sein. Gewöhnlich sollte REGEX immer auf den kürzestmöglichen Ausdruck matchen, es sei denn, man erzwingt ein anderes Verhalten. Bei openHAB REGEX habe ich aber auch verschiedentlich beobachtet, dass das nicht der Fall ist. 76.7.0 ist der letzte Wert in der Liste, dessen Ende mit *W gekennzeichnet ist, weshalb REGEX da gar nicht anders kann, als korrekt zu matchen.

Eine weitere Option:

Code: Alles auswählen

.*1\.8\.0.255.(\d*\.\d*).*
eine beliebige Zeichenfolge, gefolgt von 1.8.0, gefolgt von einem beliebigen Zeichen, gefolgt von 255, gefolgt von einem beliebigen Zeichen (das ist im Input die öffnende Klammer), gefolgt von einer beliebigen Anzahl Ziffern (das ist das \d* im REGEX), gefolgt von einem Punkt, gefolgt von einer beliebigen Anzahl Ziffern.
Falls damit Ziffern hinter dem Komma abgeschnitten werden, müsste man noch explizit nach dem * nach der letzten Ziffer suchen. Letztlich muss der REGEX Ausdruck so gestaltet sein, dass er eindeutig und möglichst zwingend auf exakt den gesuchten Bereich matcht.

Re: Daten vom Stromzaehler mit Serial Binding

Verfasst: 19. Mär 2022 09:10
von thmssprin
Jetzt funktioniert alles. Alleine wäre ich da nie draufgekommen. Vielen Dank.