diff --git a/pyad2usb/ad2usb.py b/pyad2usb/ad2usb.py index acdcd24..0d334d7 100644 --- a/pyad2usb/ad2usb.py +++ b/pyad2usb/ad2usb.py @@ -191,6 +191,7 @@ class AD2USB(object): on_zone_restore = event.Event('Called when the device detects that a fault is restored.') on_low_battery = event.Event('Called when the device detects a low battery.') on_panic = event.Event('Called when the device detects a panic.') + on_relay_changed = event.Event('Called when a relay is opened or closed on an expander board.') # Mid-level Events on_message = event.Event('Called when a message has been received from the device.') @@ -235,6 +236,7 @@ class AD2USB(object): self._fire_status = (False, 0) self._battery_status = (False, 0) self._panic_status = None + self._relay_status = dict() self.address = 18 self.configbits = 0xFF00 @@ -387,13 +389,18 @@ class AD2USB(object): if header == '!EXP' or header == '!REL': msg = messages.ExpanderMessage(data) + self._update_internal_states(msg) + elif header == '!RFX': msg = self._handle_rfx(data) + elif header == '!LRR': msg = self._handle_lrr(data) + elif data.startswith('!Ready'): self.on_boot() + elif data.startswith('!CONFIG'): self._handle_config(data) @@ -510,6 +517,12 @@ class AD2USB(object): self._fire_status = (message.fire_alarm, time.time()) self.on_fire(self._fire_status) + elif isinstance(message, messages.ExpanderMessage): + if message.type == messages.ExpanderMessage.RELAY: + self._relay_status[(message.address, message.channel)] = message.value + + self.on_relay_changed(message) + self._update_zone_tracker(message) def _update_zone_tracker(self, message): diff --git a/pyad2usb/messages.py b/pyad2usb/messages.py index 5ea834e..c8c6dd7 100644 --- a/pyad2usb/messages.py +++ b/pyad2usb/messages.py @@ -138,9 +138,9 @@ class ExpanderMessage(object): address, channel, value = values.split(',') self.raw = data - self.address = address - self.channel = channel - self.value = value + self.address = int(address) + self.channel = int(channel) + self.value = int(value) if header == '!EXP': self.type = ExpanderMessage.ZONE @@ -173,7 +173,7 @@ class RFMessage(object): """ String conversion operator. """ - return 'rf > {0}: {1}'.format(self.serial_number, self.value) + return 'rf > {0}: {1:x}'.format(self.serial_number, self.value) def _parse_message(self, data): """ diff --git a/pyad2usb/zonetracking.py b/pyad2usb/zonetracking.py index 6ab3303..ce0a1e4 100644 --- a/pyad2usb/zonetracking.py +++ b/pyad2usb/zonetracking.py @@ -82,13 +82,14 @@ class Zonetracker(object): zone = self._expander_to_zone(int(message.address), int(message.channel)) status = Zone.CLEAR - if int(message.value) == 1: + if message.value == 1: status = Zone.FAULT - elif int(message.value) == 2: + elif message.value == 2: status = Zone.CHECK try: self._update_zone(zone, status=status) + except IndexError: self._add_zone(zone, status=status) @@ -114,7 +115,6 @@ class Zonetracker(object): # of whether or not the 3-digit mode is enabled... so we have to pull it out of the # alpha message. if zone == 191: - # TODO: parse message text. zone_regex = re.compile('^CHECK (\d+).*$') m = zone_regex.match(message.text) @@ -127,6 +127,7 @@ class Zonetracker(object): if zone in self._zones_faulted: self._update_zone(zone) self._clear_zones(zone) + else: status = Zone.FAULT if message.check_zone: diff --git a/test.py b/test.py index eaf1488..43df484 100755 --- a/test.py +++ b/test.py @@ -106,6 +106,9 @@ def handle_panic(sender, args): def handle_rfx(sender, args): print 'RFX', args +def handle_relay(sender, args): + print 'RELAY', args + def upload_usb(): dev = pyad2usb.ad2usb.devices.USBDevice() @@ -254,6 +257,7 @@ def test_socket(): a2u.on_zone_fault += handle_fault a2u.on_zone_restore += handle_restore a2u.on_rfx_message += handle_rfx + a2u.on_relay_changed += handle_relay # #a2u.on_fire += handle_fire #a2u.on_low_battery += handle_battery