JSR223 Jython Scripting Helper

Hier möchte ich kurz meine eigenen openHAB Rule Helper Klassen vorstellen. Der Grund, sie zu erstellen kam daher das mir der Syntax der JSR223 Jython Schnittstelle zu aufwendig und kompliziert war um mal kurz eine einfache Rule zu schreiben.

Es gibt zwar bereits ein GibHub Projekt welches eine weitgehende Abstraktion bietet. Diese geht mir aber nicht weit genug weshalb ich meine eigene Lösung entworfen habe. Sie basiert aber auf der existierenden Lösung und erweitert sie.

Beispiel für eine einfache Rule

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@rule("door_bell_notification.py")
class DoorBellNotificationRule:
    def __init__(self):
        self.triggers = [ItemStateChangeTrigger("Bell_State", "OPEN")]

    def execute(self, module, input):
        self.log.info(u"Bell was triggered"")
        if itemStateOlderThen("Bell_Last_Change", getNow().minusSeconds(30)):
            sendNotification("Bell", "Bell rings", "https://yourServer.de/cameraStreetImage")
            sendMail("Bell rings", u"Someone rings on the Door", "https://yourServer.de/cameraStreetImage")

        postUpdate("Bell_Last_Change", DateTimeType())

Rule Annotation

Mit der @rule Annotation wird diese Klasse als Regel registriert. Der enthaltene String “door_bell_notification.py” wird für das Logging benötigt. Meine Rule Annotation bietet nun folgende Erweiterungen:

Methoden

Weiterhin bietet meine Klasse eine Vielzahl an nützlichen Hilfsmethoden. Sie orientieren sich von der Funktionsweise an openHAB 1.x und sollten mir die Migration zu Jython basierenden Regeln in openHAB 2.x erleichtern.

Quellen

Alle meine verwendeten Rules basieren auf dieser Jython Erweiterung. Sie kann direkt von meinem GitHub Repository bezogen werden.

Zusätzlich müssen noch die Klassen aus dem zuvor erwähnten Jython Projekt installiert werden. Am einfachsten geht es wenn man der Jython Installationsanleitung folgt und im Anschluss alles aus meinem Repository in seinen openHAB python Ordner kopiert

Burntime Script

Ein anderes Problem in openHAB war, das Rules gestartet wurden bevor openHAB komplett initialisert war. Um dieses Problem zu beheben habe ich das “burntime” Script geschrieben.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
log = LoggerFactory.getLogger("org.eclipse.smarthome.automation")

log.info("jsr223: checking for initialised context")

while True:
    try:
        scriptExtension.importPreset("RuleSupport")
        # from openhab.jsr223.scope import items
        # if items != None:
        if automationManager is not None:
            break;
    except:
        # instance = sys.exc_info()[1]
        # log.info(str(instance))
        pass
    log.info("jsr223: context not initialised yet. waiting 10 sec before checking again")
    time.sleep(10)

log.info("jsr223: done")

Es wird unter dem Namen “000_burntime.py” im openHAB Rule Ordner abgelegt und als erstes gestartet. Es läuft nun so lange bis der openHAB “automationManager” verfügbar ist und blockiert bis dahin die Ausführung aller weiteren Rules.

Dieses Script kann auch über mein GitHub Repository runtergeladen werden.

https://github.com/HolgerHees/openhab-config/blob/master/conf/automation/jsr223/000_burntime.py

https://intranet-der-dinge.de/
https://intranet-of-things.com/