http reading und regex

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
oExplorer
Beiträge: 12
Registriert: 14. Mai 2023 22:24

http reading und regex

Beitrag von oExplorer »

Hallo,

ich versuche ein http reading von fhem nach openHAB 3 zu überführen.

Es ruft eine Webseite auf, aus der ich die zweistellige Temperatur extrahieren möchte.

Dazu habe ich http Binding und REGEX installiert, ein Thing angelegt, den Channel zugefügt und einen Link kreiert:

Code: Alles auswählen

label: HTTP Temp Warmwasser
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://myip:8000/temperature.html
  delay: 0
  stateMethod: GET
  refresh: 30
  commandMethod: GET
  contentType: text/html
  timeout: 3000
  bufferSize: 2048
channels:
  - id: Temp_Warmwasser
    channelTypeUID: http:string
    label: Temp Warmwasser
    description: ""
    configuration:
      mode: READONLY
      stateTransformation: REGEX(?s)body>.*?(\d+)
Mein Problem ist nun, dass das REGEX irgendwie nicht funktioniert, ich erhalte den gesamten Code der Webseite. Bestimmt habe ich in der REGEX Angabe einen Syntaxfehler...?
Das ist die Ausgabe:

Code: Alles auswählen

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Home-Tech local</title> </head> <body> 61 </body> </html>
Ich möchte nur die Zahl zwischen <body>
Das Regex funktioniert in fhem so, wie ich es hier angegeben habe

Code: Alles auswählen

(?s)body>.*?(\d+)
Aber möglicherweise muss das bei
stateTransformation:
irgendwie anders definiert werden?
Kann mir jemand einen Tipp geben?
Im log finde ich keine Fehlermeldung..

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

Re: http reading und regex

Beitrag von udo1toni »

Ja, Dein REGEX Ausdruck ist falsch :) Das liegt allerdings vor allem daran, dass REGEX in openHAB nicht so funktioniert wie ein "normales" REGEX.

Dein gesuchter Ausdruck lautet in openHAB:

Code: Alles auswählen

REGEX:.*<body> (\d+) <.*<body> 
.* -->> eine beliebige Zeichenfolge
<body>_ -->> (Unterstrich nur hier statt Leerzeichen, da sonst nicht sichtbar) gefolgt von der exakten Zeichenfolge
() -->> alles, was innerhalb der Klammern matcht, wird als Wert zurückgeliefert.
\d+ -->> eine bis beliebig viele Ziffern. Es handelt sich also um eine Ganzzahl.

Sollte ein Punkt vorkommen, müsste man es so schreiben: \d+\.?\d* also eine oder mehrere Ziffern, eventuell gefolgt von einem Punkt, gefolgt von einer beliebigen Anzahl Ziffern.
openHAB erwartet einen Punkt als Dezimaltrenner, falls eine Dezimalzahl mit Komma geschrieben ist, muss man das gesondert behandeln.

_<.* -->> (Unterstrich siehe oben) gefolgt von der exakten Zeichenfolge Leerzeichen und kleiner als, gefolgt von einer beliebigen Menge beliebiger Zeichen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

oExplorer
Beiträge: 12
Registriert: 14. Mai 2023 22:24

Re: http reading und regex

Beitrag von oExplorer »

udo1toni hat geschrieben: 3. Jun 2023 13:38 Ja, Dein REGEX Ausdruck ist falsch :) Das liegt allerdings vor allem daran, dass REGEX in openHAB nicht so funktioniert wie ein "normales" REGEX.

Dein gesuchter Ausdruck lautet in openHAB:

Code: Alles auswählen

REGEX:.*<body> (\d+) <.*<body> 
Danke für die Hile!
Ich hab das via Codefenster darauf geändert (das schließende body musste noch geändert werden):

Code: Alles auswählen

channels:
  - id: Temp_Warmwasser
    channelTypeUID: http:string
    label: Temp Warmwasser
    description: ""
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*<body> (\d+) <.*</body>
      
Nach dem Speichern ändert sich aber nichts, es wird weiter die gesamte website geliefert....

Wenn ich auf der Link-Ansicht bin, habe ich unten die Mögichkeit REGEX zu aktivieren. Siehe pict:
Bildschirmfoto vom 2023-06-03 15-32-08.png
Aber das scheint wieder etwas anders zu sein? Denn wenn ich dies aktiviere wird ein regex-Ausdruck verlangt. Wofür würde der gelten?

Aber wo, wie kann ich selbst prüfen, warum das regex in "stateTransformation" vermutlich nicht funktioniert?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: http reading und regex

Beitrag von udo1toni »

Nein, da ist nichts abzuändern. Der Punkt ist, dass eine beliebige Zeichenfolge, gefolgt von der Zeichenfolge <body>_, gefolgt vom gesuchten Wert, gefolgt von der Zeichenfolge _<, gefolgt von einer beliebigen Zeichenfolge angeliefert wird. So musst Du matchen.

Code: Alles auswählen

REGEX:.*<body> (\d+) <.*
ist der korrekte Ausdruck,

Code: Alles auswählen

REGEX:.*<body> (\d+) <.*</body>
ist falsch.
Du kannst gerne den Ausdruck in

Code: Alles auswählen

REGEX:.*<body> (\d+) </body>.*
ändern, aber am Ende muss .* stehen, (und auch am Anfang)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

oExplorer
Beiträge: 12
Registriert: 14. Mai 2023 22:24

Re: http reading und regex

Beitrag von oExplorer »

udo1toni hat geschrieben: 3. Jun 2023 18:10 Nein, da ist nichts abzuändern. Der Punkt ist, dass eine beliebige Zeichenfolge, gefolgt von der Zeichenfolge <body>_, gefolgt vom gesuchten Wert, gefolgt von der Zeichenfolge _<, gefolgt von einer beliebigen Zeichenfolge angeliefert wird. So musst Du matchen.

Code: Alles auswählen

REGEX:.*<body> (\d+) <.*
ist der korrekte Ausdruck,

Code: Alles auswählen

REGEX:.*<body> (\d+) <.*</body>
ist falsch.
Du kannst gerne den Ausdruck in

Code: Alles auswählen

REGEX:.*<body> (\d+) </body>.*
ändern, aber am Ende muss .* stehen, (und auch am Anfang)
Aachso, und nach dem
REGEX:
darf kein Leerzeichen sein...und die Leerzeichen sind wohl in meinem Beispiel hier in Wahrheit Zeilenumbrüche...

Damit beḱomme ich jetzt die gewünschte Zahl:

Code: Alles auswählen

REGEX:.*?<body>(.*?)<\/body>.*
Werde ich damit ein Chart befüllen können, oder muss ich das irgendwie in einem numerischen Typ umwandeln?

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

Re: http reading und regex

Beitrag von udo1toni »

Ja, das ist ungünstig, wenn der gezeigte String nicht der Realität entspricht :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten