HTTP binding: Problem die Ausgabe mit Javascript nachzubearbeiten

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
manni64
Beiträge: 5
Registriert: 21. Mai 2023 19:10

HTTP binding: Problem die Ausgabe mit Javascript nachzubearbeiten

Beitrag von manni64 »

Hallo

ich benutze openhab 3.4.4 auf einem esprimo q920 unter ubuntu 22.04.2 lts. Die Konfiguration der things/items erfolgt über das GUI.
Ich habe das JS Addon installiert und unter /etc/openhab/transform zuletzt das Beispiel aus der openhab doku benutzt um zu sehen ob ich überhaupt bis zum JS Skript vordringe:

Code: Alles auswählen

(function(i) {
    var array = i.split(" ");
    return array[array.length - 1].length;
})(input)
Dieses ist als jstest2.js abgelegt. Die Linux Rechte sind -rwxr--r-- , owner openhab:openhab

Aber ich schaffe es einfach nicht eine per HTTP Binding aus dem LAN geholte Statusseite (z.b. vom Drucker oder der Wärmepumpe) per Staustransformation im Channel mit Javascript nachzubearbeiten. Aus den Channels habe ich Punkte im Model angelegt, wodurch gleichzeitig Items erzeugt wurden.

Konkret möchte ich die mehrere Betriebswerte der Wärempumpe im LAN als HTML seite abholen (URL im thing hinterlegt), dann pro Channel anhand passender Strings als Delimiter die einzelnen Temperaturen und Verbrauchswerte extrahieren und diese, weil sie im Zahlenformat ein Komma aufweisen, durch einem Dezimalpunkt ersetzen.
Das Holen und Zerteilen der HTML Seite funktionierte per REGEX in der State Transformation.
Ein nachgeschaltetes (verkettet mit "∩" ) zweites REGEX für die Komma zu Punkt Ersetzung bzw. Ersetzung per JS script innerhalb der Status-Transformation gelang mir nicht. Ebenso wenig nur ein einziges JS script in der State Transformation, das dann Zerteilen und Ersetzen vornehmen könnte. Eine "nur-JS Lösung" wäre mir lieber, also folgender YAML Code (mit dem JS code aus dem Beispiel, nur um einmal überhaupt eine Wirkung des JS zu sehen):

Code: Alles auswählen

UID: http:url:b132691ba1
label: t_http_dummy_js
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: true
  baseURL: http://192.168.1.11/PRESENTATION/HTML/TOP/PRTINFO.HTML
  delay: 0
  stateMethod: GET
  refresh: 10
  commandMethod: GET
  contentType: text/html
  timeout: 5000
  bufferSize: 2048
channels:
  - id: t_http_dummy_js
    channelTypeUID: http:string
    label: dummy3
    description: null
    configuration:
      mode: READONLY
  - id: t_http_dummy_js4
    channelTypeUID: http:string
    label: dummy4
    description: null
    configuration:
      mode: READONLY
      stateTransformation: JS:jstest2.js
Aktuell wird mit dem obigen Setup HTML unverändert zum item durchgereicht

Hat jemand eine Idee welche Trivialfehler ich hier mache und ob Verketten mit ∩ funktioniert? Ich murkse seit Tagen rum...
Ich dachte vom Channel käme ein String, der dann REGEX oder JS durchläuft , bei ∩ beide nacheinader, und dann als String zum Item weitergereicht würde (Konvertierung in ein Zahlenformat wäre noch zu lösen). Wenn ein Fehler in der Transformation aufträte, würde der original HTML output durchgereicht, wonach es hier aussieht.

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

Re: HTTP binding: Problem die Ausgabe mit Javascript nachzubearbeiten

Beitrag von udo1toni »

Also, unter openHAB3.4.4 gibt es überhaupt kein JS Addon.
Zur Auswahl stehen JavaScript Scripting, JavaScript Scripting (Nashorn) und JavaScript Transformation. Letzteres ist das, was Du installieren musst, Ersteres hast Du wahrscheinlich installiert.

REGEX kann in openHAB nicht zum Ersetzen verwendet werden. ein typisches REGEX in openHAB:

