Binding für Gerät mit Webserver (Steca-Wechselrichter)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

oh73
Beiträge: 285
Registriert: 7. Mär 2021 14:49
Answers: 1

Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)

Beitrag von oh73 »

Hab jetzt mal die Seite im Chrome Browser geöffnet und bin dann auf untersuchen gegangen.

da kann ich dann bei Elements umschalten auf Accessibility Tree View

dann finde ich auch die Daten die ich brauche!

nur wie bekomme ich jetzt den Dom Tree View oder Accessibility Tree View erst mal in eine Variable?
dann könnte ich das auch weiter verarbeiten.

wenn ich mit sendHttpGetRequest( die Seite aufrufe, bekomme ich den Seiten Quelltext, ist aber nicht das was ich brauche!

gibt es eine Möglichkeit den Accessibility Tree View von der Seite ab zu rufen und zu speichern?
OH 4.0.3 auf HP 26o G1 Dm Mini Pc mit MX_Linux

violine21
Beiträge: 589
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)

Beitrag von violine21 »


violine21
Beiträge: 589
Registriert: 20. Sep 2019 05:49
Answers: 7

Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)

Beitrag von violine21 »

oh73 hat geschrieben: 22. Jan 2023 17:09 dann finde ich auch die Daten die ich brauche!
Wie sieht das denn aus? Kannst du das mal hier zeigen?

starbright
Beiträge: 70
Registriert: 16. Jan 2023 19:27

Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)

Beitrag von starbright »

Bild[/img]Ich komme noch mal auf den Anfang zurück.
Das http Binding ist installiert und das Thing angelegt mit der Basis-URL. Das Gerät wird auch als online gezeigt.

Unter der page http://<ip>/page.main.html sieht man im Browser eine Tabelle mit Messwerten. Ich kann mir die Seite zwar als "Entwickler" im Firefox anschauen, richtig schlau werd ich aber nicht draus.

Nun der schwierige Part mit den Channels. Also ich hab hier bisher nur mit der Design-Ansicht gearbeitet, kein Code.
Also einen String channel hab ich angelegt. Einziger Eintrag bisher (Advanced)
/page.measurements.html als Status-URL Erweiterung.

Wie komme ich an den Wert in der Spalte P-AC ?

Im Firefox sehe ich in der Konsole:
GET http://192.168.3.241/gen.measurements.table.js

Das im Browser eingegeben gibt:

document.write("<table class='invisible'><tr class='invisible'><th class='invisible'><h3>Inverter</h3></th><th class='invisible'><h3></h3></th></tr><tr class='invisible'><td class='invisible' valign='top' align='center'><table><tr><th>Name</th><th>Value</th><th>Unit</th></tr><tr><td>P DC</td><td align='right'>2912.16</td><td>W</td></tr><tr><td>U DC</td><td align='right'> 406.61</td><td>V</td></tr><tr><td>I DC</td><td align='right'> 7.15</td><td>A</td></tr><tr><td>U AC</td><td align='right'> 239.36</td><td>V</td></tr><tr><td>I AC</td><td align='right'> 12.50</td><td>A</td></tr><tr><td>F AC</td><td align='right'> 49.97</td><td>Hz</td></tr><tr><td>P AC</td><td align='right'>2876.07</td><td>W</td></tr></table></td><td class='invisible' valign='top' align='center'></table></td></tr></table>");

Da sind wir doch schon nah dran ;). Also noch ein json transformation binding installieren, richtig? Da finde ich aber nichts zu.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)

Beitrag von udo1toni »

Nein, das ist kein JSON :) sondern einfach html (also der interessante Teil...). Etwas anders formatiert:

Code: Alles auswählen

