Home Assistant Unofficial Reference 2024.12.1
select.py
Go to the documentation of this file.
1 """Support for Cambridge Audio select entities."""
2 
3 from collections.abc import Awaitable, Callable
4 from dataclasses import dataclass, field
5 
6 from aiostreammagic import StreamMagicClient
7 from aiostreammagic.models import DisplayBrightness
8 
9 from homeassistant.components.select import SelectEntity, SelectEntityDescription
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.const import EntityCategory
12 from homeassistant.core import HomeAssistant
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14 
15 from .entity import CambridgeAudioEntity, command
16 
17 PARALLEL_UPDATES = 0
18 
19 
20 @dataclass(frozen=True, kw_only=True)
22  """Describes Cambridge Audio select entity."""
23 
24  options_fn: Callable[[StreamMagicClient], list[str]] = field(default=lambda _: [])
25  load_fn: Callable[[StreamMagicClient], bool] = field(default=lambda _: True)
26  value_fn: Callable[[StreamMagicClient], str | None]
27  set_value_fn: Callable[[StreamMagicClient, str], Awaitable[None]]
28 
29 
30 async def _audio_output_set_value_fn(client: StreamMagicClient, value: str) -> None:
31  """Set the audio output using the display name."""
32  audio_output_id = next(
33  (output.id for output in client.audio_output.outputs if value == output.name),
34  None,
35  )
36  assert audio_output_id is not None
37  await client.set_audio_output(audio_output_id)
38 
39 
40 def _audio_output_value_fn(client: StreamMagicClient) -> str | None:
41  """Convert the current audio output id to name."""
42  return next(
43  (
44  output.name
45  for output in client.audio_output.outputs
46  if client.state.audio_output == output.id
47  ),
48  None,
49  )
50 
51 
52 CONTROL_ENTITIES: tuple[CambridgeAudioSelectEntityDescription, ...] = (
54  key="display_brightness",
55  translation_key="display_brightness",
56  options=[
57  DisplayBrightness.BRIGHT.value,
58  DisplayBrightness.DIM.value,
59  DisplayBrightness.OFF.value,
60  ],
61  entity_category=EntityCategory.CONFIG,
62  load_fn=lambda client: client.display.brightness != DisplayBrightness.NONE,
63  value_fn=lambda client: client.display.brightness,
64  set_value_fn=lambda client, value: client.set_display_brightness(
65  DisplayBrightness(value)
66  ),
67  ),
69  key="audio_output",
70  translation_key="audio_output",
71  entity_category=EntityCategory.CONFIG,
72  options_fn=lambda client: [
73  output.name for output in client.audio_output.outputs
74  ],
75  load_fn=lambda client: len(client.audio_output.outputs) > 0,
76  value_fn=_audio_output_value_fn,
77  set_value_fn=_audio_output_set_value_fn,
78  ),
79 )
80 
81 
83  hass: HomeAssistant,
84  entry: ConfigEntry,
85  async_add_entities: AddEntitiesCallback,
86 ) -> None:
87  """Set up Cambridge Audio select entities based on a config entry."""
88 
89  client: StreamMagicClient = entry.runtime_data
90  entities: list[CambridgeAudioSelect] = [
91  CambridgeAudioSelect(client, description)
92  for description in CONTROL_ENTITIES
93  if description.load_fn(client)
94  ]
95  async_add_entities(entities)
96 
97 
99  """Defines a Cambridge Audio select entity."""
100 
101  entity_description: CambridgeAudioSelectEntityDescription
102 
103  def __init__(
104  self,
105  client: StreamMagicClient,
106  description: CambridgeAudioSelectEntityDescription,
107  ) -> None:
108  """Initialize Cambridge Audio select."""
109  super().__init__(client)
110  self.entity_descriptionentity_description = description
111  self._attr_unique_id_attr_unique_id = f"{client.info.unit_id}-{description.key}"
112  options_fn = description.options_fn(client)
113  if options_fn:
114  self._attr_options_attr_options = options_fn
115 
116  @property
117  def current_option(self) -> str | None:
118  """Return the state of the select."""
119  return self.entity_descriptionentity_description.value_fn(self.clientclient)
120 
121  @command
122  async def async_select_option(self, option: str) -> None:
123  """Change the selected option."""
124  await self.entity_descriptionentity_description.set_value_fn(self.clientclient, option)
None __init__(self, StreamMagicClient client, CambridgeAudioSelectEntityDescription description)
Definition: select.py:107
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: select.py:86
None _audio_output_set_value_fn(StreamMagicClient client, str value)
Definition: select.py:30
str|None _audio_output_value_fn(StreamMagicClient client)
Definition: select.py:40