1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
"""
Primary system for handling LRR events.
.. moduleauthor:: Scott Petersen <scott@nutech.com>
"""
from .events import LRR_EVENT_TYPE, LRR_EVENT_STATUS, LRR_CID_EVENT, LRR_DATA_TYPE
from .events import LRR_FIRE_EVENTS, LRR_POWER_EVENTS, LRR_BYPASS_EVENTS, LRR_BATTERY_EVENTS, \
LRR_PANIC_EVENTS, LRR_ARM_EVENTS, LRR_STAY_EVENTS, LRR_ALARM_EVENTS
class LRRSystem(object):
"""
Handles LRR events and triggers higher-level events in the AlarmDecoder object.
"""
def __init__(self, alarmdecoder_object):
"""
Constructor
:param alarmdecoder_object: Main AlarmDecoder object
:type alarmdecoder_object: :py:class:`~alarmdecoder.AlarmDecoder`
"""
self._alarmdecoder = alarmdecoder_object
def update(self, message):
"""
Updates the states in the primary AlarmDecoder object based on
the LRR message provided.
:param message: LRR message object
:type message: :py:class:`~alarmdecoder.messages.LRRMessage`
"""
# Firmware version < 2.2a.8.6
if message.version == 1:
if message.event_type == 'ALARM_PANIC':
self._alarmdecoder._update_panic_status(True)
elif message.event_type == 'CANCEL':
self._alarmdecoder._update_panic_status(False)
# Firmware version >= 2.2a.8.6
elif message.version == 2:
source = message.event_source
if source == LRR_EVENT_TYPE.CID:
self._handle_cid_message(message)
elif source == LRR_EVENT_TYPE.DSC:
self._handle_dsc_message(message)
elif source == LRR_EVENT_TYPE.ADEMCO:
self._handle_ademco_message(message)
elif source == LRR_EVENT_TYPE.ALARMDECODER:
self._handle_alarmdecoder_message(message)
elif source == LRR_EVENT_TYPE.UNKNOWN:
self._handle_unknown_message(message)
else:
pass
def _handle_cid_message(self, message):
"""
Handles ContactID LRR events.
:param message: LRR message object
:type message: :py:class:`~alarmdecoder.messages.LRRMessage`
"""
status = self._get_event_status(message)
if status is None:
return
if message.event_code in LRR_FIRE_EVENTS:
if message.event_code == LRR_CID_EVENT.OPENCLOSE_CANCEL_BY_USER:
status = False
self._alarmdecoder._update_fire_status(status=status)
if message.event_code in LRR_ALARM_EVENTS:
kwargs = {}
field_name = 'zone'
if not status:
field_name = 'user'
kwargs[field_name] = int(message.event_data)
self._alarmdecoder._update_alarm_status(status=status, **kwargs)
if message.event_code in LRR_POWER_EVENTS:
self._alarmdecoder._update_power_status(status=status)
if message.event_code in LRR_BYPASS_EVENTS:
self._alarmdecoder._update_zone_bypass_status(status=status, zone=int(message.event_data))
if message.event_code in LRR_BATTERY_EVENTS:
self._alarmdecoder._update_battery_status(status=status)
if message.event_code in LRR_PANIC_EVENTS:
if message.event_code == LRR_CID_EVENT.OPENCLOSE_CANCEL_BY_USER:
status = False
self._alarmdecoder._update_panic_status(status=status)
if message.event_code in LRR_ARM_EVENTS:
# NOTE: status on OPENCLOSE messages is backwards.
status_stay = (message.event_status == LRR_EVENT_STATUS.RESTORE \
and message.event_code in LRR_STAY_EVENTS)
if status_stay:
status = False
else:
status = not status
self._alarmdecoder._update_armed_status(status=status, status_stay=status_stay)
def _handle_dsc_message(self, message):
"""
Handles DSC LRR events.
:param message: LRR message object
:type message: :py:class:`~alarmdecoder.messages.LRRMessage`
"""
pass
def _handle_ademco_message(self, message):
"""
Handles ADEMCO LRR events.
:param message: LRR message object
:type message: :py:class:`~alarmdecoder.messages.LRRMessage`
"""
pass
def _handle_alarmdecoder_message(self, message):
"""
Handles AlarmDecoder LRR events.
:param message: LRR message object
:type message: :py:class:`~alarmdecoder.messages.LRRMessage`
"""
pass
def _handle_unknown_message(self, message):
"""
Handles UNKNOWN LRR events.
:param message: LRR message object
:type message: :py:class:`~alarmdecoder.messages.LRRMessage`
"""
# TODO: Log this somewhere useful.
pass
def _get_event_status(self, message):
"""
Retrieves the boolean status of an LRR message.
:param message: LRR message object
:type message: :py:class:`~alarmdecoder.messages.LRRMessage`
:returns: Boolean indicating whether the event was triggered or restored.
"""
status = None
if message.event_status == LRR_EVENT_STATUS.TRIGGER:
status = True
elif message.event_status == LRR_EVENT_STATUS.RESTORE:
status = False
return status
|