Skip to content

Commit 7dff5a8

Browse files
committed
alpha1:
-added conditions for triggers -evaluate "eval" attribute conditions -arguments for events are automaticly named -name config via 'event_args' var in the plugin -added plugin "buzzerbouncer"
1 parent 6080f7f commit 7dff5a8

13 files changed

+177
-57
lines changed

config.xml

+17-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
11
<umbehki>
22
<actions>
3-
<action event="VLC.stopped">
3+
4+
<!--<action event="VLC.stopped">
45
<trigger name="Monitor.standby"/>
56
</action>
7+
-->
8+
<action event="Fritzbox.incomingCall" enabled="false">
9+
<trigger name="VLC.pause"/>
10+
</action>
611

712
<action event="Fritzbox.incomingCall">
8-
<trigger name="VLC.pause"/>
13+
<trigger name="Buzzerbouncer.openDoor">
14+
<condition arg="Fritzbox.msn" value="3297089"/>
15+
</trigger>
16+
<!--<trigger name="VLC.pause"/> -->
17+
</action>
18+
19+
<action event="Test.everyMinute">
20+
<trigger name="Test.deactivate">
21+
<condition arg="Test.count" eval="{arg} &gt; 5 and {arg} &lt; 10"/>
22+
</trigger>
23+
<!--<trigger name="VLC.pause"/> -->
924
</action>
1025

1126
</actions>

plugins/buzzerbouncer.plugin

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[Core]
2+
Name = BuzzerBouncer
3+
Module = buzzerbouncer
4+
5+
[Documentation]
6+
Author = Shuairan
7+
Version = 0.1
8+
Website = http://problemloeser.org
9+
Description = toggle the pins on the NetIO to open my door

plugins/buzzerbouncer.py

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from umb.UmbPlugin import *
2+
import telnetlib
3+
import time
4+
5+
HOST = "192.168.25.200"
6+
PORT = 2701
7+
BUZZER = "io set ddr 0 ff 10"
8+
BUZZER_OFF = "io set ddr 0 00 10"
9+
10+
class Buzzerbouncer(UmbPlugin):
11+
def __init__(self):
12+
UmbPlugin.__init__(self)
13+
14+
@trigger
15+
def openDoor(self):
16+
tn = telnetlib.Telnet(HOST, PORT)
17+
tn.write(BUZZER+"\n")
18+
time.sleep(1)
19+
tn.write(BUZZER_OFF+"\n")
20+
tn.close()

plugins/fritzbox/fritzbox.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@
1515

1616
class Fritzbox(UmbPlugin):
1717
#event list:
18-
events = ["incomingCall"]
19-
18+
events = [ "incomingCall" ]
19+
event_args = {"incomingCall": ["phonenumber", "alias", "msn"] }
20+
2021
def __init__(self):
21-
UmbPlugin.__init__(self, Fritzbox.events)
22+
UmbPlugin.__init__(self)
2223
self.mythread = ListenThread(self)
2324
self.mythread.setDaemon(True)
2425
self.mythread.start()
@@ -156,7 +157,7 @@ def run(self):
156157
# if no telephone number is received with the call
157158
else:
158159
self.logger.info("phonecall from an unknown person")
159-
self.phonenumber = _('unknown')
160+
self.phonenumber = 'unknown'
160161
self.alias = 'unknown'
161162

162163
self.parent.raiseEvent("Fritzbox.incomingCall", self.phonenumber, self.alias, self.msn)

plugins/monitor.plugin

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
[Core]
2-
Name = Monitor Plugin
2+
Name = Monitor
33
Module = monitor
44

55
[Documentation]
66
Author = Shuairan
77
Version = 0.1
88
Website = http://problemloeser.org
9-
Description = plugin for controlling the computer screen (turning on, off)
9+
Description = monitor controllings
1010

plugins/phone.plugin

-10
This file was deleted.

plugins/phone.py

-8
This file was deleted.

plugins/phone.py~

-8
This file was deleted.

plugins/test/test.py

+13-5
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,20 @@
66
class Test(UmbPlugin):
77
#event list:
88
events = ["everyMinute", "testEvent"]
9-
9+
event_args = {"everyMinute": ["count"],
10+
"testEvent": ["bla"]}
11+
1012
def __init__(self):
11-
UmbPlugin.__init__(self, Test.events)
13+
UmbPlugin.__init__(self)
1214
self.thread_killed = False
1315
self.th = threading.Thread(target = self.thread)
1416
self.th.start()
1517

