Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Switch support for Melnor Bluetooth water timer."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable, Coroutine
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from melnor_bluetooth.device import Valve
10 
12  SwitchDeviceClass,
13  SwitchEntity,
14  SwitchEntityDescription,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from .const import DOMAIN
21 from .coordinator import MelnorDataUpdateCoordinator
22 from .entity import MelnorZoneEntity, get_entities_for_valves
23 
24 
25 @dataclass(frozen=True, kw_only=True)
27  """Describes Melnor switch entity."""
28 
29  on_off_fn: Callable[[Valve, bool], Coroutine[Any, Any, None]]
30  state_fn: Callable[[Valve], Any]
31 
32 
33 ZONE_ENTITY_DESCRIPTIONS = [
35  device_class=SwitchDeviceClass.SWITCH,
36  key="manual",
37  translation_key="manual",
38  name=None,
39  on_off_fn=lambda valve, bool: valve.set_is_watering(bool),
40  state_fn=lambda valve: valve.is_watering,
41  ),
43  device_class=SwitchDeviceClass.SWITCH,
44  key="frequency",
45  translation_key="frequency",
46  on_off_fn=lambda valve, bool: valve.set_frequency_enabled(bool),
47  state_fn=lambda valve: valve.schedule_enabled,
48  ),
49 ]
50 
51 
53  hass: HomeAssistant,
54  config_entry: ConfigEntry,
55  async_add_entities: AddEntitiesCallback,
56 ) -> None:
57  """Set up the switch platform."""
58 
59  coordinator: MelnorDataUpdateCoordinator = hass.data[DOMAIN][config_entry.entry_id]
60 
62  get_entities_for_valves(
63  coordinator,
64  ZONE_ENTITY_DESCRIPTIONS,
65  lambda valve, description: MelnorZoneSwitch(
66  coordinator, description, valve
67  ),
68  )
69  )
70 
71 
73  """A switch implementation for a melnor device."""
74 
75  entity_description: MelnorSwitchEntityDescription
76 
77  def __init__(
78  self,
79  coordinator: MelnorDataUpdateCoordinator,
80  entity_description: MelnorSwitchEntityDescription,
81  valve: Valve,
82  ) -> None:
83  """Initialize a switch for a melnor device."""
84  super().__init__(coordinator, entity_description, valve)
85 
86  @property
87  def is_on(self) -> bool:
88  """Return true if device is on."""
89  return self.entity_descriptionentity_description.state_fn(self._valve_valve)
90 
91  async def async_turn_on(self, **kwargs: Any) -> None:
92  """Turn the device on."""
93  await self.entity_descriptionentity_description.on_off_fn(self._valve_valve, True)
94  self.async_write_ha_stateasync_write_ha_state()
95 
96  async def async_turn_off(self, **kwargs: Any) -> None:
97  """Turn the device off."""
98  await self.entity_descriptionentity_description.on_off_fn(self._valve_valve, False)
99  self.async_write_ha_stateasync_write_ha_state()
None __init__(self, MelnorDataUpdateCoordinator coordinator, MelnorSwitchEntityDescription entity_description, Valve valve)
Definition: switch.py:82
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:56