Code: Alles auswählen

.*Temperatur\: ([\d]*,[\d]*).*
liefert für

Code: Alles auswählen

ein Teilstring mit Temperatur: 23,7 °C und weiter geht's
dann den Wert 23,7 als String aus. Diesen kann man dann per JS Transformation weiterverarbeiten. Es ist lediglich ein Klammernpaar () erlaubt, alles innerhalb dieser Klammer wird als Ergebnis zurückgegeben. Matcht der Ausruck nicht, so wird die komplette Zeichenkette übergeben (ja, Fehlverhalten, aber so isses nun mal)

Leider ist es nicht möglich, einem aufgerufenen JavaScript Script einen Parameter zu übergeben. Lediglich der Status wird übergeben. Es ist also nicht möglich, z.B. jeweils den gewünschten Match zu übergeben. Damit müsstest Du für jeden Einzelwert ein eigenes JavaScript Script anlegen, obwohl sich dieses ausschließlich durch das angewendete REGEX Pattern unterscheidet. Nicht sehr effizient...
Die Verknüpfung durch Intersection (in Windows fälschlich als Durchschnitt bezeichnet, obwohl es um die Schnittmenge geht) funktioniert auch in http problemlos - das Symbol ∩ holt man am besten aus dem Hilfstext zur State Transformation, da es in UTF-8 mehrere sehr ähnliche Symbole gibt.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

manni64
Beiträge: 5
Registriert: 21. Mai 2023 19:10

Re: HTTP binding: Problem die Ausgabe mit Javascript nachzubearbeiten

Beitrag von manni64 »

Hallo udo1toni

Vielen Dank für die Hinweise bezüglich der Einschränkungen bei REGEX etc., sowas kann immens Zeit sparen.
Mit JS Addon habe ich mich leider etwas ungenau ausgedrückt. Es war bereits JS Transformation installiert (3.4.4) , welche ich gemeint hatte:
Bild
und auch das Intersection Symbol stammte direkt aus dem Hilfetext.

Letzter Stand mit dem abgespeckten Thing, nun mit der tatsächlichen URL und REGEX, also wie ich es tatsächlich verwenden will, wäre:

Code: Alles auswählen

UID: http:url:b132691ba1
label: t_http_dummy_js
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: http://192.168.1.15/?s=1,1
  delay: 0
  stateMethod: GET
  refresh: 10
  commandMethod: GET
  contentType: text/html
  timeout: 5000
  bufferSize: 2048
channels:
  - id: t_http_dummy_js
    channelTypeUID: http:string
    label: dummy3
    description: null
    configuration:
      mode: READONLY
      stateTransformation: REGEX:.*HEISSGASTEMP.*value..(\d*,\d*).C.*HOCHDRUCK.*
was zur Ausgabe führt:
Bild

Wnn ich dann folgendes comma2dot.js dahinterschalte:

Code: Alles auswählen

(function(i) {
   return i.replace(",",".");
})(input)
welches im js tester (https://www.webtoolkitonline.com/javascript-tester.html) gut aussehen würde
Bild

also im YAML:

Code: Alles auswählen

REGEX:.*HEISSGASTEMP.*value..(\d*,\d*).C.*HOCHDRUCK.* ∩ JS:comma2dot.js
kommt trotzdem nicht der zu Dezimalpunkt konvertierte String als Ergebnis.
Eigenartigerweise sehe ich auch im events.log bzw. openhab.log keine Bescherden wenn ich absichtlich den Namen oder pfad von comma2dot.js verfälsche.
Daher frage ich mich ob mein nach JS: angegebenes comma2dot.js überhaupt gefunden wird. Wenn ich aber im Profile "JS" anwähle, finde ich das comma2dot.js in den Dateinamensvorschlägen.
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 binding: Problem die Ausgabe mit Javascript nachzubearbeiten

Beitrag von udo1toni »

Da darf kein Leerzeichen stehen. :)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

manni64
Beiträge: 5
Registriert: 21. Mai 2023 19:10

Re: HTTP binding: Problem die Ausgabe mit Javascript nachzubearbeiten

