Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """The Flexit Nordic (BACnet) integration."""
2 
3 import asyncio.exceptions
4 from collections.abc import Awaitable, Callable
5 from dataclasses import dataclass
6 from typing import Any
7 
8 from flexit_bacnet import FlexitBACnet
9 from flexit_bacnet.bacnet import DecodingError
10 
12  SwitchDeviceClass,
13  SwitchEntity,
14  SwitchEntityDescription,
15 )
16 from homeassistant.config_entries import ConfigEntry
17 from homeassistant.core import HomeAssistant
18 from homeassistant.exceptions import HomeAssistantError
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 
21 from . import FlexitCoordinator
22 from .const import DOMAIN
23 from .entity import FlexitEntity
24 
25 
26 @dataclass(kw_only=True, frozen=True)
28  """Describes a Flexit switch entity."""
29 
30  is_on_fn: Callable[[FlexitBACnet], bool]
31  turn_on_fn: Callable[[FlexitBACnet], Awaitable[None]]
32  turn_off_fn: Callable[[FlexitBACnet], Awaitable[None]]
33 
34 
35 SWITCHES: tuple[FlexitSwitchEntityDescription, ...] = (
37  key="electric_heater",
38  translation_key="electric_heater",
39  is_on_fn=lambda data: data.electric_heater,
40  turn_on_fn=lambda data: data.enable_electric_heater(),
41  turn_off_fn=lambda data: data.disable_electric_heater(),
42  ),
43 )
44 
45 
47  hass: HomeAssistant,
48  config_entry: ConfigEntry,
49  async_add_entities: AddEntitiesCallback,
50 ) -> None:
51  """Set up Flexit (bacnet) switch from a config entry."""
52  coordinator: FlexitCoordinator = hass.data[DOMAIN][config_entry.entry_id]
53 
55  FlexitSwitch(coordinator, description) for description in SWITCHES
56  )
57 
58 
60  """Representation of a Flexit Switch."""
61 
62  _attr_device_class = SwitchDeviceClass.SWITCH
63 
64  entity_description: FlexitSwitchEntityDescription
65 
66  def __init__(
67  self,
68  coordinator: FlexitCoordinator,
69  entity_description: FlexitSwitchEntityDescription,
70  ) -> None:
71  """Initialize Flexit (bacnet) switch."""
72  super().__init__(coordinator)
73 
74  self.entity_descriptionentity_description = entity_description
75  self._attr_unique_id_attr_unique_id = (
76  f"{coordinator.device.serial_number}-{entity_description.key}"
77  )
78 
79  @property
80  def is_on(self) -> bool:
81  """Return value of the switch."""
82  return self.entity_descriptionentity_description.is_on_fn(self.coordinator.data)
83 
84  async def async_turn_on(self, **kwargs: Any) -> None:
85  """Turn electric heater on."""
86  try:
87  await self.entity_descriptionentity_description.turn_on_fn(self.coordinator.data)
88  except (asyncio.exceptions.TimeoutError, ConnectionError, DecodingError) as exc:
89  raise HomeAssistantError from exc
90  finally:
91  await self.coordinator.async_refresh()
92 
93  async def async_turn_off(self, **kwargs: Any) -> None:
94  """Turn electric heater off."""
95  try:
96  await self.entity_descriptionentity_description.turn_off_fn(self.coordinator.data)
97  except (asyncio.exceptions.TimeoutError, ConnectionError, DecodingError) as exc:
98  raise HomeAssistantError from exc
99  finally:
100  await self.coordinator.async_refresh()
None __init__(self, FlexitCoordinator coordinator, FlexitSwitchEntityDescription entity_description)
Definition: switch.py:70
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:50