Seite 1 von 1

OH3 HTTP Binding plain Text auslesen

Verfasst: 21. Mär 2021 20:13
von ixylon
Moin,
frisch angemeldet und schon eine Frage.
Bin, nachdem ich mir mit einem unbedachten Befehl die Rechte bei meiner IOBroker-Installation zerschossen habe, jetzt zu OpenHab 3 gewechselt.
Soweit funktioniert alles recht gut. Nun möchte ich gern die Solarwerte von der HANSOL-Anlage auslesen. Die stellt eine simple Webseite zur Verfügung(Gerät hat eig. Webserver).
Unter iObroker habe ich es irgendwie geschafft, die Daten auszulesen.

Nur hier verzweifel ich langsam. HTTP Binding ist installiert, aber ich weiß nicht so richtig was ich angeben muss, um an die Daten zu kommen. Die Daten verstecken sich im Quelltext beispielsweise so:

Code: Alles auswählen

<tr><td>GRID_P(30s)</td><td>720</td><td>LOAD_P(30s)</td><td>720</td></tr>
Die 720 ist der Wert von GRID_P(30s), den ich brauche.

Habt ihr einen Ansatz, wie ich da rangehen muss?
Gruß
Jens

Re: OH3 HTTP Binding plain Text auslesen

Verfasst: 21. Mär 2021 22:35
von udo1toni
REGEX ist das Zauberwort. Du musst also zusätzlich das Regex Transformation Service Addon installieren.
Dann gibst Du beim Channel an, dass die ankommenden Daten durch die Transformation

Code: Alles auswählen

REGEX:(.*GRID_P(30s)</td><td>([0-9\.]*).*)
bearbeitet werden sollen.

Re: OH3 HTTP Binding plain Text auslesen

Verfasst: 22. Mär 2021 00:32
von ixylon
Der Tip mit dem Addon war schon prima. Das hatte ich schon mal übersehen.
Aber irgendwie will das noch nicht so. Das Thing ist ja schon mal grün, aber es kommt kein Wert.

Ich muss mir das noch mal in Ruhe ansehen, ist jetzt auch schon zu spät.
Aber Danke erst mal.

Re: OH3 HTTP Binding plain Text auslesen

Verfasst: 22. Mär 2021 17:50
von udo1toni
Ja, REGEX Ausdrücke mögen immer ausprobiert werden, da ist eigentlich immer irgendwas nicht ganz korrekt dran...

Re: OH3 HTTP Binding plain Text auslesen

Verfasst: 22. Mär 2021 23:32
von ixylon
Ich komme irgendwie nicht weiter. Mache ich das überhaupt richtig?
1. Thing erstellen mit http-Binding mit der URL und GET und Text/HTML
2. im Thing einen Channel erstellen (String?) und bei state Transformation den Regexbefehl rein: REGEX:(.*GRID_P(30s)</td><td>([0-9\.]*).*)

Aber ich sehe nirgends Daten?
Der Channel gibt ein NULL aus.
Hab ich da einen Denkfehler?

Re: OH3 HTTP Binding plain Text auslesen

Verfasst: 23. Mär 2021 06:22
von udo1toni
Oh. Ich sehe gerade, da sind im Regex Klammern enthalten... (30s) Du musst diese Klammern escapen, mit einem Backslash...

Code: Alles auswählen

REGEX:(.*GRID_P\(30s\)</td><td>([0-9\.]*).*)
Grundsätzlich bietet es sich an, zunächst den Channel ohne Transformation als String Channel anzulegen, dann kann man sehen, dass Daten rein kommen. Anschließend baut man die transformation ein, bis sie korrekt funktioniert. Wenn sichergestellt ist, dass immer ausschließlich Zahlen als Status heraus kommen, kann man dann noch den Channel Typ auf Number ändern.

Re: OH3 HTTP Binding plain Text auslesen

Verfasst: 23. Mär 2021 22:25
von ixylon
So jetzt holt sich der Channel die komplette Webseite ohne sie zu filtern.
Ich verstehe nicht, warum...

Re: OH3 HTTP Binding plain Text auslesen

Verfasst: 24. Mär 2021 11:02
von udo1toni
Dann passt der Filterausdruck nicht. REGEX liefert den vollen String aus, wenn das Muster nicht matcht (das ist eine Besonderheit in openHAB)

Re: OH3 HTTP Binding plain Text auslesen

Verfasst: 24. Mär 2021 20:38
von ixylon
Das war eine schwere Geburt. Nachdem ich einen Channel geschafft hatte, wollte ich natürlich für die anderen Daten auch Channels anlegen. Und da kamen einfach keine Werte. Nur durch Zufall hab ich dann rausbekommen, dass man erst Werte bekommt, wenn man die Channels an ein Modell gekoppelt hat...böse Falle. ;)

Der REGEX-Ausdruck hat dann letztendlich funktioniert:

Code: Alles auswählen

REGEX:.*GRID_P\(30s\)</td><td>(.*?)<.*
Läuft erst einmal als String, muss ich noch mal genau gucken, wie ich das mit Number mache, da dort auch Minuszeichen kommen können.
Aber erst einmal vielen Dank für Deine Hilfe!

Re: OH3 HTTP Binding plain Text auslesen

Verfasst: 24. Mär 2021 22:07
von udo1toni
Wobei .*? ja für eine beliebige Menge beliebiger Zeichen steht. REGEX matcht auf die kürzestmögliche Zeichensequenz, es nimmt also alle Zeichen zwischen > und <, inklusive einem eventuellen Minuszeichen.