Seite 1 von 1
OH3 Verständnisfrage Rules / Scripts und globale Variablen
Verfasst: 12. Jul 2021 15:21
von bon-go
Hallo Forum,
ich stelle von OH2 auf OH3 und auch von DSL Rules auf ECMAScripte (JavaScript) um. Das bringt mir (denke ich) schon Vorteile, meine Rules sind meist etwas komplexer. OH2 läuft nativ auf einem Raspi3, OH3 nativ auf einem Raspi4.
Bisher hatte ich verschiedenste Rules über teils mehrere Dateien mit div. Abhängigkeiten aber auch verschiedene Funktionen (z.B.Versand von Nachrichten, öfters wiederkehrende Berechnungen) und auch globale Variablen (z.B. letzter Status eines Ereignisses oder eine dauerhafte Einstellung) welche von mehreren Rules genutzt wurden.
1. Frage: Wenn ich meine extra vorhandenen DSL Funktionen als Scripte mit JavaScript nachbaue funktionieren die (für sich). Ich habe sicher einen Denkfehler, aber: wie rufe ich in OH3 die Funktionen dieser Scripte (wenn möglich mit Parameter) aus den Rules heraus auf? Ich habe das noch nirgends wirklich gefunden und mit probieren war ich auch nicht erfolgreich.
2. Frage: Wie lege ich in OH3 systemweit gültige globale Variablen fest die ich dann wiederum in verschiedenen Rules / Scripten in deren JavaScript benutzen kann? Derzeit behelfe ich mir indem ich manuell Items nur für diesen Zweck definiere (z.B. als Schalter oder Decimal), dort Werte hinterlege und die auch beim Start vom OH3 definiert setze. Diese Items mit deren Werten kann ich ja in Rules oder Scripts lesen und schreiben. Gibt es eine andere (präferierte) Lösung?
Danke schonmal für eure Antworten
Re: OH3 Verständnisfrage Rules / Scripts und globale Variablen
Verfasst: 12. Jul 2021 16:13
von udo1toni
Es ist tatsächlich so, dass es (momentan) keine globalen Variablen gibt. Das hat entsprechend auch Auswirkungen auf die Funktionen, die in der Rules DSL strenggenommen Variablen mit Lambda-Zuweisung sind.
Du kannst Deine bisherigen Rules weitgehend unverändert auch in openHAB3 laufen lassen (also aus den üblichen *.rules Textdateien). Größter Unterschied: Joda Time ist durch JavaTime ersetzt worden, was an verschiedenen Stellen leichte Änderungen der Aufrufe bedeutet, funktional aber keine Auswirkungen haben sollte (es gibt z.B. kein getMinuteOfDay mehr, kann man aber umschiffen mit getHour*60+getMinute)
Zweiter großer Knackpunkt: Wird eine Rule durch ein einzelnes Item getriggert (Item MyItem changed…), so steht das Item nicht wie bisher im impliziten Objekt triggeringItem zur Verfügung. Stattdessen gibt es nur noch triggeringItemName als implizite Variable (beim Trigger Member of bleibt es aber bei triggeringItem als Objekt).
Und: jede Rule hat ihren eigenen (exklusiven) Thread. Dafür wird keine Rule mehrfach gestartet. Das kann bei Rules, die sich um Gruppenmember kümmern zu Problemen führen, dafür gibt es aber keine Probleme mehr mit fehlenden Ressourcen.
Zu Umbau der Rules in andere Sprachen empfehle ich im englischen Forum die sehr gute Dokumentation von rlkoshak, der viele komplexe Codebeispiele in mehreren Programmiersprachen vorstellt und dabei auch auf die Unterschiede eingeht.
Gesendet von iPad mit Tapatalk
Re: OH3 Verständnisfrage Rules / Scripts und globale Variablen
Verfasst: 12. Jul 2021 16:22
von bon-go
Hallo,
Danke für die Antwort.
Dann bleibt es wohl erstmal bei dem Kunstgriff mit den manuell angelegten Items, da gibt es Schlimmeres.
Ich will ja aber weg von den DSL Regeln und auf JavaScript umstellen. Die aktuellen Rules sind arg verschachtelt, lassen sich eben nicht besser zerlegen und ich habe ab einer gewissen Komplexität immer mal nervende Probleme wenn hier und da etwas berechnet werden muss usw. . JavaScript finde ich nun nicht goldig aber es geht wenigstens, ist standardisiert und hat so vieles was man zum Leben braucht. Ich hoffe auch das bleibt eine Weile.
Das mit deiner als zweiten großen Knackpunkt angesprochenen Änderung habe ich noch nicht ganz erfasst, tangiert mich vmtl. eher nicht bzw. hat es noch nicht wissentlich.
Die Eigenart dass eine Rule nicht parallel abgearbeitet wird ist mir schon aufgefallen, konnte ich aber lösen. Bin halt noch nicht fertig mit dem Umbau und dem Testen. Vielleicht kommt da noch ein Problem, mal schaun.
Nach wie vor die Frage: wie rufe ich meine als 'Scripts' definierte Programme bzw. die darin enthaltenen Funktionen aus Rules heraus auf?
Re: OH3 Verständnisfrage Rules / Scripts und globale Variablen
Verfasst: 12. Jul 2021 23:13
von udo1toni
bon-go hat geschrieben: ↑12. Jul 2021 16:22
Nach wie vor die Frage: wie rufe ich meine als 'Scripts' definierte Programme bzw. die darin enthaltenen Funktionen aus Rules heraus auf?
Das hatte ich eingangs erwähnt. Geht nicht.
Re: OH3 Verständnisfrage Rules / Scripts und globale Variablen
Verfasst: 13. Jul 2021 13:13
von bon-go
Danke für die Antwort auch wenn das erstmal unbefriedigend ist. Es ergeben sich zwei Folgefragen:
1)
Wozu sind Scripts dann gut? Wenn ich da etwas programmiere, wann und wie könnte das laufen / angestoßen werden? Ergibt diese Funktion dann überhaupt noch Sinn?
2)
Ich hatte es erwähnt, ich habe eine Reihe von Funktionen die wiederkehrend in div. Rules Verwendung finden. Ja, ich könnte diese Funktionen jeweils komplett in die ECMA Rules schreiben. Aber es kann nicht Sinn und Zweck sein, an mehreren Stellen den exakt gleichen Code zu hinterlegen und auch pflegen zu müssen. Gibt es Alternativen dazu, das nicht tun zu müssen? Sprich: in mehreren Rules irgendwie selbstdefinierten Code (wenn möglich mit Parametern) aufzurufen?
Danke schonmal im Voraus für die Antworten

Re: OH3 Verständnisfrage Rules / Scripts und globale Variablen
Verfasst: 13. Jul 2021 16:45
von udo1toni
Ich fürchte, da musst Du beim Entwickler anfragen (also mutmaßlich im englischen Forum).
Ich halte die "moderneren" Programmiersprachen im Zusammenhang mit openHAB für einen Rückschritt, aber das ist natürlich nur meine persönliche Meinung. Und das liegt natürlich auch daran, dass ich mich mit den neuen Sprachen nicht auskenne, sehr wohl aber mit der DSL.
Die typischen Codes für einfache Aufgaben sind aber in der DSL deutlich besser lesbar und meist auch wesentlich schlanker.
Gerne werden bestimmte Programmiertechniken angeführt, um die Überlegenheit gegenüber der DSL zu beweisen, nur braucht man diese Techniken dann in der DSL meist überhaupt nicht, sondern löst das gestellte Problem wesentlich eleganter mit den vorhandenen Möglichkeiten.