|
|
@@ -5,15 +5,24 @@ Message representations received from the panel through the AD2 devices. |
|
|
|
""" |
|
|
|
|
|
|
|
import re |
|
|
|
from . import util |
|
|
|
from .util import InvalidMessageError |
|
|
|
|
|
|
|
class BaseMessage(object): |
|
|
|
""" |
|
|
|
Base class for messages. |
|
|
|
""" |
|
|
|
def __init__(self): |
|
|
|
""" |
|
|
|
Constructor |
|
|
|
""" |
|
|
|
self.raw = None |
|
|
|
|
|
|
|
def __str__(self): |
|
|
|
""" |
|
|
|
String conversion operator. |
|
|
|
""" |
|
|
|
return self.raw |
|
|
|
|
|
|
|
class Message(BaseMessage): |
|
|
|
""" |
|
|
|
Represents a message from the alarm panel. |
|
|
@@ -62,12 +71,12 @@ class Message(BaseMessage): |
|
|
|
:param data: The message data. |
|
|
|
:type data: str |
|
|
|
|
|
|
|
:raises: util.InvalidMessageError |
|
|
|
:raises: InvalidMessageError |
|
|
|
""" |
|
|
|
m = self._regex.match(data) |
|
|
|
|
|
|
|
if m is None: |
|
|
|
raise util.InvalidMessageError('Received invalid message: {0}'.format(data)) |
|
|
|
raise InvalidMessageError('Received invalid message: {0}'.format(data)) |
|
|
|
|
|
|
|
self.bitfield, self.numeric_code, self.panel_data, alpha = m.group(1, 2, 3, 4) |
|
|
|
self.mask = int(self.panel_data[3:3+8], 16) |
|
|
@@ -101,7 +110,7 @@ class Message(BaseMessage): |
|
|
|
""" |
|
|
|
String conversion operator. |
|
|
|
""" |
|
|
|
return 'msg > {0:0<9} [{1}{2}{3}] -- ({4}) {5}'.format(hex(self.mask), 1 if self.ready else 0, 1 if self.armed_away else 0, 1 if self.armed_home else 0, self.numeric_code, self.text) |
|
|
|
return self.raw |
|
|
|
|
|
|
|
class ExpanderMessage(BaseMessage): |
|
|
|
""" |
|
|
@@ -109,7 +118,9 @@ class ExpanderMessage(BaseMessage): |
|
|
|
""" |
|
|
|
|
|
|
|
ZONE = 0 |
|
|
|
"""Flag indicating that the expander message relates to a Zone Expander.""" |
|
|
|
RELAY = 1 |
|
|
|
"""Flag indicating that the expander message relates to a Relay Expander.""" |
|
|
|
|
|
|
|
def __init__(self, data=None): |
|
|
|
""" |
|
|
@@ -131,13 +142,7 @@ class ExpanderMessage(BaseMessage): |
|
|
|
""" |
|
|
|
String conversion operator. |
|
|
|
""" |
|
|
|
expander_type = 'UNKWN' |
|
|
|
if self.type == ExpanderMessage.ZONE: |
|
|
|
expander_type = 'ZONE' |
|
|
|
elif self.type == ExpanderMessage.RELAY: |
|
|
|
expander_type = 'RELAY' |
|
|
|
|
|
|
|
return 'exp > [{0: <5}] {1}/{2} -- {3}'.format(expander_type, self.address, self.channel, self.value) |
|
|
|
return self.raw |
|
|
|
|
|
|
|
def _parse_message(self, data): |
|
|
|
""" |
|
|
@@ -156,12 +161,14 @@ class ExpanderMessage(BaseMessage): |
|
|
|
self.value = int(value) |
|
|
|
|
|
|
|
except ValueError: |
|
|
|
raise util.InvalidMessageError('Received invalid message: {0}'.format(data)) |
|
|
|
raise InvalidMessageError('Received invalid message: {0}'.format(data)) |
|
|
|
|
|
|
|
if header == '!EXP': |
|
|
|
self.type = ExpanderMessage.ZONE |
|
|
|
elif header == '!REL': |
|
|
|
self.type = ExpanderMessage.RELAY |
|
|
|
else: |
|
|
|
raise InvalidMessageError('Unknown expander message header: {0}'.format(data)) |
|
|
|
|
|
|
|
class RFMessage(BaseMessage): |
|
|
|
""" |
|
|
@@ -189,7 +196,7 @@ class RFMessage(BaseMessage): |
|
|
|
""" |
|
|
|
String conversion operator. |
|
|
|
""" |
|
|
|
return 'rf > {0}: {1:x}'.format(self.serial_number, self.value) |
|
|
|
return self.raw |
|
|
|
|
|
|
|
def _parse_message(self, data): |
|
|
|
""" |
|
|
@@ -217,7 +224,7 @@ class RFMessage(BaseMessage): |
|
|
|
self.loop[3] = is_bit_set(8) |
|
|
|
|
|
|
|
except ValueError: |
|
|
|
raise util.InvalidMessageError('Received invalid message: {0}'.format(data)) |
|
|
|
raise InvalidMessageError('Received invalid message: {0}'.format(data)) |
|
|
|
|
|
|
|
|
|
|
|
class LRRMessage(BaseMessage): |
|
|
@@ -244,7 +251,7 @@ class LRRMessage(BaseMessage): |
|
|
|
""" |
|
|
|
String conversion operator. |
|
|
|
""" |
|
|
|
return 'lrr > {0} @ {1} -- {2}'.format(self.event_data, self.partition, self.event_type) |
|
|
|
return self.raw |
|
|
|
|
|
|
|
def _parse_message(self, data): |
|
|
|
""" |
|
|
@@ -260,4 +267,4 @@ class LRRMessage(BaseMessage): |
|
|
|
self.event_data, self.partition, self.event_type = values.split(',') |
|
|
|
|
|
|
|
except ValueError: |
|
|
|
raise util.InvalidMessageError('Received invalid message: {0}'.format(data)) |
|
|
|
raise InvalidMessageError('Received invalid message: {0}'.format(data)) |