1 """Support for Homekit select entities."""
3 from __future__
import annotations
5 from dataclasses
import dataclass
6 from enum
import IntEnum
8 from aiohomekit.model.characteristics
import Characteristic, CharacteristicsTypes
9 from aiohomekit.model.characteristics.const
import (
10 TargetAirPurifierStateValues,
11 TemperatureDisplayUnits,
21 from .
import KNOWN_DEVICES
22 from .connection
import HKDevice
23 from .entity
import CharacteristicEntity
26 @dataclass(frozen=True, kw_only=True)
28 """A generic description of a select entity backed by a single characteristic."""
30 choices: dict[str, IntEnum]
31 name: str |
None =
None
34 SELECT_ENTITIES: dict[str, HomeKitSelectEntityDescription] = {
36 key=
"temperature_display_units",
37 translation_key=
"temperature_display_units",
38 name=
"Temperature Display Units",
39 entity_category=EntityCategory.CONFIG,
41 "celsius": TemperatureDisplayUnits.CELSIUS,
42 "fahrenheit": TemperatureDisplayUnits.FAHRENHEIT,
46 key=
"air_purifier_state_target",
47 translation_key=
"air_purifier_state_target",
48 name=
"Air Purifier Mode",
49 entity_category=EntityCategory.CONFIG,
51 "automatic": TargetAirPurifierStateValues.AUTOMATIC,
52 "manual": TargetAirPurifierStateValues.MANUAL,
57 _ECOBEE_MODE_TO_TEXT = {
62 _ECOBEE_MODE_TO_NUMBERS = {v: k
for (k, v)
in _ECOBEE_MODE_TO_TEXT.items()}
66 """Base entity for select entities backed by a single characteristics."""
69 class HomeKitSelect(BaseHomeKitSelect):
70 """Representation of a select control on a homekit accessory."""
72 entity_description: HomeKitSelectEntityDescription
79 description: HomeKitSelectEntityDescription,
81 """Initialise a HomeKit select control."""
94 """Define the homekit characteristics the entity cares about."""
95 return [self.
_char_char.type]
98 def name(self) -> str | None:
99 """Return the name of the device if any."""
101 return f
"{name} {self.entity_description.name}"
106 """Return the current selected option."""
110 """Set the current option."""
117 """Represents a ecobee mode select entity."""
119 _attr_options = [
"home",
"sleep",
"away"]
120 _attr_translation_key =
"ecobee_mode"
124 """Return the name of the device if any."""
125 if name := super().name:
126 return f
"{name} Current Mode"
127 return "Current Mode"
130 """Define the homekit characteristics the entity cares about."""
132 CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE,
137 """Return the current selected option."""
138 return _ECOBEE_MODE_TO_TEXT.get(self.
_char_char.value)
141 """Set the current mode."""
142 option_int = _ECOBEE_MODE_TO_NUMBERS[option]
144 {CharacteristicsTypes.VENDOR_ECOBEE_SET_HOLD_SCHEDULE: option_int}
150 config_entry: ConfigEntry,
151 async_add_entities: AddEntitiesCallback,
153 """Set up Homekit select entities."""
154 hkid: str = config_entry.data[
"AccessoryPairingID"]
155 conn: HKDevice = hass.data[KNOWN_DEVICES][hkid]
159 entities: list[BaseHomeKitSelect] = []
160 info = {
"aid": char.service.accessory.aid,
"iid": char.service.iid}
162 if description := SELECT_ENTITIES.get(char.type):
163 entities.append(
HomeKitSelect(conn, info, char, description))
164 elif char.type == CharacteristicsTypes.VENDOR_ECOBEE_CURRENT_MODE:
170 for entity
in entities:
171 conn.async_migrate_unique_id(
172 entity.old_unique_id, entity.unique_id, Platform.SELECT
178 conn.add_char_factory(async_add_characteristic)
None async_put_characteristics(self, dict[str, Any] characteristics)
None async_select_option(self, str option)
list[str] get_characteristic_types(self)
str|None current_option(self)
list[str] get_characteristic_types(self)
str|None current_option(self)
None async_select_option(self, str option)
None __init__(self, HKDevice conn, ConfigType info, Characteristic char, HomeKitSelectEntityDescription description)
web.Response get(self, web.Request request, str config_key)
bool async_add_characteristic(Characteristic char)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)