diff --git a/homeassistant/components/hydrawise/binary_sensor.py b/homeassistant/components/hydrawise/binary_sensor.py index 65355a1829f..0b12fcb3ddb 100644 --- a/homeassistant/components/hydrawise/binary_sensor.py +++ b/homeassistant/components/hydrawise/binary_sensor.py @@ -70,7 +70,7 @@ async def async_setup_entry( config_entry.entry_id ] entities = [] - for controller in coordinator.data.controllers: + for controller in coordinator.data.controllers.values(): entities.append( HydrawiseBinarySensor(coordinator, BINARY_SENSOR_STATUS, controller) ) diff --git a/homeassistant/components/hydrawise/coordinator.py b/homeassistant/components/hydrawise/coordinator.py index 412108f859f..71922928651 100644 --- a/homeassistant/components/hydrawise/coordinator.py +++ b/homeassistant/components/hydrawise/coordinator.py @@ -2,10 +2,11 @@ from __future__ import annotations +from dataclasses import dataclass from datetime import timedelta from pydrawise import HydrawiseBase -from pydrawise.schema import User +from pydrawise.schema import Controller, User, Zone from homeassistant.core import HomeAssistant from homeassistant.helpers.update_coordinator import DataUpdateCoordinator @@ -13,9 +14,20 @@ from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from .const import DOMAIN, LOGGER -class HydrawiseDataUpdateCoordinator(DataUpdateCoordinator[User]): +@dataclass +class HydrawiseData: + """Container for data fetched from the Hydrawise API.""" + + user: User + controllers: dict[int, Controller] + zones: dict[int, Zone] + + +class HydrawiseDataUpdateCoordinator(DataUpdateCoordinator[HydrawiseData]): """The Hydrawise Data Update Coordinator.""" + api: HydrawiseBase + def __init__( self, hass: HomeAssistant, api: HydrawiseBase, scan_interval: timedelta ) -> None: @@ -23,6 +35,13 @@ class HydrawiseDataUpdateCoordinator(DataUpdateCoordinator[User]): super().__init__(hass, LOGGER, name=DOMAIN, update_interval=scan_interval) self.api = api - async def _async_update_data(self) -> User: + async def _async_update_data(self) -> HydrawiseData: """Fetch the latest data from Hydrawise.""" - return await self.api.get_user() + user = await self.api.get_user() + controllers = {} + zones = {} + for controller in user.controllers: + controllers[controller.id] = controller + for zone in controller.zones: + zones[zone.id] = zone + return HydrawiseData(user=user, controllers=controllers, zones=zones) diff --git a/homeassistant/components/hydrawise/entity.py b/homeassistant/components/hydrawise/entity.py index c707690ce95..887de6ba648 100644 --- a/homeassistant/components/hydrawise/entity.py +++ b/homeassistant/components/hydrawise/entity.py @@ -48,5 +48,8 @@ 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] + if self.zone: + self.zone = self.coordinator.data.zones[self.zone.id] self._update_attrs() super()._handle_coordinator_update() diff --git a/homeassistant/components/hydrawise/sensor.py b/homeassistant/components/hydrawise/sensor.py index 79a318f778f..f8490ad00e1 100644 --- a/homeassistant/components/hydrawise/sensor.py +++ b/homeassistant/components/hydrawise/sensor.py @@ -76,7 +76,7 @@ async def async_setup_entry( ] async_add_entities( HydrawiseSensor(coordinator, description, controller, zone) - for controller in coordinator.data.controllers + for controller in coordinator.data.controllers.values() for zone in controller.zones for description in SENSOR_TYPES ) diff --git a/homeassistant/components/hydrawise/switch.py b/homeassistant/components/hydrawise/switch.py index 5a3a3a62895..8a92a56975a 100644 --- a/homeassistant/components/hydrawise/switch.py +++ b/homeassistant/components/hydrawise/switch.py @@ -81,7 +81,7 @@ async def async_setup_entry( ] async_add_entities( HydrawiseSwitch(coordinator, description, controller, zone) - for controller in coordinator.data.controllers + for controller in coordinator.data.controllers.values() for zone in controller.zones for description in SWITCH_TYPES )