JSR223 jython: method overriding

As you might now, I’m a big fan of steve-bate/openhab2-jython, I know the repository has been retired but I’m hoping it will soon be adopted by someone. Everything is new for me and I’m still learning how to use it, but it’s really good stuff.

Mainly I use the openhab.rules module and my scripts look similar to:

from openhab.rules import rule, addRule
from openhab.triggers import StartupTrigger

@rule
class ExampleRule(object):
    """This doc comment will become the ESH Rule documentation value for Paper UI"""
    def getEventTriggers(self):
        return [ StartupTrigger() ]

    def execute(self, module, inputs):
        self.log.info("rule executed")

addRule(MyRule())

Today I’m trying to figure out if I can make the execute function a bit more friendlier, e.g. providing more useful arguments.

def execute(self, module, inputs):

Typically when making a script, I’d want to be able to access

  • What type of trigger triggered the script? (E.g. Event type ‘Cron’, ‘Startup’, ‘ItemStateEvent’, ‘ItemCommandEvent’)
  • The item object in case triggered by ‘ItemStateEvent’, or ‘ItemCommandEvent’.
  • The triggered event state in case triggered by ‘ItemStateEvent’, or ‘ItemCommandEvent’.

It’s not difficult to find out all of the above but it takes some fiddeling with if statements.

Currently I use the following helper functions placed in a module:

def getTriggerType(inputs):
    '''Returns the triggertype found in input'''
    if not inputs:
        return 'Cron'
    elif 'event' in inputs:
        return inputs['event'].getType()
    else:
        return 'Startup' # How bad is this?

def getTriggerItemName(inputs):
    '''Returns the trigger item name if triggered by an item. Otherwise returns None'''
    event = inputs.get('event')
    return event.itemName if event else None

I believe using the above is cluttering my scripts. Would there be an easy way to override the execute function so it would look like:

def execute(self, event)

Where ‘event’ is an object with the following attributes:

event.isItem
event.isCron
event.isStartup
event.item
event.state

Example usage:

from openhab.rules import rule, addRule
from openhab.triggers import StartupTrigger

@rule
class ExampleRule(object):
    """This doc comment will become the ESH Rule documentation value for Paper UI"""
    def getEventTriggers(self):
        return [ StartupTrigger() ]

    def execute(self, event):
        if event.isItem:
            self.log.info('Triggered by '+event.item.name)
            self.log.info('New state is '+event.state)

addRule(MyRule())