1618
def thread(self):
19+
count = 0
1720
while not self.thread_killed:
18-
19-
self.raiseEvent.everyMinute()
21+
count = count+1
22+
self.raiseEvent.everyMinute(count)
2023
for i in range(60):
2124
time.sleep(1)
2225
if self.thread_killed:
@@ -28,7 +31,12 @@ def out(self, *args):
2831
print "Out: %s " % args
2932
else:
3033
print "Out (empty)"
31-
self.raiseEvent("Test.testEvent")
34+
self.raiseEvent("Test.testEvent", "argument")
3235

3336
def aFoobarEvent(self, *args):
3437
self.raiseEvent()
38+
39+
@trigger
40+
def deactivate(self):
41+
IPlugin.deactivate(self)
42+
self.thread_killed = True

plugins/vlc/vlc.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class VLC(UmbPlugin):
1717
events = ["stopped"]
1818

1919
def __init__(self):
20-
UmbPlugin.__init__(self, VLC.events)
20+
UmbPlugin.__init__(self)
2121
self.lastState = None
2222

2323
self.thread_killed = False

umb/UmbConfig.py

+65-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ def loadActions(file='config.xml'):
1212
actions = cfg.getElementsByTagName('action')
1313

1414
for action in actions:
15+
action_enabled = action.getAttribute('enabled')
1516
event = action.getAttribute('event');
1617
triggers = action.getElementsByTagName('trigger');
1718

@@ -21,22 +22,33 @@ def loadActions(file='config.xml'):
2122

2223
for trigger in triggers:
2324
triggerName = trigger.getAttribute('name');
25+
trigger_enabled = trigger.getAttribute('enabled')
2426
args = trigger.getAttribute('args');
27+
2528
logger.debug("Adding Trigger '%s' to Action '%s' with args %s " % (triggerName, event, args))
29+
condition = trigger.getElementsByTagName('condition');
30+
31+
cond = Condition(condition[0])
32+
2633
if args is "":
2734
args = None
28-
actionList[event].addTrigger(triggerName, args);
35+
newTrigger = Trigger(triggerName,args,cond)
36+
if action_enabled is 'false' or trigger_enabled is 'false':
37+
newTrigger.deactivate()
38+
39+
actionList[event].addTrigger(newTrigger)
2940

3041
return actionList;
3142

3243

3344
class Action:
3445
def __init__(self):
3546
self.triggers = [];
36-
47+
self.activated = True
48+
3749
""" Todo: Add support for arguments"""
38-
def addTrigger(self, trigger, args=None):
39-
self.triggers.append(Trigger(trigger,args))
50+
def addTrigger(self, trigger):
51+
self.triggers.append(trigger)
4052

4153
def getTrigger(self, name):
4254
for trigger in self.triggers:
@@ -47,6 +59,54 @@ def getTrigger(self, name):
4759

4860

4961
class Trigger:
50-
def __init__(self, name, args=None):
62+
def __init__(self, name, args=None, condition = None):
5163
self.name = name
5264
self.args = args
65+
self.condition = condition
66+
self.enabled = True
67+
68+
@deprecated
69+
def hasCondition(self):
70+
if self.condition is not None:
71+
return True
72+
73+
def checkCondition(self, args):
74+
if self.condition is None:
75+
#no condition
76+
return True
77+
else:
78+
return self.condition.check(args)
79+
80+
def activate(self):
81+
self.enabled = True
82+
83+
def deactivate(self):
84+
self.enabled = False
85+
86+
87+
class Condition:
88+
def __init__(self, xmldom):
89+
self.arg = xmldom.getAttribute('arg');
90+
self.value = xmldom.getAttribute('value');
91+
92+
if xmldom.hasAttribute('eval'):
93+
self.evaluate = xmldom.getAttribute('eval');
94+
else:
95+
self.evaluate = "{arg} is " + self.value
96+
97+
logger.debug("EVALUATE %s " % self.evaluate)
98+
99+
def check(self, arguments):
100+
logger.debug("Checking condition for: '%s'?" %(self.arg))
101+
logger.debug(arguments)
102+
103+
if self.arg in arguments:
104+
value = arguments[self.arg]
105+
eval_condition = self.evaluate.format(arg=value)
106+
logger.debug("evaluation: '%s' " % self.evaluate.format(arg=self.arg))
107+
logger.debug("evaluation: '%s' " % eval_condition)
108+
if eval (eval_condition):
109+
logger.debug("Condition is True!")
110+
return True
111+
112+
return False

