Home Assistant Unofficial Reference 2024.12.1
select.py
Go to the documentation of this file.
1 """Support for Huawei LTE selects."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from functools import partial
8 import logging
9 
10 from huawei_lte_api.enums.net import LTEBandEnum, NetworkBandEnum, NetworkModeEnum
11 
13  DOMAIN as SELECT_DOMAIN,
14  SelectEntity,
15  SelectEntityDescription,
16 )
17 from homeassistant.config_entries import ConfigEntry
18 from homeassistant.const import EntityCategory
19 from homeassistant.core import HomeAssistant
20 from homeassistant.helpers.entity import Entity
21 from homeassistant.helpers.entity_platform import AddEntitiesCallback
22 from homeassistant.helpers.typing import UNDEFINED
23 
24 from . import Router
25 from .const import DOMAIN, KEY_NET_NET_MODE
26 from .entity import HuaweiLteBaseEntityWithDevice
27 
28 _LOGGER = logging.getLogger(__name__)
29 
30 
31 @dataclass(frozen=True, kw_only=True)
33  """Class describing Huawei LTE select entities."""
34 
35  setter_fn: Callable[[str], None]
36 
37 
39  hass: HomeAssistant,
40  config_entry: ConfigEntry,
41  async_add_entities: AddEntitiesCallback,
42 ) -> None:
43  """Set up from config entry."""
44  router = hass.data[DOMAIN].routers[config_entry.entry_id]
45  selects: list[Entity] = []
46 
48  key=KEY_NET_NET_MODE,
49  entity_category=EntityCategory.CONFIG,
50  name="Preferred network mode",
51  translation_key="preferred_network_mode",
52  options=[
53  NetworkModeEnum.MODE_AUTO.value,
54  NetworkModeEnum.MODE_4G_3G_AUTO.value,
55  NetworkModeEnum.MODE_4G_2G_AUTO.value,
56  NetworkModeEnum.MODE_4G_ONLY.value,
57  NetworkModeEnum.MODE_3G_2G_AUTO.value,
58  NetworkModeEnum.MODE_3G_ONLY.value,
59  NetworkModeEnum.MODE_2G_ONLY.value,
60  ],
61  setter_fn=partial(
62  router.client.net.set_net_mode,
63  LTEBandEnum.ALL,
64  NetworkBandEnum.ALL,
65  ),
66  )
67  selects.append(
69  router,
70  entity_description=desc,
71  key=desc.key,
72  item="NetworkMode",
73  )
74  )
75 
76  async_add_entities(selects, True)
77 
78 
80  """Huawei LTE select entity."""
81 
82  entity_description: HuaweiSelectEntityDescription
83  _raw_state: str | None = None
84 
85  def __init__(
86  self,
87  router: Router,
88  entity_description: HuaweiSelectEntityDescription,
89  key: str,
90  item: str,
91  ) -> None:
92  """Initialize."""
93  super().__init__(router)
94  self.entity_descriptionentity_description = entity_description
95  self.keykey = key
96  self.itemitem = item
97 
98  name = None
99  if self.entity_descriptionentity_description.name != UNDEFINED:
100  name = self.entity_descriptionentity_description.name
101  self._attr_name_attr_name = name or self.itemitem
102 
103  def select_option(self, option: str) -> None:
104  """Change the selected option."""
105  self.entity_descriptionentity_description.setter_fn(option)
106 
107  @property
108  def current_option(self) -> str | None:
109  """Return current option."""
110  return self._raw_state_raw_state
111 
112  @property
113  def _device_unique_id(self) -> str:
114  return f"{self.key}.{self.item}"
115 
116  async def async_added_to_hass(self) -> None:
117  """Subscribe to needed data on add."""
118  await super().async_added_to_hass()
119  self.routerrouter.subscriptions[self.keykey].append(f"{SELECT_DOMAIN}/{self.item}")
120 
121  async def async_will_remove_from_hass(self) -> None:
122  """Unsubscribe from needed data on remove."""
123  await super().async_will_remove_from_hass()
124  self.routerrouter.subscriptions[self.keykey].remove(f"{SELECT_DOMAIN}/{self.item}")
125 
126  async def async_update(self) -> None:
127  """Update state."""
128  try:
129  value = self.routerrouter.data[self.keykey][self.itemitem]
130  except KeyError:
131  _LOGGER.debug("%s[%s] not in data", self.keykey, self.itemitem)
132  self._available_available_available = False
133  return
134  self._available_available_available = True
135  self._raw_state_raw_state = str(value)
None __init__(self, Router router, HuaweiSelectEntityDescription entity_description, str key, str item)
Definition: select.py:91
bool remove(self, _T matcher)
Definition: match.py:214
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: select.py:42