Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Support for Rituals Perfume Genie switches."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Awaitable, Callable
6 from dataclasses import dataclass
7 from typing import Any
8 
9 from pyrituals import Diffuser
10 
11 from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.core import HomeAssistant, callback
14 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 
16 from .const import DOMAIN
17 from .coordinator import RitualsDataUpdateCoordinator
18 from .entity import DiffuserEntity
19 
20 
21 @dataclass(frozen=True, kw_only=True)
23  """Class describing Rituals switch entities."""
24 
25  is_on_fn: Callable[[Diffuser], bool]
26  turn_on_fn: Callable[[Diffuser], Awaitable[None]]
27  turn_off_fn: Callable[[Diffuser], Awaitable[None]]
28 
29 
30 ENTITY_DESCRIPTIONS = (
32  key="is_on",
33  name=None,
34  translation_key="fan",
35  is_on_fn=lambda diffuser: diffuser.is_on,
36  turn_on_fn=lambda diffuser: diffuser.turn_on(),
37  turn_off_fn=lambda diffuser: diffuser.turn_off(),
38  ),
39 )
40 
41 
43  hass: HomeAssistant,
44  config_entry: ConfigEntry,
45  async_add_entities: AddEntitiesCallback,
46 ) -> None:
47  """Set up the diffuser switch."""
48  coordinators: dict[str, RitualsDataUpdateCoordinator] = hass.data[DOMAIN][
49  config_entry.entry_id
50  ]
51 
53  RitualsSwitchEntity(coordinator, description)
54  for coordinator in coordinators.values()
55  for description in ENTITY_DESCRIPTIONS
56  )
57 
58 
60  """Representation of a diffuser switch."""
61 
62  entity_description: RitualsSwitchEntityDescription
63 
64  def __init__(
65  self,
66  coordinator: RitualsDataUpdateCoordinator,
67  description: RitualsSwitchEntityDescription,
68  ) -> None:
69  """Initialize the diffuser switch."""
70  super().__init__(coordinator, description)
71  self._attr_is_on_attr_is_on = description.is_on_fn(coordinator.diffuser)
72 
73  async def async_turn_on(self, **kwargs: Any) -> None:
74  """Turn the switch on."""
75  await self.entity_descriptionentity_description.turn_on_fn(self.coordinator.diffuser)
76  self._attr_is_on_attr_is_on = True
77  self.async_write_ha_stateasync_write_ha_state()
78 
79  async def async_turn_off(self, **kwargs: Any) -> None:
80  """Turn the switch off."""
81  await self.entity_descriptionentity_description.turn_off_fn(self.coordinator.diffuser)
82  self._attr_is_on_attr_is_on = False
83  self.async_write_ha_stateasync_write_ha_state()
84 
85  @callback
86  def _handle_coordinator_update(self) -> None:
87  """Handle updated data from the coordinator."""
88  self._attr_is_on_attr_is_on = self.entity_descriptionentity_description.is_on_fn(self.coordinator.diffuser)
None __init__(self, RitualsDataUpdateCoordinator coordinator, RitualsSwitchEntityDescription description)
Definition: switch.py:68
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:46