Home Assistant Unofficial Reference 2024.12.1
select.py
Go to the documentation of this file.
1 """Provides a select platform for Home Connect."""
2 
3 import contextlib
4 import logging
5 
6 from homeconnect.api import HomeConnectError
7 
8 from homeassistant.components.select import SelectEntity, SelectEntityDescription
9 from homeassistant.core import HomeAssistant
10 from homeassistant.exceptions import ServiceValidationError
11 from homeassistant.helpers.entity_platform import AddEntitiesCallback
12 
13 from . import (
14  HomeConnectConfigEntry,
15  bsh_key_to_translation_key,
16  get_dict_from_home_connect_error,
17 )
18 from .api import HomeConnectDevice
19 from .const import (
20  APPLIANCES_WITH_PROGRAMS,
21  ATTR_VALUE,
22  BSH_ACTIVE_PROGRAM,
23  BSH_SELECTED_PROGRAM,
24  DOMAIN,
25 )
26 from .entity import HomeConnectEntity
27 
28 _LOGGER = logging.getLogger(__name__)
29 
30 TRANSLATION_KEYS_PROGRAMS_MAP = {
31  bsh_key_to_translation_key(program): program
32  for program in (
33  "ConsumerProducts.CleaningRobot.Program.Cleaning.CleanAll",
34  "ConsumerProducts.CleaningRobot.Program.Cleaning.CleanMap",
35  "ConsumerProducts.CleaningRobot.Program.Basic.GoHome",
36  "ConsumerProducts.CoffeeMaker.Program.Beverage.Ristretto",
37  "ConsumerProducts.CoffeeMaker.Program.Beverage.Espresso",
38  "ConsumerProducts.CoffeeMaker.Program.Beverage.EspressoDoppio",
39  "ConsumerProducts.CoffeeMaker.Program.Beverage.Coffee",
40  "ConsumerProducts.CoffeeMaker.Program.Beverage.XLCoffee",
41  "ConsumerProducts.CoffeeMaker.Program.Beverage.CaffeGrande",
42  "ConsumerProducts.CoffeeMaker.Program.Beverage.EspressoMacchiato",
43  "ConsumerProducts.CoffeeMaker.Program.Beverage.Cappuccino",
44  "ConsumerProducts.CoffeeMaker.Program.Beverage.LatteMacchiato",
45  "ConsumerProducts.CoffeeMaker.Program.Beverage.CaffeLatte",
46  "ConsumerProducts.CoffeeMaker.Program.Beverage.MilkFroth",
47  "ConsumerProducts.CoffeeMaker.Program.Beverage.WarmMilk",
48  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.KleinerBrauner",
49  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.GrosserBrauner",
50  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Verlaengerter",
51  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.VerlaengerterBraun",
52  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.WienerMelange",
53  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.FlatWhite",
54  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Cortado",
55  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.CafeCortado",
56  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.CafeConLeche",
57  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.CafeAuLait",
58  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Doppio",
59  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Kaapi",
60  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.KoffieVerkeerd",
61  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Galao",
62  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Garoto",
63  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.Americano",
64  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.RedEye",
65  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.BlackEye",
66  "ConsumerProducts.CoffeeMaker.Program.CoffeeWorld.DeadEye",
67  "ConsumerProducts.CoffeeMaker.Program.Beverage.HotWater",
68  "Dishcare.Dishwasher.Program.PreRinse",
69  "Dishcare.Dishwasher.Program.Auto1",
70  "Dishcare.Dishwasher.Program.Auto2",
71  "Dishcare.Dishwasher.Program.Auto3",
72  "Dishcare.Dishwasher.Program.Eco50",
73  "Dishcare.Dishwasher.Program.Quick45",
74  "Dishcare.Dishwasher.Program.Intensiv70",
75  "Dishcare.Dishwasher.Program.Normal65",
76  "Dishcare.Dishwasher.Program.Glas40",
77  "Dishcare.Dishwasher.Program.GlassCare",
78  "Dishcare.Dishwasher.Program.NightWash",
79  "Dishcare.Dishwasher.Program.Quick65",
80  "Dishcare.Dishwasher.Program.Normal45",
81  "Dishcare.Dishwasher.Program.Intensiv45",
82  "Dishcare.Dishwasher.Program.AutoHalfLoad",
83  "Dishcare.Dishwasher.Program.IntensivPower",
84  "Dishcare.Dishwasher.Program.MagicDaily",
85  "Dishcare.Dishwasher.Program.Super60",
86  "Dishcare.Dishwasher.Program.Kurz60",
87  "Dishcare.Dishwasher.Program.ExpressSparkle65",
88  "Dishcare.Dishwasher.Program.MachineCare",
89  "Dishcare.Dishwasher.Program.SteamFresh",
90  "Dishcare.Dishwasher.Program.MaximumCleaning",
91  "Dishcare.Dishwasher.Program.MixedLoad",
92  "LaundryCare.Dryer.Program.Cotton",
93  "LaundryCare.Dryer.Program.Synthetic",
94  "LaundryCare.Dryer.Program.Mix",
95  "LaundryCare.Dryer.Program.Blankets",
96  "LaundryCare.Dryer.Program.BusinessShirts",
97  "LaundryCare.Dryer.Program.DownFeathers",
98  "LaundryCare.Dryer.Program.Hygiene",
99  "LaundryCare.Dryer.Program.Jeans",
100  "LaundryCare.Dryer.Program.Outdoor",
101  "LaundryCare.Dryer.Program.SyntheticRefresh",
102  "LaundryCare.Dryer.Program.Towels",
103  "LaundryCare.Dryer.Program.Delicates",
104  "LaundryCare.Dryer.Program.Super40",
105  "LaundryCare.Dryer.Program.Shirts15",
106  "LaundryCare.Dryer.Program.Pillow",
107  "LaundryCare.Dryer.Program.AntiShrink",
108  "LaundryCare.Dryer.Program.MyTime.MyDryingTime",
109  "LaundryCare.Dryer.Program.TimeCold",
110  "LaundryCare.Dryer.Program.TimeWarm",
111  "LaundryCare.Dryer.Program.InBasket",
112  "LaundryCare.Dryer.Program.TimeColdFix.TimeCold20",
113  "LaundryCare.Dryer.Program.TimeColdFix.TimeCold30",
114  "LaundryCare.Dryer.Program.TimeColdFix.TimeCold60",
115  "LaundryCare.Dryer.Program.TimeWarmFix.TimeWarm30",
116  "LaundryCare.Dryer.Program.TimeWarmFix.TimeWarm40",
117  "LaundryCare.Dryer.Program.TimeWarmFix.TimeWarm60",
118  "LaundryCare.Dryer.Program.Dessous",
119  "Cooking.Common.Program.Hood.Automatic",
120  "Cooking.Common.Program.Hood.Venting",
121  "Cooking.Common.Program.Hood.DelayedShutOff",
122  "Cooking.Oven.Program.HeatingMode.PreHeating",
123  "Cooking.Oven.Program.HeatingMode.HotAir",
124  "Cooking.Oven.Program.HeatingMode.HotAirEco",
125  "Cooking.Oven.Program.HeatingMode.HotAirGrilling",
126  "Cooking.Oven.Program.HeatingMode.TopBottomHeating",
127  "Cooking.Oven.Program.HeatingMode.TopBottomHeatingEco",
128  "Cooking.Oven.Program.HeatingMode.BottomHeating",
129  "Cooking.Oven.Program.HeatingMode.PizzaSetting",
130  "Cooking.Oven.Program.HeatingMode.SlowCook",
131  "Cooking.Oven.Program.HeatingMode.IntensiveHeat",
132  "Cooking.Oven.Program.HeatingMode.KeepWarm",
133  "Cooking.Oven.Program.HeatingMode.PreheatOvenware",
134  "Cooking.Oven.Program.HeatingMode.FrozenHeatupSpecial",
135  "Cooking.Oven.Program.HeatingMode.Desiccation",
136  "Cooking.Oven.Program.HeatingMode.Defrost",
137  "Cooking.Oven.Program.HeatingMode.Proof",
138  "Cooking.Oven.Program.HeatingMode.HotAir30Steam",
139  "Cooking.Oven.Program.HeatingMode.HotAir60Steam",
140  "Cooking.Oven.Program.HeatingMode.HotAir80Steam",
141  "Cooking.Oven.Program.HeatingMode.HotAir100Steam",
142  "Cooking.Oven.Program.HeatingMode.SabbathProgramme",
143  "Cooking.Oven.Program.Microwave.90Watt",
144  "Cooking.Oven.Program.Microwave.180Watt",
145  "Cooking.Oven.Program.Microwave.360Watt",
146  "Cooking.Oven.Program.Microwave.600Watt",
147  "Cooking.Oven.Program.Microwave.900Watt",
148  "Cooking.Oven.Program.Microwave.1000Watt",
149  "Cooking.Oven.Program.Microwave.Max",
150  "Cooking.Oven.Program.HeatingMode.WarmingDrawer",
151  "LaundryCare.Washer.Program.Cotton",
152  "LaundryCare.Washer.Program.Cotton.CottonEco",
153  "LaundryCare.Washer.Program.Cotton.Eco4060",
154  "LaundryCare.Washer.Program.Cotton.Colour",
155  "LaundryCare.Washer.Program.EasyCare",
156  "LaundryCare.Washer.Program.Mix",
157  "LaundryCare.Washer.Program.Mix.NightWash",
158  "LaundryCare.Washer.Program.DelicatesSilk",
159  "LaundryCare.Washer.Program.Wool",
160  "LaundryCare.Washer.Program.Sensitive",
161  "LaundryCare.Washer.Program.Auto30",
162  "LaundryCare.Washer.Program.Auto40",
163  "LaundryCare.Washer.Program.Auto60",
164  "LaundryCare.Washer.Program.Chiffon",
165  "LaundryCare.Washer.Program.Curtains",
166  "LaundryCare.Washer.Program.DarkWash",
167  "LaundryCare.Washer.Program.Dessous",
168  "LaundryCare.Washer.Program.Monsoon",
169  "LaundryCare.Washer.Program.Outdoor",
170  "LaundryCare.Washer.Program.PlushToy",
171  "LaundryCare.Washer.Program.ShirtsBlouses",
172  "LaundryCare.Washer.Program.SportFitness",
173  "LaundryCare.Washer.Program.Towels",
174  "LaundryCare.Washer.Program.WaterProof",
175  "LaundryCare.Washer.Program.PowerSpeed59",
176  "LaundryCare.Washer.Program.Super153045.Super15",
177  "LaundryCare.Washer.Program.Super153045.Super1530",
178  "LaundryCare.Washer.Program.DownDuvet.Duvet",
179  "LaundryCare.Washer.Program.Rinse.RinseSpinDrain",
180  "LaundryCare.Washer.Program.DrumClean",
181  "LaundryCare.WasherDryer.Program.Cotton",
182  "LaundryCare.WasherDryer.Program.Cotton.Eco4060",
183  "LaundryCare.WasherDryer.Program.Mix",
184  "LaundryCare.WasherDryer.Program.EasyCare",
185  "LaundryCare.WasherDryer.Program.WashAndDry60",
186  "LaundryCare.WasherDryer.Program.WashAndDry90",
187  )
188 }
189 
190 PROGRAMS_TRANSLATION_KEYS_MAP = {
191  value: key for key, value in TRANSLATION_KEYS_PROGRAMS_MAP.items()
192 }
193 
194 PROGRAM_SELECT_ENTITY_DESCRIPTIONS = (
196  key=BSH_ACTIVE_PROGRAM,
197  translation_key="active_program",
198  ),
200  key=BSH_SELECTED_PROGRAM,
201  translation_key="selected_program",
202  ),
203 )
204 
205 
207  hass: HomeAssistant,
208  entry: HomeConnectConfigEntry,
209  async_add_entities: AddEntitiesCallback,
210 ) -> None:
211  """Set up the Home Connect select entities."""
212 
213  def get_entities() -> list[HomeConnectProgramSelectEntity]:
214  """Get a list of entities."""
215  entities: list[HomeConnectProgramSelectEntity] = []
216  programs_not_found = set()
217  for device in entry.runtime_data.devices:
218  if device.appliance.type in APPLIANCES_WITH_PROGRAMS:
219  with contextlib.suppress(HomeConnectError):
220  programs = device.appliance.get_programs_available()
221  if programs:
222  for program in programs:
223  if program not in PROGRAMS_TRANSLATION_KEYS_MAP:
224  programs.remove(program)
225  if program not in programs_not_found:
226  _LOGGER.info(
227  'The program "%s" is not part of the official Home Connect API specification',
228  program,
229  )
230  programs_not_found.add(program)
231  entities.extend(
232  HomeConnectProgramSelectEntity(device, programs, desc)
233  for desc in PROGRAM_SELECT_ENTITY_DESCRIPTIONS
234  )
235  return entities
236 
237  async_add_entities(await hass.async_add_executor_job(get_entities), True)
238 
239 
241  """Select class for Home Connect programs."""
242 
243  def __init__(
244  self,
245  device: HomeConnectDevice,
246  programs: list[str],
247  desc: SelectEntityDescription,
248  ) -> None:
249  """Initialize the entity."""
250  super().__init__(
251  device,
252  desc,
253  )
254  self._attr_options_attr_options = [
255  PROGRAMS_TRANSLATION_KEYS_MAP[program] for program in programs
256  ]
257  self.start_on_selectstart_on_select = desc.key == BSH_ACTIVE_PROGRAM
258 
259  async def async_update(self) -> None:
260  """Update the program selection status."""
261  program = self.devicedevice.appliance.status.get(self.bsh_keybsh_key, {}).get(ATTR_VALUE)
262  if not program:
263  program_translation_key = None
264  elif not (
265  program_translation_key := PROGRAMS_TRANSLATION_KEYS_MAP.get(program)
266  ):
267  _LOGGER.debug(
268  'The program "%s" is not part of the official Home Connect API specification',
269  program,
270  )
271  self._attr_current_option_attr_current_option = program_translation_key
272  _LOGGER.debug("Updated, new program: %s", self._attr_current_option_attr_current_option)
273 
274  async def async_select_option(self, option: str) -> None:
275  """Select new program."""
276  bsh_key = TRANSLATION_KEYS_PROGRAMS_MAP[option]
277  _LOGGER.debug(
278  "Starting program: %s" if self.start_on_selectstart_on_select else "Selecting program: %s",
279  bsh_key,
280  )
281  if self.start_on_selectstart_on_select:
282  target = self.devicedevice.appliance.start_program
283  else:
284  target = self.devicedevice.appliance.select_program
285  try:
286  await self.hasshass.async_add_executor_job(target, bsh_key)
287  except HomeConnectError as err:
288  if self.start_on_selectstart_on_select:
289  translation_key = "start_program"
290  else:
291  translation_key = "select_program"
293  translation_domain=DOMAIN,
294  translation_key=translation_key,
295  translation_placeholders={
297  "program": bsh_key,
298  },
299  ) from err
300  self.async_entity_updateasync_entity_update()
None __init__(self, HomeConnectDevice device, list[str] programs, SelectEntityDescription desc)
Definition: select.py:248
list[BaseAprilaireSensor] get_entities(type[BaseAprilaireSensor] entity_class, AprilaireCoordinator coordinator, str unique_id, tuple[AprilaireSensorDescription,...] descriptions)
Definition: sensor.py:64
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, HomeConnectConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: select.py:210
dict[str, Any] get_dict_from_home_connect_error(api.HomeConnectError err)
Definition: __init__.py:334
str bsh_key_to_translation_key(str bsh_key)
Definition: __init__.py:345