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