diff --git a/homeassistant/components/lock/zwave.py b/homeassistant/components/lock/zwave.py index 49f5d4c74e9..77afe688c2e 100644 --- a/homeassistant/components/lock/zwave.py +++ b/homeassistant/components/lock/zwave.py @@ -32,6 +32,7 @@ POLYCONTROL_DANALOCK_V2_BTZE_LOCK = (POLYCONTROL, DANALOCK_V2_BTZE) WORKAROUND_V2BTZE = 1 WORKAROUND_DEVICE_STATE = 2 WORKAROUND_TRACK_MESSAGE = 4 +WORKAROUND_ALARM_TYPE = 8 DEVICE_MAPPINGS = { POLYCONTROL_DANALOCK_V2_BTZE_LOCK: WORKAROUND_V2BTZE, @@ -43,7 +44,7 @@ DEVICE_MAPPINGS = { (0x0129, 0xAA00): WORKAROUND_DEVICE_STATE, (0x0129, 0x0000): WORKAROUND_DEVICE_STATE, # Yale YRD220 (as reported by adrum in PR #17386) - (0x0109, 0x0000): WORKAROUND_DEVICE_STATE, + (0x0109, 0x0000): WORKAROUND_DEVICE_STATE | WORKAROUND_ALARM_TYPE, # Schlage BE469 (0x003B, 0x5044): WORKAROUND_DEVICE_STATE | WORKAROUND_TRACK_MESSAGE, # Schlage FE599NX @@ -237,6 +238,7 @@ class ZwaveLock(zwave.ZWaveDeviceEntity, LockDevice): self._state_workaround = False self._track_message_workaround = False self._previous_message = None + self._alarm_type_workaround = False # Enable appropriate workaround flags for our device # Make sure that we have values for the key before converting to int @@ -257,6 +259,10 @@ class ZwaveLock(zwave.ZWaveDeviceEntity, LockDevice): if workaround & WORKAROUND_TRACK_MESSAGE: self._track_message_workaround = True _LOGGER.debug("Message tracking workaround enabled") + if workaround & WORKAROUND_ALARM_TYPE: + self._alarm_type_workaround = True + _LOGGER.debug( + "Alarm Type device state workaround enabled") self.update_properties() def update_properties(self): @@ -311,6 +317,12 @@ class ZwaveLock(zwave.ZWaveDeviceEntity, LockDevice): if not alarm_type: return + + if self._alarm_type_workaround: + self._state = LOCK_STATUS.get(str(alarm_type)) + _LOGGER.debug("workaround: lock state set to %s -- alarm type: %s", + self._state, str(alarm_type)) + if alarm_type == 21: self._lock_status = '{}{}'.format( LOCK_ALARM_TYPE.get(str(alarm_type)), diff --git a/tests/components/lock/test_zwave.py b/tests/components/lock/test_zwave.py index 484e4796759..07095e4fe3e 100644 --- a/tests/components/lock/test_zwave.py +++ b/tests/components/lock/test_zwave.py @@ -143,6 +143,47 @@ def test_v2btze_value_changed(mock_openzwave): assert device.is_locked +def test_alarm_type_workaround(mock_openzwave): + """Test value changed for Z-Wave lock using alarm type.""" + node = MockNode(manufacturer_id='0109', product_id='0000') + values = MockEntityValues( + primary=MockValue(data=True, node=node), + access_control=None, + alarm_type=MockValue(data=16, node=node), + alarm_level=None, + ) + device = zwave.get_device(node=node, values=values) + assert not device.is_locked + + values.alarm_type.data = 18 + value_changed(values.alarm_type) + assert device.is_locked + + values.alarm_type.data = 19 + value_changed(values.alarm_type) + assert not device.is_locked + + values.alarm_type.data = 21 + value_changed(values.alarm_type) + assert device.is_locked + + values.alarm_type.data = 22 + value_changed(values.alarm_type) + assert not device.is_locked + + values.alarm_type.data = 24 + value_changed(values.alarm_type) + assert device.is_locked + + values.alarm_type.data = 25 + value_changed(values.alarm_type) + assert not device.is_locked + + values.alarm_type.data = 27 + value_changed(values.alarm_type) + assert device.is_locked + + def test_lock_access_control(mock_openzwave): """Test access control for Z-Wave lock.""" node = MockNode()