Add flow and rain sensor support to Hydrawise (#116303)

* Add flow and rain sensor support to Hydrawise

* Address comments

* Cleanup

* Review comments

* Address review comments

* Added tests

* Add icon translations

* Add snapshot tests

* Clean up binary sensor

* Mypy cleanup

* Another mypy error

* Reviewer feedback

* Clear next_cycle sensor when the value is unknown

* Reviewer feedback

* Reviewer feedback

* Remove assert

* Restructure switches, sensors, and binary sensors

* Reviewer feedback

* Reviewer feedback
This commit is contained in:
Thomas Kistler 2024-05-07 12:26:10 -07:00 committed by GitHub
parent a3248ccff9
commit 14fcf7be8e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 1307 additions and 149 deletions

View file

@ -2,7 +2,7 @@
from __future__ import annotations
from pydrawise.schema import Controller, Zone
from pydrawise.schema import Controller, Sensor, Zone
from homeassistant.core import callback
from homeassistant.helpers.device_registry import DeviceInfo
@ -24,24 +24,42 @@ class HydrawiseEntity(CoordinatorEntity[HydrawiseDataUpdateCoordinator]):
coordinator: HydrawiseDataUpdateCoordinator,
description: EntityDescription,
controller: Controller,
zone: Zone | None = None,
*,
zone_id: int | None = None,
sensor_id: int | None = None,
) -> None:
"""Initialize the Hydrawise entity."""
super().__init__(coordinator=coordinator)
self.entity_description = description
self.controller = controller
self.zone = zone
self._device_id = str(controller.id if zone is None else zone.id)
self.zone_id = zone_id
self.sensor_id = sensor_id
self._device_id = str(zone_id) if zone_id is not None else str(controller.id)
self._attr_unique_id = f"{self._device_id}_{description.key}"
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, self._device_id)},
name=controller.name if zone is None else zone.name,
name=self.zone.name if zone_id is not None else controller.name,
model="Zone"
if zone_id is not None
else controller.hardware.model.description,
manufacturer=MANUFACTURER,
)
if zone is not None:
if zone_id is not None or sensor_id is not None:
self._attr_device_info["via_device"] = (DOMAIN, str(controller.id))
self._update_attrs()
@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]
@property
def sensor(self) -> Sensor:
"""Return the entity sensor."""
assert self.sensor_id is not None # needed for mypy
return self.coordinator.data.sensors[self.sensor_id]
def _update_attrs(self) -> None:
"""Update state attributes."""
return # pragma: no cover
@ -50,7 +68,5 @@ class HydrawiseEntity(CoordinatorEntity[HydrawiseDataUpdateCoordinator]):
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()