From e8913be7893a07d21c24ff8de11455415da7a309 Mon Sep 17 00:00:00 2001 From: Scott Petersen Date: Tue, 13 Jun 2017 13:14:18 -0700 Subject: [PATCH] Added support for old-style messages in the LRRSystem. --- .gitignore | 1 + alarmdecoder/decoder.py | 10 -------- alarmdecoder/messages/lrr/message.py | 28 ++++++++++++++++++---- alarmdecoder/messages/lrr/system.py | 36 ++++++++++++++++++---------- 4 files changed, 47 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index 8a9acf8..b658468 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ tmp *.egg-info bin/ad2-test *~ +.vscode diff --git a/alarmdecoder/decoder.py b/alarmdecoder/decoder.py index 021bd4f..e3e4843 100644 --- a/alarmdecoder/decoder.py +++ b/alarmdecoder/decoder.py @@ -458,17 +458,7 @@ class AlarmDecoder(object): """ msg = LRRMessage(data) - # if msg.event_type == 'ALARM_PANIC': - # self._panic_status = True - # self.on_panic(status=True) - # - # elif msg.event_type == 'CANCEL': - # if self._panic_status is True: - # self._panic_status = False - # self.on_panic(status=False) - self._lrr_system.update(msg) - self.on_lrr_message(message=msg) return msg diff --git a/alarmdecoder/messages/lrr/message.py b/alarmdecoder/messages/lrr/message.py index 3da409e..c6c786e 100644 --- a/alarmdecoder/messages/lrr/message.py +++ b/alarmdecoder/messages/lrr/message.py @@ -14,6 +14,7 @@ from ...util import InvalidMessageError from .events import LRR_EVENT_TYPE + class LRRMessage(BaseMessage): """ Represent a message from a Long Range Radio or emulated Long Range Radio. @@ -25,12 +26,14 @@ class LRRMessage(BaseMessage): """The partition that this message applies to.""" event_type = None """The type of the event that occurred.""" + version = 0 + """LRR message version""" report_code = 0xFF """The report code used to override the last two digits of the event type.""" event_prefix = '' """Extracted prefix for the event_type.""" - event_source = 0 + event_source = LRR_EVENT_TYPE.UNKNOWN """Extracted event type source.""" event_status = 0 """Event status flag that represents triggered or restored events.""" @@ -65,21 +68,21 @@ class LRRMessage(BaseMessage): values = values.split(',') if len(values) <= 3: self.event_data, self.partition, self.event_type = values + self.version = 1 else: self.event_data, self.partition, self.event_type, self.report_code = values + self.version = 2 event_type_data = self.event_type.split('_') self.event_prefix = event_type_data[0] - if self.event_prefix == 'CID': - self.event_source = LRR_EVENT_TYPE.CID + self.event_source = _get_event_source(self.event_prefix) self.event_status = int(event_type_data[1][0]) self.event_code = int(event_type_data[1][1:], 16) - self.partition = int(self.partition) - except ValueError: raise InvalidMessageError('Received invalid message: {0}'.format(data)) + def dict(self, **kwargs): """ Dictionary representation. @@ -96,3 +99,18 @@ class LRRMessage(BaseMessage): event_code = hex(self.event_code), **kwargs ) + + +def _get_event_source(prefix): + source = LRR_EVENT_TYPE.UNKNOWN + + if prefix == 'CID': + source = LRR_EVENT_TYPE.CID + elif prefix == 'DSC': + source = LRR_EVENT_TYPE.DSC + elif prefix == 'AD2': + source = LRR_EVENT_TYPE.ALARMDECODER + elif prefix == 'ADEMCO': + source = LRR_EVENT_TYPE.ADEMCO + + return source diff --git a/alarmdecoder/messages/lrr/system.py b/alarmdecoder/messages/lrr/system.py index 1c09844..1f21cbe 100644 --- a/alarmdecoder/messages/lrr/system.py +++ b/alarmdecoder/messages/lrr/system.py @@ -13,19 +13,29 @@ class LRRSystem(object): print("LRR Message: {0}".format(message.dict())) - source = message.event_source - if source == LRR_EVENT_TYPE.CID: - handled = self._handle_cid_message(message) - elif source == LRR_EVENT_TYPE.DSC: - handled = self._handle_dsc_message(message) - elif source == LRR_EVENT_TYPE.ADEMCO: - handled = self._handle_ademco_message(message) - elif source == LRR_EVENT_TYPE.ALARMDECODER: - handled = self._handle_alarmdecoder_message(message) - elif source == LRR_EVENT_TYPE.UNKNOWN: - handled = self._handle_unknown_message(message) - else: - pass + if message.version == 1: + if msg.event_type == 'ALARM_PANIC': + self._alarmdecoder._update_panic_status(True) + handled = True + + elif msg.event_type == 'CANCEL': + self._alarmdecoder._update_panic_status(False) + handled = True + + elif message.version == 2: + source = message.event_source + if source == LRR_EVENT_TYPE.CID: + handled = self._handle_cid_message(message) + elif source == LRR_EVENT_TYPE.DSC: + handled = self._handle_dsc_message(message) + elif source == LRR_EVENT_TYPE.ADEMCO: + handled = self._handle_ademco_message(message) + elif source == LRR_EVENT_TYPE.ALARMDECODER: + handled = self._handle_alarmdecoder_message(message) + elif source == LRR_EVENT_TYPE.UNKNOWN: + handled = self._handle_unknown_message(message) + else: + pass return handled