Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Switch platform for Habitica integration."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from enum import StrEnum
8 from typing import Any
9 
11  SwitchDeviceClass,
12  SwitchEntity,
13  SwitchEntityDescription,
14 )
15 from homeassistant.core import HomeAssistant
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 
18 from .coordinator import HabiticaData, HabiticaDataUpdateCoordinator
19 from .entity import HabiticaBase
20 from .types import HabiticaConfigEntry
21 
22 PARALLEL_UPDATES = 1
23 
24 
25 @dataclass(kw_only=True, frozen=True)
27  """Describes Habitica switch entity."""
28 
29  turn_on_fn: Callable[[HabiticaDataUpdateCoordinator], Any]
30  turn_off_fn: Callable[[HabiticaDataUpdateCoordinator], Any]
31  is_on_fn: Callable[[HabiticaData], bool]
32 
33 
34 class HabiticaSwitchEntity(StrEnum):
35  """Habitica switch entities."""
36 
37  SLEEP = "sleep"
38 
39 
40 SWTICH_DESCRIPTIONS: tuple[HabiticaSwitchEntityDescription, ...] = (
42  key=HabiticaSwitchEntity.SLEEP,
43  translation_key=HabiticaSwitchEntity.SLEEP,
44  device_class=SwitchDeviceClass.SWITCH,
45  turn_on_fn=lambda coordinator: coordinator.api["user"]["sleep"].post(),
46  turn_off_fn=lambda coordinator: coordinator.api["user"]["sleep"].post(),
47  is_on_fn=lambda data: data.user["preferences"]["sleep"],
48  ),
49 )
50 
51 
53  hass: HomeAssistant,
54  entry: HabiticaConfigEntry,
55  async_add_entities: AddEntitiesCallback,
56 ) -> None:
57  """Set up switches from a config entry."""
58 
59  coordinator = entry.runtime_data
60 
62  HabiticaSwitch(coordinator, description) for description in SWTICH_DESCRIPTIONS
63  )
64 
65 
67  """Representation of a Habitica Switch."""
68 
69  entity_description: HabiticaSwitchEntityDescription
70 
71  @property
72  def is_on(self) -> bool | None:
73  """Return the state of the device."""
74  return self.entity_descriptionentity_description.is_on_fn(
75  self.coordinator.data,
76  )
77 
78  async def async_turn_on(self, **kwargs: Any) -> None:
79  """Turn the entity on."""
80 
81  await self.coordinator.execute(self.entity_descriptionentity_description.turn_on_fn)
82 
83  async def async_turn_off(self, **kwargs: Any) -> None:
84  """Turn the entity off."""
85 
86  await self.coordinator.execute(self.entity_descriptionentity_description.turn_off_fn)
None execute(self, Callable[[HabiticaDataUpdateCoordinator], Any] func)
Definition: coordinator.py:75
web.Response post(self, web.Request request, str config_key)
Definition: view.py:101
None async_setup_entry(HomeAssistant hass, HabiticaConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:56