Avoid retriggering HomeKit doorbells on forced updates (#74141)

This commit is contained in:
J. Nick Koston 2022-06-28 19:54:27 -05:00 committed by GitHub
parent ee6866b8a3
commit 629c68221e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 71 additions and 8 deletions

View file

@ -642,11 +642,15 @@ async def test_camera_with_linked_motion_sensor(hass, run_driver, events):
assert char
assert char.value is True
broker = MagicMock()
char.broker = broker
hass.states.async_set(
motion_entity_id, STATE_OFF, {ATTR_DEVICE_CLASS: BinarySensorDeviceClass.MOTION}
)
await hass.async_block_till_done()
assert len(broker.mock_calls) == 2
broker.reset_mock()
assert char.value is False
char.set_value(True)
@ -654,8 +658,28 @@ async def test_camera_with_linked_motion_sensor(hass, run_driver, events):
motion_entity_id, STATE_ON, {ATTR_DEVICE_CLASS: BinarySensorDeviceClass.MOTION}
)
await hass.async_block_till_done()
assert len(broker.mock_calls) == 2
broker.reset_mock()
assert char.value is True
hass.states.async_set(
motion_entity_id,
STATE_ON,
{ATTR_DEVICE_CLASS: BinarySensorDeviceClass.MOTION},
force_update=True,
)
await hass.async_block_till_done()
assert len(broker.mock_calls) == 0
broker.reset_mock()
hass.states.async_set(
motion_entity_id,
STATE_ON,
{ATTR_DEVICE_CLASS: BinarySensorDeviceClass.MOTION, "other": "attr"},
)
await hass.async_block_till_done()
assert len(broker.mock_calls) == 0
broker.reset_mock()
# Ensure we do not throw when the linked
# motion sensor is removed
hass.states.async_remove(motion_entity_id)
@ -747,7 +771,8 @@ async def test_camera_with_linked_doorbell_sensor(hass, run_driver, events):
assert service2
char2 = service.get_characteristic(CHAR_PROGRAMMABLE_SWITCH_EVENT)
assert char2
broker = MagicMock()
char2.broker = broker
assert char2.value is None
hass.states.async_set(
@ -758,9 +783,12 @@ async def test_camera_with_linked_doorbell_sensor(hass, run_driver, events):
await hass.async_block_till_done()
assert char.value is None
assert char2.value is None
assert len(broker.mock_calls) == 0
char.set_value(True)
char2.set_value(True)
broker.reset_mock()
hass.states.async_set(
doorbell_entity_id,
STATE_ON,
@ -769,6 +797,31 @@ async def test_camera_with_linked_doorbell_sensor(hass, run_driver, events):
await hass.async_block_till_done()
assert char.value is None
assert char2.value is None
assert len(broker.mock_calls) == 2
broker.reset_mock()
hass.states.async_set(
doorbell_entity_id,
STATE_ON,
{ATTR_DEVICE_CLASS: BinarySensorDeviceClass.OCCUPANCY},
force_update=True,
)
await hass.async_block_till_done()
assert char.value is None
assert char2.value is None
assert len(broker.mock_calls) == 0
broker.reset_mock()
hass.states.async_set(
doorbell_entity_id,
STATE_ON,
{ATTR_DEVICE_CLASS: BinarySensorDeviceClass.OCCUPANCY, "other": "attr"},
)
await hass.async_block_till_done()
assert char.value is None
assert char2.value is None
assert len(broker.mock_calls) == 0
broker.reset_mock()
# Ensure we do not throw when the linked
# doorbell sensor is removed