umb/UmbPlugin.py

+38-8
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,24 @@ class UmbPlugin(IPlugin):
1212
"""
1313
default class of Umbheki Plugins
1414
"""
15+
events = []
16+
event_args = None
1517

16-
def __init__(self, eventList=[]):
18+
def __init__(self):
1719
IPlugin.__init__(self)
1820
self.name = self.__class__.__name__
1921
self.logger = logging.getLogger("Plugin:%s" % self.name)
2022
self.raiseEvent = EventRaiser( self,
21-
eventList,
23+
self.events,
24+
self.event_args,
2225
self.logger)
2326

2427
self.trigger = None
25-
26-
def raiseEvent(self, name, eventList, logger, watchdog):
28+
29+
#def raiseEvent(self, name, eventList, logger, watchdog):
2730
"""dummy, will be set to a new EventRaiser in __init__"""
28-
pass
29-
31+
#pass
32+
3033
def eventWatchdog(self, event, *args):
3134
"""
3235
DO NOT USE AND NOT OVERWRITE!
@@ -50,12 +53,18 @@ class EventRaiser(object):
5053
EventRaiser object
5154
"""
5255

53-
def __init__(self, parent, eventList, logger):
56+
def __init__(self, parent, eventList, eventArgs, logger):
5457
self.parent = parent
5558
self.logger = logger
5659
self.name = self.parent.name
60+
61+
self.event_args = {}
62+
if eventArgs is not None:
63+
self.event_args = dict(zip(map( lambda x:self.name+"."+x, eventArgs.keys()), eventArgs.values()))
64+
5765
self.createEventMethods(eventList)
5866

67+
5968
def __call__(self, eventName=None, *args):
6069
"""
6170
raise an event. Three ways to raise:
@@ -68,10 +77,31 @@ def __call__(self, eventName=None, *args):
6877
eventmethod = sys._getframe(1).f_code.co_name
6978
eventName = "%s.%s" % (self.name, eventmethod)
7079

80+
7181
self.logger.debug("Event called: %s " % eventName)
72-
if len(args): self.logger.debug(args)
82+
if len(args):
83+
self.logger.debug(args)
84+
args = self.createEventArgumentList(eventName, args)
85+
7386
self.parent.eventWatchdog(eventName, args)
7487

88+
def createEventArgumentList(self, eventName, arguments):
89+
"""
90+
maps the argument list (from 'event_args' in the plugin)
91+
to the arguments that came as parameter in the event call, creates a dictionary:
92+
93+
"""
94+
eventargs = self.event_args[eventName]
95+
if len(arguments) and len(eventargs):
96+
argList = dict(zip(map(lambda x:self.name+"."+x, eventargs), arguments))
97+
#rest of unnamed arguments:
98+
#rest = arguments[len(eventargs):]
99+
#argList = argMap, rest
100+
else:
101+
argList = arguments
102+
103+
return argList
104+
75105
def createEventMethods(self, eventList):
76106
"""
77107
add the event methods to the instance of this class for every

umb/main.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,17 @@ def watchdog(self, event, args=None):
9797

9898
logger = logging.getLogger("Umbheki Watchdog")
9999
logger.debug("event raised: '%s'" % event)
100+
if args:
101+
logger.debug(args)
100102

101103
action = self.getAction(event)
102104
if action is not None:
103105
for trigger in action.triggers:
104-
logger.debug("Trigger called '%s' args: %s " %(trigger.name, trigger.args))
105-
self.callTrigger(trigger.name, trigger.args);
106-
107-
106+
if trigger.activated and trigger.checkCondition(args):
107+
logger.debug("Trigger called '%s' args: %s " %(trigger.name, trigger.args))
108+
self.callTrigger(trigger.name, trigger.args);
109+
else:
110+
logger.debug("Trigger '%s' is deactivated or condition-check returned false" % (trigger.name))
108111

109112
class NotYetImplemented(Exception):
110113
def __init__(self):

0 commit comments

Comments
 (0)