OH3 JavaScript built-in-Methoden nicht gefunden

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: OH3 JavaScript built-in-Methoden nicht gefunden

Beitrag von udo1toni »

@oh72: Also. Du legst ein http Thing an, mit der URL, die Du abfragst. Dann legst Du einen String Channel an. Als state transformation trägst Du REGEX:{XC_SUC}(.*) ein. Damit sollte im Channel das JSON Objekt übrig bleiben.
Nun kannst Du diesen Channel mit verschiedenen String Items verknüpfen. Dabei legst Du ein Profile vom Typ JSONPATH an und trägst dort den entsprechenden Path ein. Zum Beispiel:
$.[?(@.adr=="2247C401")].state ergibt als Status dann I:0:00B4:00DB:00:00
Unter der Voraussetzung, dass die Nodes immer in der gleichen Reihenfolge kommen, kannst Du natürlich auch direkt adressieren, mit $.[6].state

Den String kannst Du dann innerhalb einer Rule noch mittels Item.state.toString.split(":").get(2) auf 00B4 eingrenzen. Natürlich kannst Du auch sämtliche Operationen innerhalb der Rule machen. Nehmen wir an, es gibt keine state transformation. Es kommt also der gesamte String in einem String Item httpInput an.

Code: Alles auswählen

rule "http thermostat"
when
    Item httpInput changed
then
    val strJSON          = transform("REGEX","({XC_SUC}(.*))",httpInput.state.toString)
    val strKuecheState   = transform("JSONPATH","$.[?(@.adr=="2247C401")].state",strJSON)
    val strKindState     = transform("JSONPATH","$.[?(@.adr=="4CDDEB01")].state",strJSON)
    val strKuecheValSoll = strKuecheState.split(":").get(2)
    val strKuecheValIst  = strKuecheState.split(":").get(3)
    val strKindValSoll   = strKindState.split(":").get(2)
    val strKindValIst    = strKindState.split(":").get(3)
    val sollKueche       = (Integer::parseInt(strKuecheValSoll,16)).floatValue / 10
    val istKueche        = (Integer::parseInt(strKuecheValIst,16)).floatValue / 10
    val sollKind         = (Integer::parseInt(strKindValSoll,16)).floatValue / 10
    val istKind          = (Integer::parseInt(strKindValIst,16)).floatValue / 10
    KuecheSoll.postUpdate(sollKueche)
    KuecheIst.postUpdate(istKueche)
    KindSoll.postUpdate(sollKind)
    KindIst.postUpdate(istKind)
end
Eine Rule für beide Thermostate. Man könnte die Rule natürlich auch etwas eleganter gestalten, in dem Sinn, dass nicht zig mal ein sehr ähnlicher Befehl ausformuliert wird, sondern eher über eine geschickte Schachtelung automatisch die Werte ausgelesen und den passenden Items zugewiesen werden.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

wolfnic
Beiträge: 8
Registriert: 19. Feb 2021 15:56
Answers: 0

Re: OH3 JavaScript built-in-Methoden nicht gefunden

Beitrag von wolfnic »

udo1toni hat geschrieben: 26. Mär 2021 21:47 Das Problem ist an dieser Stelle, dass ich Dir eine DSL Rule gepostet habe. Du legst aber Deine Rule über die UI an. Mein Tipp an dieser Stelle wäre tatsächlich: Probiere die Rule mal in einer *.rules Datei aus. Verwende die realen Itemnamen.
Genau, ich hab das über die UI angelegt und dabei JavaScript ausgewählt.
Ich hatte nämlich irgendwo in diesem Forum in einem Posting von Dir gelesen, dass DSL wohl keine große Zukunft hat (anders als JavaScript).

Wie für Anfänger empfohlen, habe ich alles mit der Main UI gemacht.
Für den Versuch mit der .rules Datei muss ich erst noch mehr rumsuchen.

Die Beispiele von .rules Dateien, die ich bisher gesehen haben, sind wohl alle in DSL.
Geht da JavaScript nicht?
Muss man diese Dateien im GUI importieren via "Entwickler Tools > Add Items from Textual Definition" (mit Copy+Paste)?
Oder einfach unter $OPENHAB_CONF/rules ablegen?

Tut mir leid, dass ich soviel dumme Fragen stelle :oops:
Aber die Dokumentation ist schon recht umfangreich, aber aus meiner Sicht fehlt irgendwie oft der "Missing-Link".
Und die Unterschiede der verschiedenen Versionen führen aufs Glatteis :shock:
Zuletzt geändert von wolfnic am 27. Mär 2021 12:51, insgesamt 1-mal geändert.