Beitrag von manni64 »

Oh ja, Danke! ;)

Leider bin ich damit noch nicht am Ziel. Sobald bei mir in der State Transformation JS allein oder anteilig enthalten ist, ändert sich der angezeigte Wert des Items nicht mehr und auch im events.log wird für dieses Objekt kein Update mehr vermerkt.
Am ubuntu Terminal mit node -v bekomme ich die js Version v12.22.9 ausgegeben und die js Skripten in transform kann ich mit node<script>.js (geringfügig modifiziert wegen Übergabe der Argumente und log Ausgabe) ausführen. Am Installierten js hätte ich erst mal weniger Zweifel
Auch die js transformation in openhab habe ich inzwischen mehrmals deinstalliert und wieder installiert

Als testcase habe ich zuletzt eine Internetseite mit der Ausgabe der aktuellen Erdbevölkerung REGEX'ed => item update im gui und events.log enthält die Änderungen :)

Code: Alles auswählen

UID: http:url:e3f54427ba
label: t_http_netclk
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: https://countrymeters.info/de/World
  delay: 0
  stateMethod: GET
  refresh: 10
  commandMethod: GET
  timeout: 3000
  bufferSize: 2048
location: internet
channels:
  - id: i_http_netclk
    channelTypeUID: http:string
    label: i_http_netclk
    description: ""
    configuration:
      stateTransformation: REGEX:.*Weltbevölkerungsuhr.*cp1..(.*)..div.*Aktuelle Bevölkerung.*




Anschließend REGEX und JS. => angezeigter item wert behält den letzten Wert und in events.log kommt kein update für diesen Zähler mehr :(

Code: Alles auswählen

UID: http:url:e3f54427ba
label: t_http_netclk
thingTypeUID: http:url
configuration:
  authMode: BASIC
  ignoreSSLErrors: false
  baseURL: https://countrymeters.info/de/World
  delay: 0
  stateMethod: GET
  refresh: 10
  commandMethod: GET
  timeout: 3000
  bufferSize: 2048
location: internet
channels:
  - id: i_http_netclk
    channelTypeUID: http:string
    label: i_http_netclk
    description: ""
    configuration:
      stateTransformation: REGEX:.*Weltbevölkerungsuhr.*cp1..(.*)..div.*Aktuelle Bevölkerung.*∩JS:ex8.js
mit ex8.js:

Code: Alles auswählen

(function(i) {
   return i.replace(".","#");
})(input)
Also sobald ich JS im Spiel habe ist das update blockiert

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

Re: HTTP binding: Problem die Ausgabe mit Javascript nachzubearbeiten

Beitrag von udo1toni »

Gibt denn das Log irgendwelche Informationen?
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

manni64
Beiträge: 5
Registriert: 21. Mai 2023 19:10

Re: HTTP binding: Problem die Ausgabe mit Javascript nachzubearbeiten

Beitrag von manni64 »

Im /var/log/openhab/events.log ist nach Zufügen von JS:... zur state Transformation kein Update mehr für t_http_netclk zu finden, die updates der anderen Things laufen ungestört weiter. Im openhab.log auch keine Fehlerhinweise.

Ich habe inzwischen auf einem anderen Linux pc ( ubuntu 20.04 lts ) openhab 3.4.4 installiert und nur http binding, regex transformation und js transformation als addons. Dort 1 Thing angelegt , bei der state transformation REGEX verkettet mit JS wie weiter oben beschrieben - und es funktioniert - es kommt ein String der den Messwert mit Dezimalpunkt ausgibt.

Also scheint auf meinem ursprünglichen OH3 Rechner mit der Installation etwas im Argen zu sein. Da hilft nun bei mir nur das Vergleichen der Unterschiede in der Konfiguration meines OH3 Rechners und des versuchsweise neu aufgesetzten.

Dir auf jeden Fall vielen Dank für die immer schnellen und hilfreichen Antworten. :)

Ich glaube den Thread könnten wir schließen, außer ich finde bei meinen Nachforschungen noch was Interessantes für die Community.

Antworten