فهرست منبع

Fix UniFi sensor showing stale state on startup

Subscribes to EVENT_COMPONENT_LOADED in UnifiAvailableSensor so it
self-updates when the unifi component finishes loading, rather than
waiting for the next coordinator refresh. Also extends _with_defaults
coverage to override records in the coordinator.
ZiB 4 ماه پیش
والد
کامیت
4008d4855b
2فایلهای تغییر یافته به همراه20 افزوده شده و 6 حذف شده
  1. 13 1
      custom_components/room_cal_ha/binary_sensor.py
  2. 7 5
      custom_components/room_cal_ha/coordinator.py

+ 13 - 1
custom_components/room_cal_ha/binary_sensor.py

@@ -4,7 +4,8 @@ from datetime import timedelta
 
 from homeassistant.components.binary_sensor import BinarySensorEntity
 from homeassistant.config_entries import ConfigEntry
-from homeassistant.core import HomeAssistant
+from homeassistant.const import EVENT_COMPONENT_LOADED
+from homeassistant.core import Event, HomeAssistant, callback
 from homeassistant.helpers.device_registry import DeviceInfo
 from homeassistant.helpers.entity_platform import AddEntitiesCallback
 from homeassistant.helpers.update_coordinator import CoordinatorEntity
@@ -89,6 +90,17 @@ class UnifiAvailableSensor(CoordinatorEntity[RoomCalCoordinator], BinarySensorEn
     self._attr_unique_id = f"{entry.entry_id}_unifi_available"
     self._attr_device_info = device_info
 
+  async def async_added_to_hass(self) -> None:
+    await super().async_added_to_hass()
+    self.async_on_remove(
+      self.hass.bus.async_listen(EVENT_COMPONENT_LOADED, self._handle_component_loaded)
+    )
+
+  @callback
+  def _handle_component_loaded(self, event: Event) -> None:
+    if event.data.get("component") == UNIFI_DOMAIN:
+      self.async_write_ha_state()
+
   @property
   def is_on(self) -> bool:
     for config_entry in self.hass.config_entries.async_loaded_entries(UNIFI_DOMAIN):

+ 7 - 5
custom_components/room_cal_ha/coordinator.py

@@ -105,9 +105,11 @@ class RoomCalCoordinator(DataUpdateCoordinator[CoordinatorData]):
     store_next = self._with_defaults(self.store.get(STORE_NEXT))
 
     if self._override is not None:
-      displayed_next = self._override.next if self._override.next is not None else store_next
+      displayed_next = (
+        self._with_defaults(self._override.next) if self._override.next is not None else store_next
+      )
       return CoordinatorData(
-        current=self._override.current,
+        current=self._with_defaults(self._override.current),
         next=displayed_next,
         current_last_refresh=self._current_last_refresh,
         next_last_refresh=self._next_last_refresh,
@@ -285,11 +287,11 @@ class RoomCalCoordinator(DataUpdateCoordinator[CoordinatorData]):
     self._override = override
     self.cancel_mode_sync()
     displayed_next = (
-      override.next if override.next is not None
-      else self.store.get(STORE_NEXT) or self._empty_reservation()
+      self._with_defaults(override.next) if override.next is not None
+      else self._with_defaults(self.store.get(STORE_NEXT) or self._empty_reservation())
     )
     self.async_set_updated_data(CoordinatorData(
-      current=override.current,
+      current=self._with_defaults(override.current),
       next=displayed_next,
       current_last_refresh=self._current_last_refresh,
       next_last_refresh=self._next_last_refresh,