wolfnic
Beiträge: 8
Registriert: 19. Feb 2021 15:56
Answers: 0

Re: OH3 JavaScript built-in-Methoden nicht gefunden

Beitrag von wolfnic »

oh73 hat geschrieben: 26. Mär 2021 20:56 ... schalte ich alle mit einem Mediola AIO Gateway V4+
Vielen Dank für den Tipp - und die anderen Hinweise.

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

Re: OH3 JavaScript built-in-Methoden nicht gefunden

Beitrag von oh73 »

beim Raspberry gibt es das Verzeichnis

/etc/openhab
und darin sind die Unterverzeichnisse,
html\
icons\
items\
misc\
persistence\
rules\
scripts\
services\
sitemaps\
sounds\
things\
transform\

hier kommt in das Verzeichnis rules deine Rules Datei. Name ist egal, nur die Endung muss rules sein!

ein Beispiel für so eine Datei hat udo1toni ja schon weiter oben eingestellt.

ps. hab mal mit deinem Ausgabestring zum testen eine kleine Rule gemacht, da zu noch 3 Items Number1 - Number 3 angelegt,
kommen einwandfrei die 3 Zahlen raus.
OH 4.3.0 auf HP 26o G1 Dm Mini Pc mit MX_Linux

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

Re: OH3 JavaScript built-in-Methoden nicht gefunden

Beitrag von udo1toni »

wolfnic hat geschrieben: 27. Mär 2021 12:33
udo1toni hat geschrieben: 26. Mär 2021 21:47 Das Problem ist an dieser Stelle, dass ich Dir eine DSL Rule gepostet habe. Du legst aber Deine Rule über die UI an. Mein Tipp an dieser Stelle wäre tatsächlich: Probiere die Rule mal in einer *.rules Datei aus. Verwende die realen Itemnamen.
Genau, ich hab das über die UI angelegt und dabei JavaScript ausgewählt.
Ich hatte nämlich irgendwo in diesem Forum in einem Posting von Dir gelesen, dass DSL wohl keine große Zukunft hat (anders als JavaScript).
Von Javascript habe ich vermutlich nichts geschrieben ;) abgesehen davon haben sich die Dinge etwas geändert. Es gibt Aussagen im englischen Forum, dass die Pläne, die DSL abzukündigen verworfen wurden.
wolfnic hat geschrieben: 27. Mär 2021 12:33 Wie für Anfänger empfohlen, habe ich alles mit der Main UI gemacht.
Das kannst Du ja auch machen, dann müsstest Du allerdings nicht JavaScript auswählen (schließlich ist das kein JavaScript)
wolfnic hat geschrieben: 27. Mär 2021 12:33 Für den Versuch mit der .rules Datei muss ich erst noch mehr rumsuchen.
Du musst lediglich im Verzeichnis /etc/openhab/rules/ eine Datei mit der Endung .rules anlegen (z.B. meine.rules) und dort den Code speichern.
wolfnic hat geschrieben: 27. Mär 2021 12:33 Die Beispiele von .rules Dateien, die ich bisher gesehen haben, sind wohl alle in DSL.
Geht da JavaScript nicht?
*.rules Dateien sind immer und ausschließlich in der Rules DSL programmiert.
wolfnic hat geschrieben: 27. Mär 2021 12:33 Muss man diese Dateien im GUI importieren via "Entwickler Tools > Add Items from Textual Definition" (mit Copy+Paste)?
Oder einfach unter $OPENHAB_CONF/rules ablegen?
Letzteres. $OPENHAB_CONF verweist auf /etc/openhab/
wolfnic hat geschrieben: 27. Mär 2021 12:33 Tut mir leid, dass ich soviel dumme Fragen stelle :oops:
Aber die Dokumentation ist schon recht umfangreich, aber aus meiner Sicht fehlt irgendwie oft der "Missing-Link".
Und die Unterschiede der verschiedenen Versionen führen aufs Glatteis :shock:
Also, wenn man die offizielle Doku liest, geht es immer nur um die aktuelle Version, es sei denn, man wählt (oben links) eine ältere Version aus.
Die grundlegenden Dinge haben sich nie geändert, es sind höchstens ein paar Dinge hinzugekommen (aber es gibt von dieser Regel auch Ausnahmen).