document.write("<table class='invisible'><tr class='invisible'><th class='invisible'><h3>Inverter</h3></th><th class='invisible'><h3></h3></th></tr><tr class='invisible'><td class='invisible' valign='top' align='center'>
<table>
<tr><th>Name</th><th>Value</th><th>Unit</th></tr>
<tr><td>P DC</td><td align='right'>2912.16</td><td>W</td></tr>
<tr><td>U DC</td><td align='right'> 406.61</td><td>V</td></tr>
<tr><td>I DC</td><td align='right'> 7.15</td><td>A</td></tr>
<tr><td>U AC</td><td align='right'> 239.36</td><td>V</td></tr>
<tr><td>I AC</td><td align='right'> 12.50</td><td>A</td></tr>
<tr><td>F AC</td><td align='right'> 49.97</td><td>Hz</td></tr>
<tr><td>P AC</td><td align='right'>2876.07</td><td>W</td></tr>
</table>
</td><td class='invisible' valign='top' align='center'></table></td></tr></table>");
So kannst Du die Struktur gut erkennen. Es gibt verschiedene Optionen, um die Daten zu extrahieren, die für mich einfachste Variante ist REGEX, kurz für Regular Expressions. Für P AC sähe das z.B. so aus:

Code: Alles auswählen

REGEX:.*P AC</td><td align='right'> *(\d+\.\d+?)<.*
Wobei dann der Teil innerhalb der Klammern als Wert übergeben wird.
Der Punkt . steht für ein beliebiges Zeichen, der Stern * steht für beliebig viele Wiederholungen des vorangestellten Zeichens. .* bedeutet also: eine beliebig lange Zeichenfolge beliebiger Zeichen. Dann folgt der "Schlüssel", der den richtigen Teil des Codes einleitet, der natürlich P AC enthalten muss. Danach folgen diverse weitere Zeichen, die man natürlich auch "intelligenter" zusammengefasst werden können, aber für eine erste Annäherung würde ich KISS empfehlen (Keep It Simple Stupid). Nach dem > folgt noch ein einzelnes Leerzeichen, welches beliebig oft vorkommen darf (auch keinmal, siehe Werte in den anderen Zellen der Tabelle). Jetzt folgt die Zeichenfolge, welche wir extrahieren wollen, die nur aus Zahlen und einem Punkt bestehen darf. \d steht für eine Ziffer, das Plus + für mindestens ein oder beliebig viele des vorhergehenden Zeichens... \. ist der Punkt als Zeichen (. ist ja ein reserviertes Zeichen, weshalb es escaped werden muss) gefolgt von wieder mindestens einer Ziffer. Falls Zahlen zwischendurch auch mal komplett ohne Nachkommastellen angezeigt werden (insbesondere evtl. ohne Dezimalpunkt) muss der REGEX Ausdruck geändert werden... Das ? sorgt dafür, dass der kürzestmögliche Match zurückgegeben wird. Abschließend folgt als erstes Zeichen, welches nicht extrahiert wird das < Zeichen und anschließend wieder eine beliebig lange Zeichenkette beliebiger Zeichen (also .*).

Grau ist alle Theorie :) und es manchmal erstaunlich, über welche Fallen man stolpert, also keine Gelinggarantie, aber es könnte so passen :)

Damit Du REGEX verwenden kannst, musst Du es installieren :) wird gerne mal übersehen...

An die anderen Werte kommst Du auf die gleiche Weise, nur der Schlüssel variiert in den vier Zeichen vorne. Du brauchst für jeden Wert ein eigenes Item, Du brauchst für jeden Wert eine Stelle, um das REGEX zu verwenden. Sinnvoll wäre vermutlich, jeweils einen eigenen Channel zu verwenden, obwohl es auch andere Optionen gibt. Du kannst REGEX direkt im Channel verwenden, das hat dann den Vorteil, dass Du auch eine Unit übergeben kannst (die steht ja dabei, lohnt sich aber nicht, die zu extrahieren, die Unit ist ja statisch). Wenn Du die Unit mit angibst, kannst Du von UoM profitieren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

starbright
Beiträge: 70
Registriert: 16. Jan 2023 19:27

Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)

Beitrag von starbright »

---deleted---
Zuletzt geändert von starbright am 21. Feb 2023 20:10, insgesamt 1-mal geändert.

starbright
Beiträge: 70
Registriert: 16. Jan 2023 19:27

Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)

Beitrag von starbright »

Hab mich von der *js Endung veräppeln lassen :(

Dein Regex war schon mal super! Kleine Korrektur nur nötig (wegen dem '/').

Code: Alles auswählen

.*P AC<\/td><td align='right'> *(\d+\.\d+?)<.*
Nicht das ich Ahnung hätte aber https://regex101.com/ macht da einen Super Job.

Regex hab ich installiert - ist unter settings/addons zu finden.

Also ich hab das Thing angelegt (nix in advanced) und einen String-Channel.
Darin einziger Eintrag in dem Channel bisher (Advanced) "/page.measurements.html" als Status-URL Erweiterung.
Zu diesem Channel hab ich dann "Add points to model" gemacht und dort dan die REGEXP eintragen.
So könnte es gehen, aber noch läuft es nicht. Ich bekomme nur NULL zurück. Nicht ganz unlogisch, denn jetzt scheint keine Sonne. Nur blöd dass das bei Steca nicht mit "0,0" sondern mit "---" kodiert wird (siehe unten).

Wenn man nach belieben Zeichen scannt und ein "-" in eine "0" umwandelt könnte es gehen. Weil ich muss mit dem Wert rechnen können.

document.write("<table class='invisible'><tr class='invisible'><th class='invisible'><h3>Inverter</h3></th><th class='invisible'><h3></h3></th></tr><tr class='invisible'><td class='invisible' valign='top' align='center'><table><tr><th>Name</th><th>Value</th><th>Unit</th></tr><tr><td>P DC</td><td align='right'> --- </td><td>W</td></tr><tr><td>U DC</td><td align='right'> 1.40</td><td>V</td></tr><tr><td>I DC</td><td align='right'> --- </td><td>A</td></tr><tr><td>U AC</td><td align='right'> --- </td><td>V</td></tr><tr><td>I AC</td><td align='right'> --- </td><td>A</td></tr><tr><td>F AC</td><td align='right'> --- </td><td>Hz</td></tr><tr><td>P AC</td><td align='right'> --- </td><td>W</td></tr></table></td><td class='invisible' valign='top' align='center'></table></td></tr></table>");

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

Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)

