1
0
mirror of https://github.com/home-assistant/core.git synced 2026-06-04 06:34:28 +01:00
Files
core/homeassistant/components/hydrawise/switch.py
T
2026-04-30 21:14:48 +02:00

107 lines
3.5 KiB
Python

"""Support for Hydrawise cloud switches."""
from collections.abc import Callable, Coroutine, Iterable
from dataclasses import dataclass
from datetime import timedelta
from typing import Any
from pydrawise import Controller, HydrawiseBase, Zone
from homeassistant.components.switch import (
SwitchDeviceClass,
SwitchEntity,
SwitchEntityDescription,
)
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.util import dt as dt_util
from .const import DEFAULT_WATERING_TIME
from .coordinator import HydrawiseConfigEntry
from .entity import HydrawiseEntity
PARALLEL_UPDATES = 1
@dataclass(frozen=True, kw_only=True)
class HydrawiseSwitchEntityDescription(SwitchEntityDescription):
"""Describes Hydrawise binary sensor."""
turn_on_fn: Callable[[HydrawiseBase, Zone], Coroutine[Any, Any, None]]
turn_off_fn: Callable[[HydrawiseBase, Zone], Coroutine[Any, Any, None]]
value_fn: Callable[[Zone], bool]
SWITCH_TYPES: tuple[HydrawiseSwitchEntityDescription, ...] = (
HydrawiseSwitchEntityDescription(
key="auto_watering",
translation_key="auto_watering",
device_class=SwitchDeviceClass.SWITCH,
value_fn=lambda zone: zone.status.suspended_until is None,
turn_on_fn=lambda api, zone: api.resume_zone(zone),
turn_off_fn=lambda api, zone: api.suspend_zone(
zone, dt_util.now() + timedelta(days=365)
),
),
HydrawiseSwitchEntityDescription(
key="manual_watering",
translation_key="manual_watering",
device_class=SwitchDeviceClass.SWITCH,
value_fn=lambda zone: zone.scheduled_runs.current_run is not None,
turn_on_fn=lambda api, zone: api.start_zone(
zone,
custom_run_duration=int(DEFAULT_WATERING_TIME.total_seconds()),
),
turn_off_fn=lambda api, zone: api.stop_zone(zone),
),
)
SWITCH_KEYS: list[str] = [desc.key for desc in SWITCH_TYPES]
async def async_setup_entry(
hass: HomeAssistant,
config_entry: HydrawiseConfigEntry,
async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
"""Set up the Hydrawise switch platform."""
coordinators = config_entry.runtime_data
def _add_new_zones(zones: Iterable[tuple[Zone, Controller]]) -> None:
async_add_entities(
HydrawiseSwitch(coordinators.main, description, controller, zone_id=zone.id)
for zone, controller in zones
for description in SWITCH_TYPES
)
_add_new_zones(
[
(zone, coordinators.main.data.zone_id_to_controller[zone.id])
for zone in coordinators.main.data.zones.values()
]
)
coordinators.main.new_zones_callbacks.append(_add_new_zones)
class HydrawiseSwitch(HydrawiseEntity, SwitchEntity):
"""A switch implementation for Hydrawise device."""
entity_description: HydrawiseSwitchEntityDescription
zone: Zone
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn the device on."""
await self.entity_description.turn_on_fn(self.coordinator.api, self.zone)
self._attr_is_on = True
self.async_write_ha_state()
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the device off."""
await self.entity_description.turn_off_fn(self.coordinator.api, self.zone)
self._attr_is_on = False
self.async_write_ha_state()
def _update_attrs(self) -> None:
"""Update state attributes."""
self._attr_is_on = self.entity_description.value_fn(self.zone)