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.

Neues ECMAScript erstellen

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:

ECMAScript für Persistenzabfragen

Ü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

Tags:

Noch keine Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Kategorien
Produktplatzierungen

In diesem Beitrag befinden sich Produktplatzierungen. Dabei handelt es sich um Produkte, welche ich aus eigener Motivation heraus gekauft und selbstverständlich bezahlt habe. Für die Platzierung in meinen Beiträgen erhalte ich keinerlei Gegenleistung von Seiten des Herstellers.
Die verlinkten Produkte sind zum überwiegenden Teil provisioniert, d.h. ich erhalte beim Verkauf eine kleine Provision.