Binding für Gerät mit Webserver (Steca-Wechselrichter)
-
- Beiträge: 285
- Registriert: 7. Mär 2021 14:49
Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)
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?
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
-
- Beiträge: 589
- Registriert: 20. Sep 2019 05:49
-
- Beiträge: 589
- Registriert: 20. Sep 2019 05:49
-
- Beiträge: 70
- Registriert: 16. Jan 2023 19:27
Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)
[/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.
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.
- udo1toni
- Beiträge: 13858
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)
Nein, das ist kein JSON sondern einfach html (also der interessante Teil...). Etwas anders formatiert:
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:
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.
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>");
Code: Alles auswählen
REGEX:.*P AC</td><td align='right'> *(\d+\.\d+?)<.*
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
-
- Beiträge: 70
- Registriert: 16. Jan 2023 19:27
Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)
---deleted---
Zuletzt geändert von starbright am 21. Feb 2023 20:10, insgesamt 1-mal geändert.
-
- Beiträge: 70
- Registriert: 16. Jan 2023 19:27
Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)
Hab mich von der *js Endung veräppeln lassen
Dein Regex war schon mal super! Kleine Korrektur nur nötig (wegen dem '/').
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>");
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+?)<.*
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>");
- udo1toni
- Beiträge: 13858
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)
Das ist... ungünstig. (also die Sache mit dem ---)
Man könnte zunächst versuchen, den Wert so zu catchen:
[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:
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:
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...
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\-]+?) *<.*
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)
Code: Alles auswählen
stateTransformation: REGEX:.*P AC<\/td><td align='right'> *([0-9\-]+\.?[0-9\-]+?) *<.*∩JS:no2zero.js
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
-
- Beiträge: 285
- Registriert: 7. Mär 2021 14:49
Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)
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
oder im Hab_Panel Widget mit
ps. ich brauch dem abrufen von der Webseite bei meinem Wechselrichter nicht weiter nach zu gehen.
hab jetzt endlich mein Modbus freigeschaltet bekommen!
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]
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
-
- Beiträge: 70
- Registriert: 16. Jan 2023 19:27
Re: Binding für Gerät mit Webserver (Steca-Wechselrichter)
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"?
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.