1 """Support for Hydrawise sprinkler sensors."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
7 from datetime
import timedelta
10 from pydrawise.schema
import ControllerWaterUseSummary
15 SensorEntityDescription,
23 from .const
import DOMAIN
24 from .coordinator
import HydrawiseUpdateCoordinators
25 from .entity
import HydrawiseEntity
28 @dataclass(frozen=True, kw_only=True)
30 """Describes Hydrawise binary sensor."""
32 value_fn: Callable[[HydrawiseSensor], Any]
36 return sensor.coordinator.data.daily_water_summary[sensor.controller.id]
39 WATER_USE_CONTROLLER_SENSORS: tuple[HydrawiseSensorEntityDescription, ...] = (
41 key=
"daily_active_water_time",
42 translation_key=
"daily_active_water_time",
43 device_class=SensorDeviceClass.DURATION,
44 native_unit_of_measurement=UnitOfTime.SECONDS,
47 ).total_active_time.total_seconds(),
52 WATER_USE_ZONE_SENSORS: tuple[HydrawiseSensorEntityDescription, ...] = (
54 key=
"daily_active_water_time",
55 translation_key=
"daily_active_water_time",
56 device_class=SensorDeviceClass.DURATION,
57 native_unit_of_measurement=UnitOfTime.SECONDS,
58 value_fn=
lambda sensor: (
60 .active_time_by_zone_id.get(sensor.zone.id,
timedelta())
66 FLOW_CONTROLLER_SENSORS: tuple[HydrawiseSensorEntityDescription, ...] = (
68 key=
"daily_total_water_use",
69 translation_key=
"daily_total_water_use",
70 device_class=SensorDeviceClass.VOLUME,
71 suggested_display_precision=1,
75 key=
"daily_active_water_use",
76 translation_key=
"daily_active_water_use",
77 device_class=SensorDeviceClass.VOLUME,
78 suggested_display_precision=1,
82 key=
"daily_inactive_water_use",
83 translation_key=
"daily_inactive_water_use",
84 device_class=SensorDeviceClass.VOLUME,
85 suggested_display_precision=1,
90 FLOW_ZONE_SENSORS: tuple[SensorEntityDescription, ...] = (
92 key=
"daily_active_water_use",
93 translation_key=
"daily_active_water_use",
94 device_class=SensorDeviceClass.VOLUME,
95 suggested_display_precision=1,
96 value_fn=
lambda sensor:
float(
97 _get_water_use(sensor).active_use_by_zone_id.get(sensor.zone.id, 0.0)
102 ZONE_SENSORS: tuple[HydrawiseSensorEntityDescription, ...] = (
105 translation_key=
"next_cycle",
106 device_class=SensorDeviceClass.TIMESTAMP,
107 value_fn=
lambda sensor: (
108 dt_util.as_utc(sensor.zone.scheduled_runs.next_run.start_time)
109 if sensor.zone.scheduled_runs.next_run
is not None
115 translation_key=
"watering_time",
116 native_unit_of_measurement=UnitOfTime.MINUTES,
117 value_fn=
lambda sensor: (
119 sensor.zone.scheduled_runs.current_run.remaining_time.total_seconds()
122 if sensor.zone.scheduled_runs.current_run
is not None
128 FLOW_MEASUREMENT_KEYS = [x.key
for x
in FLOW_CONTROLLER_SENSORS]
133 config_entry: ConfigEntry,
134 async_add_entities: AddEntitiesCallback,
136 """Set up the Hydrawise sensor platform."""
137 coordinators: HydrawiseUpdateCoordinators = hass.data[DOMAIN][config_entry.entry_id]
138 entities: list[HydrawiseSensor] = []
139 for controller
in coordinators.main.data.controllers.values():
142 for description
in WATER_USE_CONTROLLER_SENSORS
146 coordinators.water_use, description, controller, zone_id=zone.id
148 for zone
in controller.zones
149 for description
in WATER_USE_ZONE_SENSORS
152 HydrawiseSensor(coordinators.main, description, controller, zone_id=zone.id)
153 for zone
in controller.zones
154 for description
in ZONE_SENSORS
157 coordinators.water_use.data.daily_water_summary[controller.id].total_use
163 for description
in FLOW_CONTROLLER_SENSORS
167 coordinators.water_use,
172 for zone
in controller.zones
173 for description
in FLOW_ZONE_SENSORS
179 """A sensor implementation for Hydrawise device."""
181 entity_description: HydrawiseSensorEntityDescription
185 """Return the unit_of_measurement of the sensor."""
186 if self.
entity_descriptionentity_description.device_class != SensorDeviceClass.VOLUME:
190 if self.coordinator.data.user.units.units_name ==
"imperial"
191 else UnitOfVolume.LITERS
196 """Icon of the entity based on the value."""
199 and self.
entity_descriptionentity_description.device_class == SensorDeviceClass.VOLUME
202 return "mdi:water-outline"
206 """Update state attributes."""
str|None native_unit_of_measurement(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
ControllerWaterUseSummary _get_water_use(HydrawiseSensor sensor)