diff --git a/alarmdecoder/decoder.py b/alarmdecoder/decoder.py index eb50337..bac9b63 100644 --- a/alarmdecoder/decoder.py +++ b/alarmdecoder/decoder.py @@ -578,7 +578,7 @@ class AlarmDecoder(object): return self._power_status - def _update_alarm_status(self, message): + def _update_alarm_status(self, message=None, status=None, zone=None, user=None): """ Uses the provided message to update the alarm state. @@ -588,18 +588,29 @@ class AlarmDecoder(object): :returns: bool indicating the new status """ - if message.alarm_sounding != self._alarm_status: - self._alarm_status, old_status = message.alarm_sounding, self._alarm_status + alarm_status = status + alarm_zone = zone + if isinstance(message, Message): + alarm_status = message.alarm_sounding + try: + alarm_zone = int(message.numeric_code) + except ValueError: + alarm_zone = int(message.numeric_code, 16) - if old_status is not None: + print("_update_alarm_status: status={} zone={} user={}".format(alarm_status, alarm_zone, user)) + + if alarm_status != self._alarm_status: + self._alarm_status, old_status = alarm_status, self._alarm_status + + if old_status is not None or status is not None: if self._alarm_status: - self.on_alarm(zone=message.numeric_code) + self.on_alarm(zone=alarm_zone) else: - self.on_alarm_restored(zone=message.numeric_code) + self.on_alarm_restored(zone=alarm_zone, user=user) return self._alarm_status - def _update_zone_bypass_status(self, message=None, status=None): + def _update_zone_bypass_status(self, message=None, status=None, zone=None): """ Uses the provided message to update the zone bypass state. @@ -609,8 +620,13 @@ class AlarmDecoder(object): :returns: bool indicating the new status """ bypass_status = status + bypass_zone = zone if isinstance(message, Message): bypass_status = message.zone_bypassed + try: + bypass_zone = int(message.numeric_code) + except ValueError: + bypass_zone = int(message.numeric_code, 16) if bypass_status is None: return @@ -618,8 +634,8 @@ class AlarmDecoder(object): if bypass_status != self._bypass_status: self._bypass_status, old_status = bypass_status, self._bypass_status - if old_status is not None: - self.on_bypass(status=self._bypass_status) + if old_status is not None or message is None: + self.on_bypass(status=self._bypass_status, zone=bypass_zone) return self._bypass_status @@ -639,6 +655,8 @@ class AlarmDecoder(object): arm_status = message.armed_away stay_status = message.armed_home + print("_update_armed_status: status={} status_stay={} - arm_status={} stay_status={}".format(status, status_stay, arm_status, stay_status)) + if arm_status is None or stay_status is None: return @@ -694,7 +712,7 @@ class AlarmDecoder(object): fire_status = message.fire_alarm last_status, last_update = self._fire_status - print("_update_fire_status: fire_status={fire_status} last_status={last_status} last_update={last_update}".format(fire_status=fire_status, last_status=last_status, last_update=last_update)) + #print("_update_fire_status: fire_status={fire_status} last_status={last_status} last_update={last_update}".format(fire_status=fire_status, last_status=last_status, last_update=last_update)) if self._fire_state == FireState.NONE: diff --git a/alarmdecoder/messages/lrr/events.py b/alarmdecoder/messages/lrr/events.py index acd357b..3c154d6 100644 --- a/alarmdecoder/messages/lrr/events.py +++ b/alarmdecoder/messages/lrr/events.py @@ -681,6 +681,29 @@ LRR_FIRE_EVENTS = [ LRR_CID_EVENT.OPENCLOSE_CANCEL_BY_USER ] +LRR_ALARM_EVENTS = [ + LRR_CID_EVENT.BURGLARY, + LRR_CID_EVENT.BURGLARY_PERIMETER, + LRR_CID_EVENT.BURGLARY_INTERIOR, + LRR_CID_EVENT.BURGLARY_AUX, + LRR_CID_EVENT.BURGLARY_ENTRYEXIT, + LRR_CID_EVENT.BURGLARY_DAYNIGHT, + LRR_CID_EVENT.BURGLARY_OUTDOOR, + LRR_CID_EVENT.ALARM_GENERAL, + LRR_CID_EVENT.BURGLARY_SILENT, + LRR_CID_EVENT.ALARM_AUX, + LRR_CID_EVENT.ALARM_GAS_DETECTED, + LRR_CID_EVENT.ALARM_REFRIDGERATION, + LRR_CID_EVENT.ALARM_LOSS_OF_HEAT, + LRR_CID_EVENT.ALARM_WATER_LEAKAGE, + LRR_CID_EVENT.ALARM_LOW_BOTTLED_GAS_LEVEL, + LRR_CID_EVENT.ALARM_HIGH_TEMP, + LRR_CID_EVENT.ALARM_LOW_TEMP, + LRR_CID_EVENT.ALARM_LOSS_OF_AIR_FLOW, + LRR_CID_EVENT.ALARM_CARBON_MONOXIDE, + LRR_CID_EVENT.OPENCLOSE_CANCEL_BY_USER +] + LRR_POWER_EVENTS = [ LRR_CID_EVENT.TROUBLE_AC_LOSS ] diff --git a/alarmdecoder/messages/lrr/system.py b/alarmdecoder/messages/lrr/system.py index ad4ecde..40defcc 100644 --- a/alarmdecoder/messages/lrr/system.py +++ b/alarmdecoder/messages/lrr/system.py @@ -1,7 +1,7 @@ from .events import LRR_EVENT_TYPE, LRR_EVENT_STATUS, LRR_CID_EVENT 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_PANIC_EVENTS, LRR_ARM_EVENTS, LRR_STAY_EVENTS, LRR_ALARM_EVENTS class LRRSystem(object): @@ -51,16 +51,26 @@ class LRRSystem(object): if message.event_code == LRR_CID_EVENT.OPENCLOSE_CANCEL_BY_USER: status = False - print("FIRE, status={}".format(status)) self._alarmdecoder._update_fire_status(status=status) handled = True + 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) + handled = True + if message.event_code in LRR_POWER_EVENTS: self._alarmdecoder._update_power_status(status=status) handled = True if message.event_code in LRR_BYPASS_EVENTS: - self._alarmdecoder._update_zone_bypass_status(status=status) + zone = int(message.event_data) + self._alarmdecoder._update_zone_bypass_status(status=status, zone=zone) handled = True if message.event_code in LRR_BATTERY_EVENTS: