@@ -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 | |||