Compare commits

...

1 Commits

Author SHA1 Message Date
Claude
16ec9f43c9 Fix flaky test in hydrawise by falling back to main coordinator data
When new zones/controllers are discovered by the main coordinator,
entities may be created for the water_use coordinator before it has
refreshed. This caused KeyError when accessing zones/controllers
that exist in the main coordinator but not yet in the water_use
coordinator's data.

The fix adds a _get_data() method that checks if the entity's
controller/zone exists in the current coordinator's data, and falls
back to the main coordinator's data if not. This also handles the
case when controllers/zones are removed - the entity gracefully
skips updating instead of raising KeyError.
2025-12-15 02:39:30 +00:00

View File

@@ -10,7 +10,11 @@ from homeassistant.helpers.entity import EntityDescription
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DOMAIN, MANUFACTURER, MODEL_ZONE
from .coordinator import HydrawiseDataUpdateCoordinator
from .coordinator import (
HydrawiseData,
HydrawiseDataUpdateCoordinator,
HydrawiseWaterUseDataUpdateCoordinator,
)
class HydrawiseEntity(CoordinatorEntity[HydrawiseDataUpdateCoordinator]):
@@ -50,11 +54,29 @@ class HydrawiseEntity(CoordinatorEntity[HydrawiseDataUpdateCoordinator]):
self._attr_device_info["via_device"] = (DOMAIN, str(controller.id))
self._update_attrs()
def _get_data(self) -> HydrawiseData:
"""Return coordinator data with fallback to main coordinator.
When new zones/controllers are discovered, entities may be created
before the water_use coordinator has refreshed. In this case, fall
back to the main coordinator's data which has the latest information.
"""
data: HydrawiseData = self.coordinator.data
if isinstance(self.coordinator, HydrawiseWaterUseDataUpdateCoordinator):
main_data = self.coordinator._main_coordinator.data # noqa: SLF001
# Check if this entity's controller/zone exists in current data
if (
self.controller.id not in data.controllers
or (self.zone_id is not None and self.zone_id not in data.zones)
):
data = main_data
return data
@property
def zone(self) -> Zone:
"""Return the entity zone."""
assert self.zone_id is not None # needed for mypy
return self.coordinator.data.zones[self.zone_id]
return self._get_data().zones[self.zone_id]
@property
def sensor(self) -> Sensor:
@@ -69,8 +91,10 @@ class HydrawiseEntity(CoordinatorEntity[HydrawiseDataUpdateCoordinator]):
@callback
def _handle_coordinator_update(self) -> None:
"""Get the latest data and updates the state."""
self.controller = self.coordinator.data.controllers[self.controller.id]
self._update_attrs()
data = self._get_data()
if self.controller.id in data.controllers:
self.controller = data.controllers[self.controller.id]
self._update_attrs()
super()._handle_coordinator_update()
@property