@@ -158,10 +158,10 @@ class AD2Factory(object): | |||||
last_devices = current_devices | last_devices = current_devices | ||||
for d in new_devices: | for d in new_devices: | ||||
self._factory.on_attached(d) | |||||
self._factory.on_attached(device=d) | |||||
for d in removed_devices: | for d in removed_devices: | ||||
self._factory.on_detached(d) | |||||
self._factory.on_detached(device=d) | |||||
except CommError, err: | except CommError, err: | ||||
pass | pass | ||||
@@ -416,7 +416,7 @@ class AD2(object): | |||||
""" | """ | ||||
msg = RFMessage(data) | msg = RFMessage(data) | ||||
self.on_rfx_message(msg) | |||||
self.on_rfx_message(message=msg) | |||||
return msg | return msg | ||||
@@ -433,14 +433,14 @@ class AD2(object): | |||||
if msg.event_type == 'ALARM_PANIC': | if msg.event_type == 'ALARM_PANIC': | ||||
self._panic_status = True | self._panic_status = True | ||||
self.on_panic(True) | |||||
self.on_panic(status=True) | |||||
elif msg.event_type == 'CANCEL': | elif msg.event_type == 'CANCEL': | ||||
if self._panic_status == True: | if self._panic_status == True: | ||||
self._panic_status = False | self._panic_status = False | ||||
self.on_panic(False) | |||||
self.on_panic(status=False) | |||||
self.on_lrr_message(msg) | |||||
self.on_lrr_message(message=msg) | |||||
return msg | return msg | ||||
@@ -486,19 +486,19 @@ class AD2(object): | |||||
self._power_status, old_status = message.ac_power, self._power_status | self._power_status, old_status = message.ac_power, self._power_status | ||||
if old_status is not None: | if old_status is not None: | ||||
self.on_power_changed(self._power_status) | |||||
self.on_power_changed(status=self._power_status) | |||||
if message.alarm_sounding != self._alarm_status: | if message.alarm_sounding != self._alarm_status: | ||||
self._alarm_status, old_status = message.alarm_sounding, self._alarm_status | self._alarm_status, old_status = message.alarm_sounding, self._alarm_status | ||||
if old_status is not None: | if old_status is not None: | ||||
self.on_alarm(self._alarm_status) | |||||
self.on_alarm(status=self._alarm_status) | |||||
if message.zone_bypassed != self._bypass_status: | if message.zone_bypassed != self._bypass_status: | ||||
self._bypass_status, old_status = message.zone_bypassed, self._bypass_status | self._bypass_status, old_status = message.zone_bypassed, self._bypass_status | ||||
if old_status is not None: | if old_status is not None: | ||||
self.on_bypass(self._bypass_status) | |||||
self.on_bypass(status=self._bypass_status) | |||||
if (message.armed_away | message.armed_home) != self._armed_status: | if (message.armed_away | message.armed_home) != self._armed_status: | ||||
self._armed_status, old_status = message.armed_away | message.armed_home, self._armed_status | self._armed_status, old_status = message.armed_away | message.armed_home, self._armed_status | ||||
@@ -514,20 +514,20 @@ class AD2(object): | |||||
else: | else: | ||||
if message.battery_low == True or time.time() > self._battery_status[1] + AD2.BATTERY_TIMEOUT: | if message.battery_low == True or time.time() > self._battery_status[1] + AD2.BATTERY_TIMEOUT: | ||||
self._battery_status = (message.battery_low, time.time()) | self._battery_status = (message.battery_low, time.time()) | ||||
self.on_low_battery(self._battery_status) | |||||
self.on_low_battery(status=self._battery_status) | |||||
if message.fire_alarm == self._fire_status[0]: | if message.fire_alarm == self._fire_status[0]: | ||||
self._fire_status = (self._fire_status[0], time.time()) | self._fire_status = (self._fire_status[0], time.time()) | ||||
else: | else: | ||||
if message.fire_alarm == True or time.time() > self._fire_status[1] + AD2.FIRE_TIMEOUT: | if message.fire_alarm == True or time.time() > self._fire_status[1] + AD2.FIRE_TIMEOUT: | ||||
self._fire_status = (message.fire_alarm, time.time()) | self._fire_status = (message.fire_alarm, time.time()) | ||||
self.on_fire(self._fire_status) | |||||
self.on_fire(status=self._fire_status) | |||||
elif isinstance(message, ExpanderMessage): | elif isinstance(message, ExpanderMessage): | ||||
if message.type == ExpanderMessage.RELAY: | if message.type == ExpanderMessage.RELAY: | ||||
self._relay_status[(message.address, message.channel)] = message.value | self._relay_status[(message.address, message.channel)] = message.value | ||||
self.on_relay_changed(message) | |||||
self.on_relay_changed(message=message) | |||||
self._update_zone_tracker(message) | self._update_zone_tracker(message) | ||||
@@ -548,42 +548,42 @@ class AD2(object): | |||||
self._zonetracker.update(message) | self._zonetracker.update(message) | ||||
def _on_open(self, sender, args): | |||||
def _on_open(self, sender, *args, **kwargs): | |||||
""" | """ | ||||
Internal handler for opening the device. | Internal handler for opening the device. | ||||
""" | """ | ||||
self.on_open(args) | |||||
self.on_open(args, kwargs) | |||||
def _on_close(self, sender, args): | |||||
def _on_close(self, sender, *args, **kwargs): | |||||
""" | """ | ||||
Internal handler for closing the device. | Internal handler for closing the device. | ||||
""" | """ | ||||
self.on_close(args) | |||||
self.on_close(args, kwargs) | |||||
def _on_read(self, sender, args): | |||||
def _on_read(self, sender, *args, **kwargs): | |||||
""" | """ | ||||
Internal handler for reading from the device. | Internal handler for reading from the device. | ||||
""" | """ | ||||
self.on_read(args) | |||||
self.on_read(args, kwargs) | |||||
msg = self._handle_message(args) | |||||
msg = self._handle_message(kwargs['data']) | |||||
if msg: | if msg: | ||||
self.on_message(msg) | |||||
self.on_message(message=msg) | |||||
def _on_write(self, sender, args): | |||||
def _on_write(self, sender, *args, **kwargs): | |||||
""" | """ | ||||
Internal handler for writing to the device. | Internal handler for writing to the device. | ||||
""" | """ | ||||
self.on_write(args) | |||||
self.on_write(args, kwargs) | |||||
def _on_zone_fault(self, sender, args): | |||||
def _on_zone_fault(self, sender, *args, **kwargs): | |||||
""" | """ | ||||
Internal handler for zone faults. | Internal handler for zone faults. | ||||
""" | """ | ||||
self.on_zone_fault(args) | |||||
self.on_zone_fault(args, kwargs) | |||||
def _on_zone_restore(self, sender, args): | |||||
def _on_zone_restore(self, sender, *args, **kwargs): | |||||
""" | """ | ||||
Internal handler for zone restoration. | Internal handler for zone restoration. | ||||
""" | """ | ||||
self.on_zone_restore(args) | |||||
self.on_zone_restore(args, kwargs) |
@@ -304,7 +304,7 @@ class USBDevice(Device): | |||||
try: | try: | ||||
self._device.write_data(data) | self._device.write_data(data) | ||||
self.on_write(data) | |||||
self.on_write(data=data) | |||||
except FtdiError, err: | except FtdiError, err: | ||||
raise CommError('Error writing to device: {0}'.format(str(err)), err) | raise CommError('Error writing to device: {0}'.format(str(err)), err) | ||||
@@ -385,7 +385,7 @@ class USBDevice(Device): | |||||
ret = self._buffer | ret = self._buffer | ||||
self._buffer = '' | self._buffer = '' | ||||
self.on_read(ret) | |||||
self.on_read(data=ret) | |||||
if timer: | if timer: | ||||
if timer.is_alive(): | if timer.is_alive(): | ||||
@@ -530,7 +530,7 @@ class SerialDevice(Device): | |||||
raise CommError('Error writing to device.', err) | raise CommError('Error writing to device.', err) | ||||
else: | else: | ||||
self.on_write(data) | |||||
self.on_write(data=data) | |||||
def read(self): | def read(self): | ||||
""" | """ | ||||
@@ -604,7 +604,7 @@ class SerialDevice(Device): | |||||
ret = self._buffer | ret = self._buffer | ||||
self._buffer = '' | self._buffer = '' | ||||
self.on_read(ret) | |||||
self.on_read(data=ret) | |||||
if timer: | if timer: | ||||
if timer.is_alive(): | if timer.is_alive(): | ||||
@@ -797,7 +797,7 @@ class SocketDevice(Device): | |||||
if data_sent == 0: | if data_sent == 0: | ||||
raise CommError('Error writing to device.') | raise CommError('Error writing to device.') | ||||
self.on_write(data) | |||||
self.on_write(data=data) | |||||
except (SSL.Error, socket.error), err: | except (SSL.Error, socket.error), err: | ||||
raise CommError('Error writing to device.', err) | raise CommError('Error writing to device.', err) | ||||
@@ -880,7 +880,7 @@ class SocketDevice(Device): | |||||
ret = self._buffer | ret = self._buffer | ||||
self._buffer = '' | self._buffer = '' | ||||
self.on_read(ret) | |||||
self.on_read(data=ret) | |||||
if timer: | if timer: | ||||
if timer.is_alive(): | if timer.is_alive(): | ||||
@@ -2,11 +2,12 @@ | |||||
# | # | ||||
# Based on pyevent originally found at http://www.emptypage.jp/notes/pyevent.en.html | # Based on pyevent originally found at http://www.emptypage.jp/notes/pyevent.en.html | ||||
# | |||||
# | |||||
# License: https://creativecommons.org/licenses/by/2.1/jp/deed.en | # License: https://creativecommons.org/licenses/by/2.1/jp/deed.en | ||||
# | # | ||||
# Changes: | # Changes: | ||||
# Added type check in fire() | |||||
# * Added type check in fire() | |||||
# * Removed earg from fire() and added support for args/kwargs. | |||||
class Event(object): | class Event(object): | ||||
@@ -60,19 +61,19 @@ class EventHandler(object): | |||||
self._getfunctionlist().remove(func) | self._getfunctionlist().remove(func) | ||||
return self | return self | ||||
def fire(self, earg=None): | |||||
def fire(self, *args, **kwargs): | |||||
"""Fire event and call all handler functions | """Fire event and call all handler functions | ||||
You can call EventHandler object itself like e(earg) instead of | |||||
e.fire(earg). | |||||
You can call EventHandler object itself like e(*args, **kwargs) instead of | |||||
e.fire(*args, **kwargs). | |||||
""" | """ | ||||
for func in self._getfunctionlist(): | for func in self._getfunctionlist(): | ||||
if type(func) == EventHandler: | if type(func) == EventHandler: | ||||
func.fire(earg) | |||||
func.fire(*args, **kwargs) | |||||
else: | else: | ||||
func(self.obj, earg) | |||||
func(self.obj, *args, **kwargs) | |||||
__iadd__ = add | __iadd__ = add | ||||
__isub__ = remove | __isub__ = remove | ||||
@@ -20,10 +20,10 @@ class TestAD2Factory(TestCase): | |||||
def tearDown(self): | def tearDown(self): | ||||
self._factory.stop() | self._factory.stop() | ||||
def attached_event(self, sender, args): | |||||
def attached_event(self, sender, *args, **kwargs): | |||||
self._attached = True | self._attached = True | ||||
def detached_event(self, sender, args): | |||||
def detached_event(self, sender, *args, **kwargs): | |||||
self._detached = True | self._detached = True | ||||
def test_find_all(self): | def test_find_all(self): | ||||
@@ -114,43 +114,43 @@ class TestAD2(TestCase): | |||||
def tearDown(self): | def tearDown(self): | ||||
pass | pass | ||||
def on_panic(self, sender, args): | |||||
self._panicked = args | |||||
def on_panic(self, sender, *args, **kwargs): | |||||
self._panicked = kwargs['status'] | |||||
def on_relay_changed(self, sender, args): | |||||
def on_relay_changed(self, sender, *args, **kwargs): | |||||
self._relay_changed = True | self._relay_changed = True | ||||
def on_power_changed(self, sender, args): | |||||
self._power_changed = args | |||||
def on_power_changed(self, sender, *args, **kwargs): | |||||
self._power_changed = kwargs['status'] | |||||
def on_alarm(self, sender, args): | |||||
self._alarmed = args | |||||
def on_alarm(self, sender, *args, **kwargs): | |||||
self._alarmed = kwargs['status'] | |||||
def on_bypass(self, sender, args): | |||||
self._bypassed = args | |||||
def on_bypass(self, sender, *args, **kwargs): | |||||
self._bypassed = kwargs['status'] | |||||
def on_battery(self, sender, args): | |||||
self._battery = args | |||||
def on_battery(self, sender, *args, **kwargs): | |||||
self._battery = kwargs['status'] | |||||
def on_fire(self, sender, args): | |||||
self._fire = args | |||||
def on_fire(self, sender, *args, **kwargs): | |||||
self._fire = kwargs['status'] | |||||
def on_arm(self, sender, args): | |||||
def on_arm(self, sender, *args, **kwargs): | |||||
self._armed = True | self._armed = True | ||||
def on_disarm(self, sender, args): | |||||
def on_disarm(self, sender, *args, **kwargs): | |||||
self._armed = False | self._armed = False | ||||
def on_config(self, sender, args): | |||||
def on_config(self, sender, *args, **kwargs): | |||||
self._got_config = True | self._got_config = True | ||||
def on_message(self, sender, args): | |||||
def on_message(self, sender, *args, **kwargs): | |||||
self._message_received = True | self._message_received = True | ||||
def on_rfx_message(self, sender, args): | |||||
def on_rfx_message(self, sender, *args, **kwargs): | |||||
self._rfx_message_received = True | self._rfx_message_received = True | ||||
def on_lrr_message(self, sender, args): | |||||
def on_lrr_message(self, sender, *args, **kwargs): | |||||
self._lrr_message_received = True | self._lrr_message_received = True | ||||
def test_open(self): | def test_open(self): | ||||
@@ -195,14 +195,14 @@ class TestAD2(TestCase): | |||||
msg = self._ad2._handle_message('[0000000000000000----],000,[f707000600e5800c0c020000]," "') | msg = self._ad2._handle_message('[0000000000000000----],000,[f707000600e5800c0c020000]," "') | ||||
self.assertIsInstance(msg, Message) | self.assertIsInstance(msg, Message) | ||||
self._ad2._on_read(self, '[0000000000000000----],000,[f707000600e5800c0c020000]," "') | |||||
self._ad2._on_read(self, data='[0000000000000000----],000,[f707000600e5800c0c020000]," "') | |||||
self.assertTrue(self._message_received) | self.assertTrue(self._message_received) | ||||
def test_message_kpe(self): | def test_message_kpe(self): | ||||
msg = self._ad2._handle_message('!KPE:[0000000000000000----],000,[f707000600e5800c0c020000]," "') | msg = self._ad2._handle_message('!KPE:[0000000000000000----],000,[f707000600e5800c0c020000]," "') | ||||
self.assertIsInstance(msg, Message) | self.assertIsInstance(msg, Message) | ||||
self._ad2._on_read(self, '[0000000000000000----],000,[f707000600e5800c0c020000]," "') | |||||
self._ad2._on_read(self, data='[0000000000000000----],000,[f707000600e5800c0c020000]," "') | |||||
self.assertTrue(self._message_received) | self.assertTrue(self._message_received) | ||||
def test_expander_message(self): | def test_expander_message(self): | ||||
@@ -17,10 +17,10 @@ class TestZonetracking(TestCase): | |||||
def tearDown(self): | def tearDown(self): | ||||
pass | pass | ||||
def fault_event(self, sender, args): | |||||
def fault_event(self, sender, *args, **kwargs): | |||||
self._faulted = True | self._faulted = True | ||||
def restore_event(self, sender, args): | |||||
def restore_event(self, sender, *args, **kwargs): | |||||
self._restored = True | self._restored = True | ||||
def _build_expander_message(self, msg): | def _build_expander_message(self, msg): | ||||
@@ -238,7 +238,7 @@ class Zonetracker(object): | |||||
self._zones[zone] = Zone(zone=zone, name=name, status=status) | self._zones[zone] = Zone(zone=zone, name=name, status=status) | ||||
if status != Zone.CLEAR: | if status != Zone.CLEAR: | ||||
self.on_fault(zone) | |||||
self.on_fault(zone=zone) | |||||
def _update_zone(self, zone, status=None): | def _update_zone(self, zone, status=None): | ||||
""" | """ | ||||
@@ -263,7 +263,7 @@ class Zonetracker(object): | |||||
if zone in self._zones_faulted: | if zone in self._zones_faulted: | ||||
self._zones_faulted.remove(zone) | self._zones_faulted.remove(zone) | ||||
self.on_restore(zone) | |||||
self.on_restore(zone=zone) | |||||
def _zone_expired(self, zone): | def _zone_expired(self, zone): | ||||
""" | """ | ||||