| @@ -191,6 +191,7 @@ class AD2USB(object): | |||||
| on_zone_restore = event.Event('Called when the device detects that a fault is restored.') | 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_low_battery = event.Event('Called when the device detects a low battery.') | ||||
| on_panic = event.Event('Called when the device detects a panic.') | 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 | # Mid-level Events | ||||
| on_message = event.Event('Called when a message has been received from the device.') | 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._fire_status = (False, 0) | ||||
| self._battery_status = (False, 0) | self._battery_status = (False, 0) | ||||
| self._panic_status = None | self._panic_status = None | ||||
| self._relay_status = dict() | |||||
| self.address = 18 | self.address = 18 | ||||
| self.configbits = 0xFF00 | self.configbits = 0xFF00 | ||||
| @@ -387,13 +389,18 @@ class AD2USB(object): | |||||
| if header == '!EXP' or header == '!REL': | if header == '!EXP' or header == '!REL': | ||||
| msg = messages.ExpanderMessage(data) | msg = messages.ExpanderMessage(data) | ||||
| self._update_internal_states(msg) | self._update_internal_states(msg) | ||||
| elif header == '!RFX': | elif header == '!RFX': | ||||
| msg = self._handle_rfx(data) | msg = self._handle_rfx(data) | ||||
| elif header == '!LRR': | elif header == '!LRR': | ||||
| msg = self._handle_lrr(data) | msg = self._handle_lrr(data) | ||||
| elif data.startswith('!Ready'): | elif data.startswith('!Ready'): | ||||
| self.on_boot() | self.on_boot() | ||||
| elif data.startswith('!CONFIG'): | elif data.startswith('!CONFIG'): | ||||
| self._handle_config(data) | self._handle_config(data) | ||||
| @@ -510,6 +517,12 @@ class AD2USB(object): | |||||
| 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(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) | self._update_zone_tracker(message) | ||||
| def _update_zone_tracker(self, message): | def _update_zone_tracker(self, message): | ||||
| @@ -138,9 +138,9 @@ class ExpanderMessage(object): | |||||
| address, channel, value = values.split(',') | address, channel, value = values.split(',') | ||||
| self.raw = data | 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': | if header == '!EXP': | ||||
| self.type = ExpanderMessage.ZONE | self.type = ExpanderMessage.ZONE | ||||
| @@ -173,7 +173,7 @@ class RFMessage(object): | |||||
| """ | """ | ||||
| String conversion operator. | 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): | def _parse_message(self, data): | ||||
| """ | """ | ||||
| @@ -82,13 +82,14 @@ class Zonetracker(object): | |||||
| zone = self._expander_to_zone(int(message.address), int(message.channel)) | zone = self._expander_to_zone(int(message.address), int(message.channel)) | ||||
| status = Zone.CLEAR | status = Zone.CLEAR | ||||
| if int(message.value) == 1: | |||||
| if message.value == 1: | |||||
| status = Zone.FAULT | status = Zone.FAULT | ||||
| elif int(message.value) == 2: | |||||
| elif message.value == 2: | |||||
| status = Zone.CHECK | status = Zone.CHECK | ||||
| try: | try: | ||||
| self._update_zone(zone, status=status) | self._update_zone(zone, status=status) | ||||
| except IndexError: | except IndexError: | ||||
| self._add_zone(zone, status=status) | 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 | # of whether or not the 3-digit mode is enabled... so we have to pull it out of the | ||||
| # alpha message. | # alpha message. | ||||
| if zone == 191: | if zone == 191: | ||||
| # TODO: parse message text. | |||||
| zone_regex = re.compile('^CHECK (\d+).*$') | zone_regex = re.compile('^CHECK (\d+).*$') | ||||
| m = zone_regex.match(message.text) | m = zone_regex.match(message.text) | ||||
| @@ -127,6 +127,7 @@ class Zonetracker(object): | |||||
| if zone in self._zones_faulted: | if zone in self._zones_faulted: | ||||
| self._update_zone(zone) | self._update_zone(zone) | ||||
| self._clear_zones(zone) | self._clear_zones(zone) | ||||
| else: | else: | ||||
| status = Zone.FAULT | status = Zone.FAULT | ||||
| if message.check_zone: | if message.check_zone: | ||||
| @@ -106,6 +106,9 @@ def handle_panic(sender, args): | |||||
| def handle_rfx(sender, args): | def handle_rfx(sender, args): | ||||
| print 'RFX', args | print 'RFX', args | ||||
| def handle_relay(sender, args): | |||||
| print 'RELAY', args | |||||
| def upload_usb(): | def upload_usb(): | ||||
| dev = pyad2usb.ad2usb.devices.USBDevice() | dev = pyad2usb.ad2usb.devices.USBDevice() | ||||
| @@ -254,6 +257,7 @@ def test_socket(): | |||||
| a2u.on_zone_fault += handle_fault | a2u.on_zone_fault += handle_fault | ||||
| a2u.on_zone_restore += handle_restore | a2u.on_zone_restore += handle_restore | ||||
| a2u.on_rfx_message += handle_rfx | a2u.on_rfx_message += handle_rfx | ||||
| a2u.on_relay_changed += handle_relay | |||||
| # | # | ||||
| #a2u.on_fire += handle_fire | #a2u.on_fire += handle_fire | ||||
| #a2u.on_low_battery += handle_battery | #a2u.on_low_battery += handle_battery | ||||