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

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 243
Wohnort: Darmstadt

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

Beitrag von udo1toni »

Und am Rande ;) man kann beim number Channel dann auch ohne Probleme die unit setzen und fortan mit QuantityType arbeiten,
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

starbright
Beiträge: 93
Registriert: 16. Jan 2023 19:27
Answers: 0

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

Beitrag von starbright »

Danke, das sieht besser aus damit! Wie bist du darauf gekommen ... das mit dem
Value∩JS:|input == '' ? 0 :parseFloat(input)
Verstehe nicht, wie man das rausfindet .... Was ich hatte konnte man in der Doku finden (wenn ich auch lange gebraucht hab).

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

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

Beitrag von Harka »

Du kannst bei Transformationen mehrere Aufträge verketten (nacheinander ablaufen lassen). Hier wird mit JS=Javascript gleich noch ein Leerstring durch 0 ersetzt bzw. der als Text vorliegende Wert in eine Zahl umgewandelt. Wird in der kommenden Version 4.3 sogar noch mal ein Ticken einfacher.

starbright
Beiträge: 93
Registriert: 16. Jan 2023 19:27
Answers: 0

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

Beitrag von starbright »

Immer wenn ich denke ich hab es endlich kapiert klappt es nicht.
curl http://192.168.3.241/gen.yield.year.chart.js liefert etwa so was:

Code: Alles auswählen

input.setAttribute("value", "2024");
document.getElementById("labelValueId").innerHTML = "   2.253kWh 2024";
document.getElementById("buttonPrevId").disabled  = false;
Und in regexp eingegeben klappt das hier und mit

Code: Alles auswählen

.*innerHTML.*([0-9]+\.[0-9]+)
wird die gewünschte 2.253 ausgegeben.

Trotzdem liefert mir das hier nur NULL:

Code: Alles auswählen

UID: http:url:Wechselrichter_gesamt
label: Wechselrichter_gesamt
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://192.168.3.241/gen.yield.year.chart.js
  delay: 0
  stateMethod: GET
  refresh: 3
  commandMethod: GET
  timeout: 3000
  bufferSize: 9048
channels:
  - id: Wechselrichter_total_channel
    channelTypeUID: http:string
    label: Wechselrichter_total_channel
    description: ""
    configuration:
      stateTransformation: REGEX:.*innerHTML.*([0-9]+\.[0-9]+)

Noch eine kurze Frage zu einem http Bindung Thing. Kann man mit einem Thing mehrere Seiten abgfragen?
Also diese
http://192.168.3.241/gen.yield.year.chart.js
http://192.168.3.241/measurements.xml
Ich erzeuge (oder versuche es), die Thing/Items via openhab Web-IF zu erzeugen. Das mit xm klappt jetzt, aber ich bekomme das obige nicht mehr hin.

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

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

Beitrag von udo1toni »

Ja, da fehlt am Ende noch ein .*

Code: Alles auswählen

stateTransformation: REGEX:.*innerHTML.*([0-9]+\.[0-9]+).*
                                                        ^^
Der Punkt ist, dass REGEX immer auf den gesamten String matchen muss. Nur dann liefert REGEX den Teil innerhalb der ersten Klammer als Wert.
Sobald der Ausdruck korrekt funktioniert, solltest Du den Channel auf number umstellen. Der number Channel kennt zusätzlich einen Parameter unit, den Du dann passend auf kWh setzen kannst:

Code: Alles auswählen

UID: http:url:Wechselrichter_gesamt
label: Wechselrichter_gesamt
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://192.168.3.241/gen.yield.year.chart.js
  delay: 0
  stateMethod: GET
  refresh: 3
  commandMethod: GET
  timeout: 3000
  bufferSize: 9048
channels:
  - id: Wechselrichter_total_channel
    channelTypeUID: http:number
    label: Wechselrichter_total_channel
    description: ""
    configuration:
      stateTransformation: REGEX:.*innerHTML.*([0-9]+\.[0-9]+).*
      unit: kWh
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

