Home Assistant Unofficial Reference 2024.12.1
media_player.py
Go to the documentation of this file.
1 """The lookin integration light platform."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from aiolookin import Remote
8 
10  MediaPlayerDeviceClass,
11  MediaPlayerEntity,
12  MediaPlayerEntityFeature,
13  MediaPlayerState,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.const import Platform
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from .const import DOMAIN, TYPE_TO_PLATFORM
21 from .coordinator import LookinDataUpdateCoordinator
22 from .entity import LookinPowerPushRemoteEntity
23 from .models import LookinData
24 
25 LOGGER = logging.getLogger(__name__)
26 
27 _TYPE_TO_DEVICE_CLASS = {
28  "01": MediaPlayerDeviceClass.TV,
29  "02": MediaPlayerDeviceClass.RECEIVER,
30 }
31 
32 _FUNCTION_NAME_TO_FEATURE = {
33  "power": MediaPlayerEntityFeature.TURN_OFF,
34  "poweron": MediaPlayerEntityFeature.TURN_ON,
35  "poweroff": MediaPlayerEntityFeature.TURN_OFF,
36  "mute": MediaPlayerEntityFeature.VOLUME_MUTE,
37  "volup": MediaPlayerEntityFeature.VOLUME_STEP,
38  "chup": MediaPlayerEntityFeature.NEXT_TRACK,
39  "chdown": MediaPlayerEntityFeature.PREVIOUS_TRACK,
40  "mode": MediaPlayerEntityFeature.SELECT_SOURCE,
41 }
42 
43 
45  hass: HomeAssistant,
46  config_entry: ConfigEntry,
47  async_add_entities: AddEntitiesCallback,
48 ) -> None:
49  """Set up the media_player platform for lookin from a config entry."""
50  lookin_data: LookinData = hass.data[DOMAIN][config_entry.entry_id]
51  entities = []
52 
53  for remote in lookin_data.devices:
54  if TYPE_TO_PLATFORM.get(remote["Type"]) != Platform.MEDIA_PLAYER:
55  continue
56  uuid = remote["UUID"]
57  coordinator = lookin_data.device_coordinators[uuid]
58  device: Remote = coordinator.data
59  entities.append(
61  coordinator=coordinator,
62  uuid=uuid,
63  device=device,
64  lookin_data=lookin_data,
65  device_class=_TYPE_TO_DEVICE_CLASS[remote["Type"]],
66  )
67  )
68 
69  async_add_entities(entities)
70 
71 
73  """A lookin media player."""
74 
75  _attr_should_poll = False
76 
77  def __init__(
78  self,
79  coordinator: LookinDataUpdateCoordinator,
80  uuid: str,
81  device: Remote,
82  lookin_data: LookinData,
83  device_class: MediaPlayerDeviceClass,
84  ) -> None:
85  """Init the lookin media player."""
86  self._attr_device_class_attr_device_class = device_class
87  super().__init__(coordinator, uuid, device, lookin_data)
88  for function_name, feature in _FUNCTION_NAME_TO_FEATURE.items():
89  if function_name in self._function_names_function_names:
90  self._attr_supported_features |= feature
91  self._source_list_source_list: dict[str, str] | None = None
92 
93  @property
94  def source_list(self) -> list[str]:
95  """List of available input sources."""
96  return list(self._source_list_source_list.keys()) if self._source_list_source_list else []
97 
98  async def async_select_source(self, source: str) -> None:
99  """Choose an available playlist and play it."""
100  if not self._source_list_source_list:
101  return
102  await self._async_send_command_async_send_command(command="mode", signal=self._source_list_source_list[source])
103 
104  async def async_added_to_hass(self) -> None:
105  """Get list of available input sources."""
106  if self._source_list_source_list is None and "mode" in self._function_names_function_names:
107  if sources := await self._lookin_protocol_lookin_protocol.get_media_sources(
108  uuid=self._uuid_uuid
109  ):
110  self._source_list_source_list = {
111  f"INPUT_{index}": f"{index:02x}" for index in range(len(sources))
112  }
113  await super().async_added_to_hass()
114 
115  async def async_volume_up(self) -> None:
116  """Turn volume up for media player."""
117  await self._async_send_command_async_send_command("volup")
118 
119  async def async_volume_down(self) -> None:
120  """Turn volume down for media player."""
121  await self._async_send_command_async_send_command("voldown")
122 
123  async def async_media_previous_track(self) -> None:
124  """Send previous track command."""
125  await self._async_send_command_async_send_command("chdown")
126 
127  async def async_media_next_track(self) -> None:
128  """Send next track command."""
129  await self._async_send_command_async_send_command("chup")
130 
131  async def async_mute_volume(self, mute: bool) -> None:
132  """Mute the volume."""
133  await self._async_send_command_async_send_command("mute")
134  self._attr_is_volume_muted_attr_is_volume_muted = not self.is_volume_mutedis_volume_muted
135  self.async_write_ha_stateasync_write_ha_state()
136 
137  async def async_turn_off(self) -> None:
138  """Turn the media player off."""
139  await self._async_send_command_async_send_command(self._power_off_command_power_off_command)
140  self._attr_state_attr_state = MediaPlayerState.STANDBY
141  self.async_write_ha_stateasync_write_ha_state()
142 
143  async def async_turn_on(self) -> None:
144  """Turn the media player on."""
145  await self._async_send_command_async_send_command(self._power_on_command_power_on_command)
146  self._attr_state_attr_state = MediaPlayerState.ON
147  self.async_write_ha_stateasync_write_ha_state()
148 
149  def _update_from_status(self, status: str) -> None:
150  """Update media property from status.
151 
152  00F0
153  0 - 0/1 on/off
154  0 - sourse
155  F - volume, 0 - muted, 1 - volume up, F - volume down
156  0 - not used
157  """
158  if len(status) != 4:
159  return
160  state = status[0]
161  mute = status[2]
162 
163  self._attr_state_attr_state = (
164  MediaPlayerState.ON if state == "1" else MediaPlayerState.STANDBY
165  )
166  self._attr_is_volume_muted_attr_is_volume_muted = mute == "0"
None _async_send_command(self, str command, str signal="FF")
Definition: entity.py:122
None __init__(self, LookinDataUpdateCoordinator coordinator, str uuid, Remote device, LookinData lookin_data, MediaPlayerDeviceClass device_class)
Definition: media_player.py:84
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: media_player.py:48