Procházet zdrojové kódy

Seed door sensor state at startup from existing HA state

ZiB před 4 měsíci
rodič
revize
570c168012

+ 9 - 0
custom_components/zlock_slots/coordinator.py

@@ -148,6 +148,15 @@ class ZLockCoordinator(DataUpdateCoordinator[dict[str, LockState]]):
       self._handle_alarm_state_change,
     )
 
+    # async_track_state_change_event only fires on changes; seed door_open from
+    # whatever state the sensor already has if it published before we loaded.
+    for sensor_eid, lock_eid in self._door_sensor_to_lock.items():
+      state = self.hass.states.get(sensor_eid)
+      if state and state.state in ("on", "off"):
+        self.data[lock_eid].door_open = state.state == "on"
+    if self._door_sensor_to_lock:
+      self.async_update_listeners()
+
   def async_teardown(self) -> None:
     if self._unsub_event:
       self._unsub_event()

+ 34 - 0
tests/test_door_sensor.py

@@ -92,6 +92,40 @@ async def test_door_open_initially_none(hass, door_coord):
   assert door_coord.data[LOCK_ENTITY_ID].door_open is None
 
 
+async def test_door_open_seeded_from_existing_state_at_startup(hass, mock_node):
+  """Sensor state already published before integration loads — no change event fires."""
+  hass.states.async_set(DOOR_SENSOR_ENTITY, "off")
+  entry = _door_config_entry()
+  entry.add_to_hass(hass)
+  with patch(_ZWAVE_HELPER, return_value=mock_node):
+    c = ZLockCoordinator(hass, entry)
+    await c.async_setup()
+  assert c.data[LOCK_ENTITY_ID].door_open is False
+  c.async_teardown()
+
+
+async def test_door_open_seeded_open_at_startup(hass, mock_node):
+  hass.states.async_set(DOOR_SENSOR_ENTITY, "on")
+  entry = _door_config_entry()
+  entry.add_to_hass(hass)
+  with patch(_ZWAVE_HELPER, return_value=mock_node):
+    c = ZLockCoordinator(hass, entry)
+    await c.async_setup()
+  assert c.data[LOCK_ENTITY_ID].door_open is True
+  c.async_teardown()
+
+
+async def test_door_unavailable_at_startup_not_seeded(hass, mock_node):
+  hass.states.async_set(DOOR_SENSOR_ENTITY, "unavailable")
+  entry = _door_config_entry()
+  entry.add_to_hass(hass)
+  with patch(_ZWAVE_HELPER, return_value=mock_node):
+    c = ZLockCoordinator(hass, entry)
+    await c.async_setup()
+  assert c.data[LOCK_ENTITY_ID].door_open is None
+  c.async_teardown()
+
+
 async def test_door_sensor_not_tracked_without_config(hass, mock_node):
   entry = MockConfigEntry(
     domain=DOMAIN,