Home Assistant Unofficial Reference 2024.12.1
select.py
Go to the documentation of this file.
1 """Select entity for myUplink."""
2 
3 from typing import cast
4 
5 from aiohttp import ClientError
6 from myuplink import DevicePoint
7 
8 from homeassistant.components.select import SelectEntity, SelectEntityDescription
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 .entity import MyUplinkEntity
16 from .helpers import find_matching_platform, skip_entity
17 
18 
20  hass: HomeAssistant,
21  config_entry: MyUplinkConfigEntry,
22  async_add_entities: AddEntitiesCallback,
23 ) -> None:
24  """Set up myUplink select."""
25  entities: list[SelectEntity] = []
26  coordinator: MyUplinkDataCoordinator = config_entry.runtime_data
27 
28  # Setup device point select entities
29  for device_id, point_data in coordinator.data.points.items():
30  for point_id, device_point in point_data.items():
31  if skip_entity(device_point.category, device_point):
32  continue
33  description = None
34  if find_matching_platform(device_point, description) == Platform.SELECT:
35  entities.append(
37  coordinator=coordinator,
38  device_id=device_id,
39  device_point=device_point,
40  entity_description=description,
41  unique_id_suffix=point_id,
42  )
43  )
44 
45  async_add_entities(entities)
46 
47 
49  """Representation of a myUplink select entity."""
50 
51  def __init__(
52  self,
53  coordinator: MyUplinkDataCoordinator,
54  device_id: str,
55  device_point: DevicePoint,
56  entity_description: SelectEntityDescription | None,
57  unique_id_suffix: str,
58  ) -> None:
59  """Initialize the select."""
60  super().__init__(
61  coordinator=coordinator,
62  device_id=device_id,
63  unique_id_suffix=unique_id_suffix,
64  )
65 
66  # Internal properties
67  self.point_idpoint_id = device_point.parameter_id
68  self._attr_name_attr_name = device_point.parameter_name
69 
70  self._attr_options_attr_options = [x["text"].capitalize() for x in device_point.enum_values]
71  self.options_mapoptions_map = {
72  str(int(x["value"])): x["text"].capitalize()
73  for x in device_point.enum_values
74  }
75  self.options_revoptions_rev = {value: key for key, value in self.options_mapoptions_map.items()}
76 
77  @property
78  def current_option(self) -> str | None:
79  """Retrieve currently selected option."""
80  device_point = self.coordinator.data.points[self.device_iddevice_id][self.point_idpoint_id]
81  value = int(cast(int, device_point.value_t))
82  return self.options_mapoptions_map.get(str(value))
83 
84  async def async_select_option(self, option: str) -> None:
85  """Set the current option."""
86  try:
87  await self.coordinator.api.async_set_device_points(
88  self.device_iddevice_id, data={self.point_idpoint_id: str(self.options_revoptions_rev[option])}
89  )
90  except ClientError as err:
91  raise HomeAssistantError(
92  f"Failed to set new option {self.options_rev[option]} for {self.point_id}/{self.entity_id}"
93  ) from err
94 
95  await self.coordinator.async_request_refresh()
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88