Based on the really nice decorators from @steve1 (openhab2-jython), I tried to create my own decorator to add a trigger for each item of a given group.
Therefore I tried to change the triggers.py module, which is installed in the jython-path and not run as script.
These modules don’t have the scope of the scripts, so you need to import anything you need on your own.
You can see the change I did at GitHub.
To get the members of the group, I need access to the itemRegistry
- where can I import this?
It seems to belong to org.eclipse.smarthome.core.items
, but from org.eclipse.smarthome.core.items import ItemRegistry
results in an error:
21:55:31.727 [ERROR] [ipt.internal.ScriptEngineManagerImpl] - Error during evaluation of script 'file:/etc/openhab2/automation/jsr223/homie_monitoring.py': NameError: global name 'itemRegistry' is not defined in <script> at line number 37
BTW: If I add the decorator to my script, everything works fine - however, this is not a long-term solution.
Working script:
se.importPreset("RuleSimple")
se.importPreset("RuleSupport")
from openhab.log import logging
from openhab import triggers
import openhab.items
from openhab.triggers import ItemStateUpdateTrigger, ItemEventTrigger, _FunctionRule
ITEM_CHANGE = "ItemStateChangedEvent"
ITEM_UPDATE = "ItemStateEvent"
ITEM_COMMAND = "ItemCommandEvent"
def item_group_triggered(group_name, event_types=None, result_item_name=None):
event_types = event_types or [ITEM_CHANGE]
if hasattr(event_types, '__iter__'):
event_types = ",".join(event_types)
def decorator(fn):
dlog = logging.getLogger("RULES.oh2-jython.triggers.item_group_triggered")
def callback(module, inputs):
result_value = fn(inputs)
if result_item_name:
scope.events.postUpdate(result_item_name, str(result_value))
group_triggers = []
groupitems = itemRegistry.getItem(group_name)
for i in groupitems.getAllMembers():
group_triggers.append(ItemEventTrigger(unicode(i.name), event_types))
dlog.debug(" added ItemStateUpdateTrigger for " + unicode(i.name))
rule = _FunctionRule(callback, group_triggers, extended=True)
#get_automation_manager().addRule(rule)
automationManager.addRule(rule)
return fn
return decorator
@item_group_triggered("homie_uptime")
def debug_uptime(input):
logging.getLogger("RULES.Debug.Uptime_Test").debug("Event: {} - [{}]".format(unicode(input), unicode(input.__class__)))