starbright
Beiträge: 93
Registriert: 16. Jan 2023 19:27
Answers: 0

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

Beitrag von starbright »

Danke - das war es tatsächlich.
Ich bin ja kein Held in regexp, aber ich hab mich auf https://regex101.com/ verlassen. Das zeigt die Zahl auch ohne .* als Group an. :(

Noch mal zum dem http-Binding thing. Ich hab jetzt zwei Things angelegt, weil die Basis-URL bei mir nicht nur die IP, sondern auch die Web-Page beinhaltet. Kann man die (um nur mit einem http Thing zu arbeiten) auch in den Channel verlegen? Also statt zwei Things mit jeweils einem Channel nur ein Thing mit zwei Channels ?

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

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

Beitrag von Harka »

Moin,
du kannst als baseURL: http://192.168.3.241/ und bei den Channels unter "Status-URL Erweiterung" gen.yield.year.chart.js bzw. measurements.xml eintragen.

PS: Bei dem chart.js-Ding bin etwas unsicher. Könnte dies nicht zum Jahreswechsel Probleme geben, wenn der Wert kein Punkt mehr enthält? Ich bin heute Vormittag an der RegEx-Geschichte gescheitert und habe nur eine etwas unschönere Lösung mit JavaScript hin bekommen.

Code: Alles auswählen

JS:|parseFloat(input.split('kWh')[0].split('"').slice(-1)[0].replaceAll('.',''))

starbright
Beiträge: 93
Registriert: 16. Jan 2023 19:27
Answers: 0

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

Beitrag von starbright »

Ja, das chart.js ist schon aus anderen Gründen nicht wirklich genial.
Es gibt eine page "gen.yield.total.chart.js", die generiert wirklich eine Gesamtleistung. Allerdings in MWh und damit "nur" mit einer Auflösung in 0.001 = 1kWh
Die "gen.yield.year.chart.js" dagegen in kWh, aber leider in dieser Form:

Code: Alles auswählen

...
"data": [
0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2.865000]
}
]
}
var max = 50;
var steps = 1;
var input = document.getElementById("inputId");
input.setAttribute("min",   "2012");
input.setAttribute("max",   "2024");
input.setAttribute("value", "2024");
document.getElementById("labelValueId").innerHTML = "   2.865kWh 2024";
document.getElementById("buttonPrevId").disabled  = false;
Also eigentlich müsste man die Zahlen im data [] zusammenrechnen, weil sonst beginnt es im neuen Jahr wieder mit "0". Aber das überfordert mich im Moment. Wenn es bei 12 Einträgen bleibt, kann man das wahrscheinich mit einem enstprechend langen Regexp hinbekommen. Nur kann man damit auch rechnen in der Regexp? Naja, hab noch ein paar Tage das rauszubekommen. Mein alter WR war gestorben, der neue (gebrauchte) hat doch ein etwas anderes Web-IF.

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

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

Beitrag von Harka »

ok, dachte "labelValueId" enthält den Jahreswert mit formatierten 2865 kWh. Data scheint ja Teil eines größeren JSON zu sein. Das sollte sich gut auslesen und mit einer Schleife aufaddieren lassen.

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

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

Beitrag von udo1toni »

Harka hat geschrieben: 7. Dez 2024 16:25 Könnte dies nicht zum Jahreswechsel Probleme geben, wenn der Wert kein Punkt mehr enthält?
Ja, das wäre durchaus möglich. Der passende REGEX Ausdruck ist aber auch nicht weiter kompliziert:

Code: Alles auswählen

stateTransformation: REGEX:.*innerHTML.*([0-9]+\.?[0-9]*).*
                                                 ^
Natürlich besteht ein theoretisches Risiko, dass ein Komma ohne folgende Ziffer erkannt wird. Eventuell wäre es auch gut, außerhalb der Klammer noch mindestens ein Zeichen, welches keine Ziffer ist vorzusehen, hier also das k von kWh.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten