HTTP Umstellung V1 => V3

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

wosch
Beiträge: 53
Registriert: 30. Dez 2020 08:36
Answers: 0

Re: HTTP Umstellung V1 => V3

Beitrag von wosch »

Hallo Udo,

jetzt ist es schon echt lange her, ich wollte Dir trotzdem noch Danke sagen! :)

Ich hätte aber gleich mal noch eine Frage, zu der ich zwar grundsätzlich so einiges googlen konnte, aber leider hab ich sowas von null Plan, dass ich gar nicht weiß wie ich anfangen soll :D

Ich lese schon seit ein paar Jahren die Daten meiner Wärmepumpe über iMacros in Firefox aus. Die werden in eine CSV geschrieben und dann mit Excel ausgewertet. Ich habe mir schon seit langem vorgenommen, das Ganze endlich über OH zu tun. Das reine logging is dabei gar nicht das Thema, aber es fehlt halt die Verknüpfung von zB der Lüftung zur Anwesenheit oder der Luftqualität.

Mein eigentliches Problem (vermutlich wird es nicht mein einziges sein...): ich bekomme die Extraktion der Daten nicht hin. Ich weiß nicht mal ob ich XPath oder Regex verwenden muss / kann. Ich habe beides über diverse Online Tester und mit Hilfe der darin gezeigten Code-Beispiele versucht für den Code meiner Seite hinzubekommen, aber meistens kam gar nichts dabei raus und ich habe dann entnervt aufgegeben...

Das Thing kann ich aufbauen wie oben beschrieben, das sollte dank der super Anleitung kein Thema sein. Das ist auch bedeutend einfacher mit http3 wie ich finde. Der Quelltext der Seite sieht so aus (Auszug für mal für zwei Werte):

Code: Alles auswählen

 </tr>
  <tr class="odd">
    <td class="key">ISTWERT HK1</td>
    <td class="value">23,3 °C</td>
  </tr>
  <tr class="even">
    <td class="key">SOLLWERT HK1</td>
    <td class="value">24,0 °C</td>
  </tr>
Was mir Schwierigkeiten bereitet ist, dass die Werte - in dem Fall die 23,3 und die 24,0 - nicht unmittelbar nach dem Keyword - in dem Fall ISTWERT HK1 und SOLLWERT HK1 kommen.

Evtl. kann mir jemand eine kleinen Anstoss geben, mit dem ich dann die anderen Werte selbst hinbekomme? Ich wäre sehr dankbar :)

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

Re: HTTP Umstellung V1 => V3

Beitrag von udo1toni »

XPath ist ausschließlich für XML-Dateien gut. Gewöhnlich wird REGEX das Mittel der Wahl sein. Vermutlich wird der Wert ungefähr so aussehen:

Code: Alles auswählen

REGEX(.*ISTWERT HK1</td>.. *<td class=.value.>(.*) °C.*)
Der wichtigste Teil ist, Anführungszeichen zu escapen oder alternativ urch ein beliebiges Zeichen (.) zu ersetzen. weiterhin könnte es Probleme mit dem Zeilenumbruch geben.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

wosch
Beiträge: 53
Registriert: 30. Dez 2020 08:36
Answers: 0

Re: HTTP Umstellung V1 => V3

Beitrag von wosch »

Vielen Dank @udo1toni - in RegExr komme ich mit einer kleinen Änderung Deines Codes auf die 23,3:

Code: Alles auswählen

REGEX(.*ISTWERT HK1</td>\s. *<td class=.value.>(.*) °C.*)
Der Zeilenumbruch klappt tatsächlich nicht mit dem dot, allerdings wird der einfach mit dem [\s] gematched. So weit so gut.
Allerdings sieht mein Item in OH3 folgendermaßen aus:

Code: Alles auswählen

26,8 °C</td> </tr> <tr class="even"> <td class="key">SOLLWERT HK1</td> <td class="value">24,3 °C</td> </tr> <tr class="odd"> <td class="key">ISTWERT HK2</td> <td class="value">26,7 °C</td> </tr> <tr class="even"> <td class="key">SOLLWERT HK2</td> <td class="value">24,3 °C</td> </tr> <tr class="odd">
[...]
Die 26,8 gleich am Anfang ist die aktuelle Temperatur, die ich extrahieren will - also die 23,3 in obigem Code. Alles was danach kommt sollte eigentlich nicht dabei sein logischerweise :D
Ich kenne mich mit Regex wie gesagt überhaupt nicht aus, daher bekomme ich es nicht hin, noch dazu weil der Code in RegExr ja funktioniert. Nach meinem Verständnis wird durch (.*) alles gecaptured was zwischen dem "ISTWERT HK1 [...]" und dem "°C" steht, oder? Das sollte doch dann eigentlich passen?! :?:

Hier noch der Code in OH3:

Code: Alles auswählen

UID: http:url:LWZAnlage
label: HTTP LWZ Anlage
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://MEINE-IP/?s=1,0
  refresh: 30
  commandMethod: GET
  timeout: 3000
  bufferSize: 2048
channels:
  - id: Istwert_HK1
    channelTypeUID: http:string
    label: Istwert HK1
    description: ""
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*ISTWERT HK1</td>\s. *<td class=.value.>(.*) °C.*
Der String wird brav aktualisiert, es hapert also nur noch an der Regex. Findet jemand den Fehler?

wosch
Beiträge: 53
Registriert: 30. Dez 2020 08:36
Answers: 0

Re: HTTP Umstellung V1 => V3

Beitrag von wosch »

Ich verstehe leider noch immer nicht, warum die obige Expression in OH nicht funktioniert - habe aber zumindest mal einen workaround gefunden:

Code: Alles auswählen

REGEX:.*ISTWERT HK1</td>\n. *<td class=.value.>(.{1,4}) °C.*
in der geschweiften Klammer steht die min. und max. Anzahl an digits. In dem Fall besteht der string aus 1 bis 4 Zeichen. Je nachdem was für Werte zu erwarten sind, sind die Längen der Zeichenfolge logischerweise anzupassen.

Nun habe ich nochmal zwei Fragen:
1) Bekomme ich die Werte mit Komma (zB 23,3) auch irgendwie direkt in ein Number-Item oder muss ich zwangsläufig eine rule für die String-Items schreiben um das Komma mit einem Punkt zu ersetzen? Wie die rule dazu aussieht ist mir klar, allerdings wäre es bedeutend weniger Aufwand und weniger rules ( :D ), wenn das gleich in der UI gehen würde.

2) Eine der Seiten meiner Wärmepumpe zeigt die aktuellen Betriebsmodi der Anlage an. Hier erscheint / erscheinen nur der Wert / die Werte, die gerade aktiv sind. Hier kann also einer der Strings, 2, 3 oder keiner stehen. EDIT: jetzt mit jeweils 2 Strings unter ANLAGENSTATUS (EVU-SPERRE und ABTAUEN LL-WT) sowie BETRIEBSSTATUS (SCHALTPROGRAMM AKTIV uns HEIZKREISPUMPE):

Code: Alles auswählen

    <div class="span-11 append-1" style="float:left"><table class="info"><tr><th colspan="2" class="round-top">ANLAGENSTATUS</th></tr>  <tr class="even">
    <td class="key">EVU-SPERRE</td>
    <td class="value"><img height="15" src="./pics/tec-symbol_an-8e8e8e.png" /> </td>
  </tr>
  <tr class="odd">
    <td class="key">ABTAUEN LL-WT</td>
    <td class="value"><img height="15" src="./pics/tec-symbol_an-8e8e8e.png" /> </td>
  </tr>
</table></div><div class="span-11 prepend-1" style="float:right"><table class="info"><tr><th colspan="2" class="round-top">BETRIEBSSTATUS</th></tr>  <tr class="even">
    <td class="key">SCHALTPROGRAMM AKTIV</td>
    <td class="value"><img height="15" src="./pics/tec-symbol_an-8e8e8e.png" /> </td>
  </tr>
  <tr class="odd">
    <td class="key">HEIZKREISPUMPE</td>
    <td class="value"><img height="15" src="./pics/tec-symbol_an-8e8e8e.png" /> </td>
Es gibt neben dem o.g. "Schalterprogramm aktiv" auch noch weitere Stati: Heizen, Verdichter, Verdampfer, ...
Ich denke die stehen dann alle unter der Table "Betriebsstatus". Bekomme ich die einzelnen Stati über einen Switch-Channel gelinked? D.h. über OnValue und OffValue, wobei es keinen match der regexp für den OffValue gäbe (=NULL) und eben den match zB SCHALTERPROGRAMM AKTIV = onValue - ist das möglich?

EDIT2: zumindest funktionieren die Switches, bei zB onValue = EVU-SPERRE - ob es bei offValue = NULL dann auch funktioniert, werde ich erst wissen, wenn der Status mal verschwunden ist.
Zuletzt geändert von wosch am 9. Feb 2021 20:24, insgesamt 1-mal geändert.

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

Re: HTTP Umstellung V1 => V3

Beitrag von udo1toni »

Du könntest in der Klammer mit einem begrenzteren Match arbeiten: statt (.*) nimmst Du ([0-9]+,[0-9]).
Ich gehe davon aus, dass der Wert niemals negativ wird. ;)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

wosch
Beiträge: 53
Registriert: 30. Dez 2020 08:36
Answers: 0

