| @@ -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): | |||
| @@ -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): | |||
| """ | |||
| @@ -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: | |||
| @@ -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 | |||