Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Switch entity for myUplink."""
2 
3 from typing import Any
4 
5 import aiohttp
6 from myuplink import DevicePoint
7 
8 from homeassistant.components.switch import SwitchEntity, SwitchEntityDescription
9 from homeassistant.const import Platform
10 from homeassistant.core import HomeAssistant
11 from homeassistant.exceptions import HomeAssistantError
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 
14 from . import MyUplinkConfigEntry, MyUplinkDataCoordinator
15 from .const import F_SERIES
16 from .entity import MyUplinkEntity
17 from .helpers import find_matching_platform, skip_entity, transform_model_series
18 
19 CATEGORY_BASED_DESCRIPTIONS: dict[str, dict[str, SwitchEntityDescription]] = {
20  F_SERIES: {
21  "50004": SwitchEntityDescription(
22  key="temporary_lux",
23  translation_key="temporary_lux",
24  ),
25  "50005": SwitchEntityDescription(
26  key="boost_ventilation",
27  translation_key="boost_ventilation",
28  ),
29  },
30  "NIBEF": {
31  "50004": SwitchEntityDescription(
32  key="temporary_lux",
33  translation_key="temporary_lux",
34  ),
35  "50005": SwitchEntityDescription(
36  key="boost_ventilation",
37  translation_key="boost_ventilation",
38  ),
39  },
40 }
41 
42 
43 def get_description(device_point: DevicePoint) -> SwitchEntityDescription | None:
44  """Get description for a device point.
45 
46  Priorities:
47  1. Category specific prefix e.g "NIBEF"
48  2. Default to None
49  """
50  prefix, _, _ = device_point.category.partition(" ")
51  prefix = transform_model_series(prefix)
52  return CATEGORY_BASED_DESCRIPTIONS.get(prefix, {}).get(device_point.parameter_id)
53 
54 
56  hass: HomeAssistant,
57  config_entry: MyUplinkConfigEntry,
58  async_add_entities: AddEntitiesCallback,
59 ) -> None:
60  """Set up myUplink switch."""
61  entities: list[SwitchEntity] = []
62  coordinator = config_entry.runtime_data
63 
64  # Setup device point switches
65  for device_id, point_data in coordinator.data.points.items():
66  for point_id, device_point in point_data.items():
67  if skip_entity(device_point.category, device_point):
68  continue
69  if find_matching_platform(device_point) == Platform.SWITCH:
70  description = get_description(device_point)
71 
72  entities.append(
74  coordinator=coordinator,
75  device_id=device_id,
76  device_point=device_point,
77  entity_description=description,
78  unique_id_suffix=point_id,
79  )
80  )
81 
82  async_add_entities(entities)
83 
84 
86  """Representation of a myUplink device point switch."""
87 
88  def __init__(
89  self,
90  coordinator: MyUplinkDataCoordinator,
91  device_id: str,
92  device_point: DevicePoint,
93  entity_description: SwitchEntityDescription | None,
94  unique_id_suffix: str,
95  ) -> None:
96  """Initialize the switch."""
97  super().__init__(
98  coordinator=coordinator,
99  device_id=device_id,
100  unique_id_suffix=unique_id_suffix,
101  )
102 
103  # Internal properties
104  self.point_idpoint_id = device_point.parameter_id
105  self._attr_name_attr_name = device_point.parameter_name
106 
107  if entity_description is not None:
108  self.entity_descriptionentity_description = entity_description
109 
110  @property
111  def is_on(self) -> bool:
112  """Switch state value."""
113  device_point = self.coordinator.data.points[self.device_iddevice_id][self.point_idpoint_id]
114  return int(device_point.value) != 0
115 
116  async def async_turn_on(self, **kwargs: Any) -> None:
117  """Turn on switch."""
118  await self._async_turn_switch_async_turn_switch(1)
119 
120  async def async_turn_off(self, **kwargs: Any) -> None:
121  """Turn off switch."""
122  await self._async_turn_switch_async_turn_switch(0)
123 
124  async def _async_turn_switch(self, mode: int) -> None:
125  """Set switch mode."""
126  try:
127  await self.coordinator.api.async_set_device_points(
128  self.device_iddevice_id, data={self.point_idpoint_id: mode}
129  )
130  except aiohttp.ClientError as err:
131  raise HomeAssistantError(
132  f"Failed to set state for {self.entity_id}"
133  ) from err
134 
135  await self.coordinator.async_request_refresh()
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88