Beitrag von udo1toni »

Das ist... ungünstig. (also die Sache mit dem ---)

Man könnte zunächst versuchen, den Wert so zu catchen:

Code: Alles auswählen

.*P AC<\/td><td align='right'> *([0-9\-]+\.?[0-9\-]+?) *<.*
[0-9\-] ist ein Zeichen aus der Zeichengruppe 0 bis 9 und zusätzlich das Zeichen -, also alles was an der Stelle auftreten kann. Das \.? catcht auf einen Punkt, der genau einmal oder keinmal vorkommt und hintenraus halt noch mal die Zahlen/Minus-Gruppe. Man könnte auch bei der hinteren Zahlengruppe einen Stern statt plus setzen, damit auch einstellige Zahlen ohne Dezimalpunkt matchen.

So, das wäre der Wert inclusive --- (auch noch bemerken: bei --- kommt auch hinten noch ein Leerzeichen dazu...). Das müssen wir nun noch in einem zweiten Schritt ersetzen, das könnte man mit einem JavaScript Script erledigen.

Ich bin nicht sonderlich bewandert mit JavaScript, aber vermutlich wäre es sowas:

Code: Alles auswählen

(function(value){
    if(value.includes("---"))
        value=0;
    return value;
})(input)
Nehmen wir an, der Code ist als no2zero.js abgespeichert, und zwar (zwingend) im Ordner $OPENHAB_CONF/transform/, dann sollte es möglich sein, den Output von REGEX als Input für JS zu verwenden. Das sieht dann so aus:

Code: Alles auswählen

stateTransformation: REGEX:.*P AC<\/td><td align='right'> *([0-9\-]+\.?[0-9\-]+?) *<.*∩JS:no2zero.js
Das Zeichen ∩ ist das Zeichen "Intersection" oder auf deutsch "Schnittmenge", was natürlich nicht so ganz stimmt, denn eigentlich ist es eine Chain, aber... so isses nun mal...
Da das Zeichen auf der normalen Tastatur nicht vorkommt, ist es das Einfachste, es aus dem Hilfstext zur stateTransformation zu kopieren, wo es erwähnt ist. In der Zeichentabelle von Windows heißt es fälschlich Durchschnitt :) wo doch jeder noch aus der Schulzeit das Ø als Durchschnitt kennt...
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

oh73
Beiträge: 285
Registriert: 7. Mär 2021 14:49
Answers: 1

Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)

Beitrag von oh73 »

ich lese etwas mit,

Regex ist mir etwas zu kompliziert, kam ich noch nie richtig mit zurecht.

ich würde versuchen das mit split zu lösen.

das Ergebnis in ein String Item speichern und dann entweder in einer Rule bearbeiten

Code: Alles auswählen

var P_AC = Ergebnis.state.split('<td>P AC</td><td align="right">').get(1).split('</td>').get(0]
oder im Hab_Panel Widget mit

Code: Alles auswählen

{{itemValue('Ergebnis').split('<td>P AC</td><td align="right">')[1].split('</td>')[0]}}

ps. ich brauch dem abrufen von der Webseite bei meinem Wechselrichter nicht weiter nach zu gehen.
hab jetzt endlich mein Modbus freigeschaltet bekommen!
OH 4.0.3 auf HP 26o G1 Dm Mini Pc mit MX_Linux

starbright
Beiträge: 70
Registriert: 16. Jan 2023 19:27

Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)

Beitrag von starbright »

Ich bekomme immer noch NULL: Ich hänge mal ein paar Screenshots an, vielleicht seht ihr was ich falsch gemacht hab:

Das ist schon bisschen tricky, Things, Channel, Point ... Dann wird auch eine Item Solar-Ertrag in Settings/Items angelegt, allerdings als String.
Final bräuchte ich ja eher eine Zahl.

Was mich etwas wundert, dass man beim Channel nur etwas im "Advanced" einträgt. Das ist ja eher unüblich.... normal sind die wichtigen Sachen doch "normal" erreichbar und nur Extras im "Advanced"?
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von starbright am 22. Feb 2023 10:44, insgesamt 1-mal geändert.

Antworten