Das größte Problem mit der "Dokumentation" ist, dass alle möglichen Leute etwas schreiben und meist nicht explizit angeben, auf welche Version sich das bezieht. Vieles davon ist darauf zurückzuführen, dass sich die Entwickler aktiv dagegen gewehrt haben, die Dokumentation auch auf deutsch zur Verfügung zu stellen :) aber so ist das halt... Ich hab auch keine Lust, die Doku zu übersetzen...
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

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

Re: OH3 JavaScript built-in-Methoden nicht gefunden

Beitrag von oh73 »

hallo uno1toni,

vielen dank für Deine Hilfe, so langsam fange ich an das mit Regex und JonsonPhath zu verstehen.

Aber du hast mir hier
Also. Du legst ein http Thing an, mit der URL, die Du abfragst. Dann legst Du einen String Channel an. Als state transformation trägst Du REGEX:{XC_SUC}(.*) ein
eine dicke Falle eingebaut :)

hab jetzt fast 2 Tage gebraucht bis ich rausgefunden habe das die eckigen Klammern escapiert werden müssen!
hatte alles mögliche versucht, aber es kamen nur Fehlermeldungen oder der ganze String, was dann natürlich von Jonsonphat nicht umgesetzt werden konnte.
dachte schon das liegt an meiner OH Version und Regex geht da überhaupt nicht.


den Hinweis mit dem escapieren hab ich dann an anderer Stelle hier im Forum gefunden.
viewtopic.php?p=32530#p32530
OH 4.3.0 auf HP 26o G1 Dm Mini Pc mit MX_Linux

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

Re: OH3 JavaScript built-in-Methoden nicht gefunden

Beitrag von udo1toni »

Ups... :oops:
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

wolfnic
Beiträge: 8
Registriert: 19. Feb 2021 15:56
Answers: 0

Re: OH3 JavaScript built-in-Methoden nicht gefunden

Beitrag von wolfnic »

@udo1toni und @oh73:
Vielen Dank, unter Nutzung von VScode mit Zugriff auf die Shares von RasPi habe ich es jetzt hinbekommen (als DSL-Script).

Bitte meine Kritik nicht falsch verstehen.
Ich bin nach wie vor der Meinung, dass openHAB ein ungeheuer mächtiges und flexibles System ist.
Klar kann da nicht alles perfekt sein, insbesondere wenn man bedenkt, dass es Open Source ist.

Und nochmal schönen Dank an Eure (besonders Deine, udo) Unterstützung!


Eine Frage habe ich noch:
Gibt es eine built-in-Methode zur formatierten Ausgabe einer Float-Zahl?
Also z.B. um nur 2 Nachkommastellen zu bekommen?
Wie ich gesehen habe, orientiert sich DSL ja an JavaScript.
So etwas wie toPrecision() und String.format() gibts aber wohl nicht, oder?
Wo findet man da eine Doku?

Am schönsten wäre eine Formatierung erst bei der Ausgabe der Float-Zahl im GUI.
Geht so was?

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

Re: OH3 JavaScript built-in-Methoden nicht gefunden

Beitrag von udo1toni »

Die Rules DSL orientiert sich in erster Linie an Java (nicht Java Script). Die DSL ist in XTend erstellt, welches in Java programmiert ist, daher auch die Nähe zu Java.
Du kannst Module importieren und nutzen, z.B. String::format(). In den Items kannst Du die Darstellung ganz einfach formatieren, z.B. %.1f für eine Nachkommastelle. Wenn Du auf den Status eine Items zugreifst, nutzt Du .state. Zu beachten ist dabei, das es sich dann um einen Status handelt, nicht um einen String oder eine Zahl. Die DSL wandelt durchaus von sich aus in bestimmte Formate, aber zum einen kann das schief gehen, zum anderen kann man im Code nur dann auf Funktionen zugreifen, wenn der entsprechende Typ schon festgelegt ist. Du kannst also z.B. den Status als Sting verwenden und z.B. Zeichen ersetzen (mit .replace()), aber nur, wenn Du das nStatus explizit als String verwendest, das wäre dann MeinItem.state.toString.replace() (formatieren könntest du so auch, aber eben keine Zahl... die ist ja zu dem Zeitpunkt schon ein String)
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

wolfnic
Beiträge: 8
Registriert: 19. Feb 2021 15:56
Answers: 0

Re: OH3 JavaScript built-in-Methoden nicht gefunden

Beitrag von wolfnic »

Vielen Dank, besonders auch für die Hintergrundinfos.

Antworten