From eb4a44535c3d29c71b36f8f7c2e8c7f36ef005e1 Mon Sep 17 00:00:00 2001 From: Jonathan Keljo Date: Tue, 11 Dec 2018 02:34:03 -0800 Subject: [PATCH] Enable alarmdecoder to see open/close state of bypassed RF zones when armed (#18477) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Enable alarmdecoder to see open/close state of bypassed zones when armed The alarmdecoder component already reported RF state bits as attributes. If the user knows which loop is set up for the zone in the alarm panel, they can use that information to tell whether the zone is open or closed even when the system is armed by monitoring the appropriate attribute. That’s awkward, so this commit enables the user to simply configure which loop is used and the component will update the state itself. * Simplify, also it's more correct to treat it as a state change rather than a permanent state, since it's possible the decoder might miss some events. * Remove relative import --- homeassistant/components/alarmdecoder.py | 3 +++ .../components/binary_sensor/alarmdecoder.py | 11 ++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/alarmdecoder.py b/homeassistant/components/alarmdecoder.py index 1377b2a6c3a..92eab728210 100644 --- a/homeassistant/components/alarmdecoder.py +++ b/homeassistant/components/alarmdecoder.py @@ -32,6 +32,7 @@ CONF_DEVICE_TYPE = 'type' CONF_PANEL_DISPLAY = 'panel_display' CONF_ZONE_NAME = 'name' CONF_ZONE_TYPE = 'type' +CONF_ZONE_LOOP = 'loop' CONF_ZONE_RFID = 'rfid' CONF_ZONES = 'zones' CONF_RELAY_ADDR = 'relayaddr' @@ -75,6 +76,8 @@ ZONE_SCHEMA = vol.Schema({ vol.Optional(CONF_ZONE_TYPE, default=DEFAULT_ZONE_TYPE): vol.Any(DEVICE_CLASSES_SCHEMA), vol.Optional(CONF_ZONE_RFID): cv.string, + vol.Optional(CONF_ZONE_LOOP): + vol.All(vol.Coerce(int), vol.Range(min=1, max=4)), vol.Inclusive(CONF_RELAY_ADDR, 'relaylocation', 'Relay address and channel must exist together'): cv.byte, vol.Inclusive(CONF_RELAY_CHAN, 'relaylocation', diff --git a/homeassistant/components/binary_sensor/alarmdecoder.py b/homeassistant/components/binary_sensor/alarmdecoder.py index f7a42e9b831..d8fddeaa540 100644 --- a/homeassistant/components/binary_sensor/alarmdecoder.py +++ b/homeassistant/components/binary_sensor/alarmdecoder.py @@ -9,7 +9,7 @@ import logging from homeassistant.components.binary_sensor import BinarySensorDevice from homeassistant.components.alarmdecoder import ( ZONE_SCHEMA, CONF_ZONES, CONF_ZONE_NAME, CONF_ZONE_TYPE, - CONF_ZONE_RFID, SIGNAL_ZONE_FAULT, SIGNAL_ZONE_RESTORE, + CONF_ZONE_RFID, CONF_ZONE_LOOP, SIGNAL_ZONE_FAULT, SIGNAL_ZONE_RESTORE, SIGNAL_RFX_MESSAGE, SIGNAL_REL_MESSAGE, CONF_RELAY_ADDR, CONF_RELAY_CHAN) @@ -37,10 +37,12 @@ def setup_platform(hass, config, add_entities, discovery_info=None): zone_type = device_config_data[CONF_ZONE_TYPE] zone_name = device_config_data[CONF_ZONE_NAME] zone_rfid = device_config_data.get(CONF_ZONE_RFID) + zone_loop = device_config_data.get(CONF_ZONE_LOOP) relay_addr = device_config_data.get(CONF_RELAY_ADDR) relay_chan = device_config_data.get(CONF_RELAY_CHAN) device = AlarmDecoderBinarySensor( - zone_num, zone_name, zone_type, zone_rfid, relay_addr, relay_chan) + zone_num, zone_name, zone_type, zone_rfid, zone_loop, relay_addr, + relay_chan) devices.append(device) add_entities(devices) @@ -51,7 +53,7 @@ def setup_platform(hass, config, add_entities, discovery_info=None): class AlarmDecoderBinarySensor(BinarySensorDevice): """Representation of an AlarmDecoder binary sensor.""" - def __init__(self, zone_number, zone_name, zone_type, zone_rfid, + def __init__(self, zone_number, zone_name, zone_type, zone_rfid, zone_loop, relay_addr, relay_chan): """Initialize the binary_sensor.""" self._zone_number = zone_number @@ -59,6 +61,7 @@ class AlarmDecoderBinarySensor(BinarySensorDevice): self._state = None self._name = zone_name self._rfid = zone_rfid + self._loop = zone_loop self._rfstate = None self._relay_addr = relay_addr self._relay_chan = relay_chan @@ -128,6 +131,8 @@ class AlarmDecoderBinarySensor(BinarySensorDevice): """Update RF state.""" if self._rfid and message and message.serial_number == self._rfid: self._rfstate = message.value + if self._loop: + self._state = 1 if message.loop[self._loop - 1] else 0 self.schedule_update_ha_state() def _rel_message_callback(self, message):