Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Support for LaMetric 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 demetriek import Device, LaMetricDevice
10 
11 from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
12 from homeassistant.config_entries import ConfigEntry
13 from homeassistant.const import EntityCategory
14 from homeassistant.core import HomeAssistant
15 from homeassistant.helpers.entity_platform import AddEntitiesCallback
16 
17 from .const import DOMAIN
18 from .coordinator import LaMetricDataUpdateCoordinator
19 from .entity import LaMetricEntity
20 from .helpers import lametric_exception_handler
21 
22 
23 @dataclass(frozen=True, kw_only=True)
25  """Class describing LaMetric switch entities."""
26 
27  available_fn: Callable[[Device], bool] = lambda device: True
28  is_on_fn: Callable[[Device], bool]
29  set_fn: Callable[[LaMetricDevice, bool], Awaitable[Any]]
30 
31 
32 SWITCHES = [
34  key="bluetooth",
35  translation_key="bluetooth",
36  entity_category=EntityCategory.CONFIG,
37  available_fn=lambda device: device.bluetooth.available,
38  is_on_fn=lambda device: device.bluetooth.active,
39  set_fn=lambda api, active: api.bluetooth(active=active),
40  ),
41 ]
42 
43 
45  hass: HomeAssistant,
46  entry: ConfigEntry,
47  async_add_entities: AddEntitiesCallback,
48 ) -> None:
49  """Set up LaMetric switch based on a config entry."""
50  coordinator: LaMetricDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
53  coordinator=coordinator,
54  description=description,
55  )
56  for description in SWITCHES
57  )
58 
59 
61  """Representation of a LaMetric switch."""
62 
63  entity_description: LaMetricSwitchEntityDescription
64 
65  def __init__(
66  self,
67  coordinator: LaMetricDataUpdateCoordinator,
68  description: LaMetricSwitchEntityDescription,
69  ) -> None:
70  """Initiate LaMetric Switch."""
71  super().__init__(coordinator)
72  self.entity_descriptionentity_description = description
73  self._attr_unique_id_attr_unique_id = f"{coordinator.data.serial_number}-{description.key}"
74 
75  @property
76  def available(self) -> bool:
77  """Return if entity is available."""
78  return super().available and self.entity_descriptionentity_description.available_fn(
79  self.coordinator.data
80  )
81 
82  @property
83  def is_on(self) -> bool:
84  """Return state of the switch."""
85  return self.entity_descriptionentity_description.is_on_fn(self.coordinator.data)
86 
87  @lametric_exception_handler
88  async def async_turn_on(self, **kwargs: Any) -> None:
89  """Turn the entity on."""
90  await self.entity_descriptionentity_description.set_fn(self.coordinator.lametric, True)
91  await self.coordinator.async_request_refresh()
92 
93  @lametric_exception_handler
94  async def async_turn_off(self, **kwargs: Any) -> None:
95  """Turn the entity off."""
96  await self.entity_descriptionentity_description.set_fn(self.coordinator.lametric, False)
97  await self.coordinator.async_request_refresh()
None __init__(self, LaMetricDataUpdateCoordinator coordinator, LaMetricSwitchEntityDescription description)
Definition: switch.py:69
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:48