ECMAScript ist die neue und langfristige Skriptsprache für OpenHAB. Die Dokumentation könnte aber noch einen Tick besser sein. Gerade beim Zugriff auf Persistenzfunktionen. In Blockly, der grafischen Regelengine sind Persistenzfunktionen (noch) nicht verfügbar.
PersistenceExtensions und ZonedDateTime
Los geht’s, wir erstellen ein neues ECMAScript.
Damit man mit Persistenzfunktionen arbeiten kann, benötigt man zwei Klassen:
var pE = Java.type('org.openhab.core.persistence.extensions.PersistenceExtensions');
var zDT = Java.type('java.time.ZonedDateTime');
Zum einen die Persistenzerweiterungen (PersistenceExtensions), und dazu noch die ZonedDateTime Klasse, um die Persistenzmethoden mit zeitlichen Angaben parametrisieren zu können.
Außerdem empfiehlt sich ein Logger-Objekt, um beim Entwickeln und Testen die ein oder andere Logausgabe zu nutzen:
var logger = Java.type('org.slf4j.LoggerFactory').getLogger('org.openhab.rule.' + ctx.ruleUID);
Beispiel: Durchschnitt
Sehen wir uns ein Beispiel an. Hier der Duchschnitt der letzten 2 Stunden inkl. Ausgabe im Log:
var ave = pE.averageSince(itemRegistry.getItem('number_item'), zDT.now().minusHours(2));
logger.info("Durchschnitt: " + ave);
Kurz erklärt: pE.averageSince(Item, Zeitpunkt)
Das Item erhält man über „itemRegistry.getItem(id)“. Das Objekt “ itemRegistry“ muss hierfür nicht erzeugt werden, es ist in OpenHAB Skripten bereits verfügbar und kann direkt verwendet werden.
Den Zeitpunkt erhält man über die praktische Funktion „zDT.now()“, die einem das Datumsobjekt zum aktuellen Zeitpunkt bereitstellt. Daran lässt sich über zB. „minusHours(int)“ sehr leicht navigieren.
Weitere Beispiele
var myItem = itemRegistry.getItem('number_item');
pE.maximumSince(myItem, zDT.now().minusDays(14)); // -> number
pE.changedSince(myItem, zDT.now().minusMinutes(20)); // -> boolean
Persistenz und Blockly-Editor
Ich habe inzwischen fast alle Scripte auf Blockly umgestellt. Nicht weil es einfacher geht oder besser lesbar wäre.
Blockly hat den Vorteil, dass sich daraus jede beliebige Script-Sprache generieren lässt. Mit meinem Wunsch nach langfristigen Lösungen ist Blockly aus meiner Sicht somit die beste Option.
Und ja, auch in Sachen Lesbarkeit und Tippfehler hat Blockly vorteile.
Aber: Bislang gibt es keine Persistenzfunktionen.
Ich löse das Problem, indem ich benötigte Durchschnittswerte in einem dedizierten Skript berechnen lasse, und diese dann im Model speichere. Das ganze sieht so aus:
Über Blockly kann ich dann auf die gespeicherten Durchschnittswerte zugreifen und so meine Logik aufbauen, ohne in Blockly direkt die Persistenzfunktionen aufzurufen.
Praktischer Nebeneffekt: Die Durchschnittswerte werden persistiert und können dann auch als Chart angezeigt werden, was sehr interessant sein kann, je nach Anwendungsfall.
Dokumentation zu den verwendeten Klassen
Hier noch die Dokumentation der verwendeten Klassen. Es sind typische API-Dokus, also nicht besonders Anwenderfreundlich, aber derzeit das Beste in Sachen Vollständigkeit und Korrektheit was es an Doku gibt.
Persistenzerweiterungen:
https://www.openhab.org/javadoc/latest/org/openhab/core/persistence/extensions/persistenceextensions
ZonedDateTime von Oracle:
https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html
Noch keine Kommentare