Re: HTTP Umstellung V1 => V3

Beitrag von wosch »

Die Heizkreistemperatur ist tatsächlich eher selten negativ :D Aber die Temperaturen der WP sind durchaus negativ. Das Problem habe ich aber schon mit der Begrenzung der Länge des Strings gelöst :)
Jetzt kämpfe ich damit, ob sich die Regex auch so darstellen lässt, dass ich das Komma gleich in mit einem Punkt replacen kann, sodass ich direkt ein Number Item linken kann und nicht den Umweg über rules gehen muss... Weißt du ob das geht?

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

Re: HTTP Umstellung V1 => V3

Beitrag von udo1toni »

Da wirst Du vermutlich auf die JS Transformation ausweichen, dort kannst Du ebenfalls REGEX verwenden (allerdings als JavaScript Funktion...) und dann auch noch die Ersetzung vornehmen.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

wosch
Beiträge: 53
Registriert: 30. Dez 2020 08:36
Answers: 0

Re: HTTP Umstellung V1 => V3

Beitrag von wosch »

Ok, wenn ich das richtig verstehe lege ich dann für jedes Item ein Script an, dass neben der Regex noch das Komma in einen Punkt transformiert. Jetzt die dumme, aber wirklich ernst gemeinte Frage von meiner Seite: hat das irgendeinen Vorteil gegenüber einer rule für jedes Item? Außer, dass ich nicht zwei Items brauche (String und Number)?

Die rule hab ich für 2-3 Items probiert, das klappt problemlos:

Code: Alles auswählen

rule "Istwert HK1"
when 
Item HTTPLWZAnlage_IstwertHK1 changed 
then 
LWZ_Istwert_HK1.postUpdate(Float::parseFloat(String::format("%s",HTTPLWZAnlage_IstwertHK1.state).replace(',','.')))
end 

Beim Java Script weiß ich nicht mal so recht wo ich anfangen soll... Daher die Frage ob sich das überhaupt lohnt? Ich meine mal aufgeschnappt zu haben, dass die Anzahl an zu verarbeiteten rules soz. begrenzt ist, da nur x Threads dafür zur Verfügung stehen. Sofern das überhaupt stimmt, gilt das dann für JS auch? Oder wäre das dann der Vorteil gegenüber den rules?

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

Re: HTTP Umstellung V1 => V3

Beitrag von udo1toni »

Wenn Du diverse Items mit dem Problem Komma gegen Punkt hast, könntest Du die Rule generalisieren und damit mit einer einzigen Rule alle Itempaare transformieren. Wichtig wäre dabei dann, dass die Namen sich gut voneinander ableiten lassen, also z.B.

LWZAnlageIstwertHK1_IN und LWZAnlageIstwertHK1_OUT

Man beachte, dass sich die Namen nur durch den letzten Teil unterscheiden und dieser Unterschied als einziges mit dem Unterstrich abgetrennt ist. Nun kannst Du die beiden "Sorten" (IN und OUT) in zwei Gruppen organisieren, z.B. gIN und gOUT. Dann schreibst Du eine Rule für alle Items:

Code: Alles auswählen

rule "Komma zu Punkt"
when
    Member of gIN changed
then
    val myOut = gOUT.members.filter[i|i.name == triggeringItem.name.split("_").get(1)+"_OUT"].head
    myOut.postUpdate(Float::parseFloat(String::format("%s",triggeringItem.state).replace(',','.')))
end
Diese EINE Rule reicht, um sich um ALLE Itempaare zu kümmern. Mit höherem Aufwand kann man natürlich auch noch weitere Unterstriche im Namen unterstützen, aber so wie gezeigt ist es halt sehr einfach. das Wichtigste ist, dass alle Items innerhalb der Gruppe sich über den selektierten Namensteil unterscheiden und ein passendes Gegenstück in der anderen Gruppe haben, bei dem der selektierte Namensteil jeweils identisch ist.
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

wosch
Beiträge: 53
Registriert: 30. Dez 2020 08:36
Answers: 0

Re: HTTP Umstellung V1 => V3

Beitrag von wosch »

Das ist ja wirklich genial!

Allerdings bekomme ich es nicht zum laufen :(

- Ich habe zwei Groups - gIN und gOUT
- String LWZAnlageIstwertHK1_IN (gIN) ==> der Wert wird korrekt ausgelesen und im VSC auch als Member der Group angezeigt
- Number:Temperature LWZAnlageIstwertHK1_OUT (gOUT) = NULL; Member der Group im VSC angezeigt
- rule exakt wie oben, per copy&paste eingefügt - typo also ausgeschlossen

Wo liegt der Fehler?

Edit: die Wärmepumpe heizt gerade, das String-Item ändert sich also - die rule muss also auch getriggered werden.

Antworten