Home Assistant Unofficial Reference 2024.12.1
media_player.py
Go to the documentation of this file.
1 """Support for LG soundbars."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 import temescal
8 
10  MediaPlayerEntity,
11  MediaPlayerEntityFeature,
12  MediaPlayerState,
13 )
14 from homeassistant.config_entries import ConfigEntry
15 from homeassistant.const import CONF_HOST, CONF_PORT
16 from homeassistant.core import HomeAssistant
17 from homeassistant.helpers.device_registry import DeviceInfo
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 
20 from .const import DOMAIN
21 
22 
24  hass: HomeAssistant,
25  config_entry: ConfigEntry,
26  async_add_entities: AddEntitiesCallback,
27 ) -> None:
28  """Set up media_player from a config entry created in the integrations UI."""
30  [
31  LGDevice(
32  config_entry.data[CONF_HOST],
33  config_entry.data[CONF_PORT],
34  config_entry.unique_id or config_entry.entry_id,
35  )
36  ]
37  )
38 
39 
41  """Representation of an LG soundbar device."""
42 
43  _attr_should_poll = False
44  _attr_state = MediaPlayerState.ON
45  _attr_supported_features = (
46  MediaPlayerEntityFeature.VOLUME_SET
47  | MediaPlayerEntityFeature.VOLUME_MUTE
48  | MediaPlayerEntityFeature.TURN_ON
49  | MediaPlayerEntityFeature.TURN_OFF
50  | MediaPlayerEntityFeature.SELECT_SOURCE
51  | MediaPlayerEntityFeature.SELECT_SOUND_MODE
52  )
53  _attr_has_entity_name = True
54  _attr_name = None
55 
56  def __init__(self, host, port, unique_id):
57  """Initialize the LG speakers."""
58  self._host_host = host
59  self._port_port = port
60  self._attr_unique_id_attr_unique_id = unique_id
61 
62  self._volume_volume = 0
63  self._volume_min_volume_min = 0
64  self._volume_max_volume_max = 0
65  self._function_function = -1
66  self._functions_functions = []
67  self._equaliser_equaliser = -1
68  self._equalisers_equalisers = []
69  self._mute_mute = 0
70  self._rear_volume_rear_volume = 0
71  self._rear_volume_min_rear_volume_min = 0
72  self._rear_volume_max_rear_volume_max = 0
73  self._woofer_volume_woofer_volume = 0
74  self._woofer_volume_min_woofer_volume_min = 0
75  self._woofer_volume_max_woofer_volume_max = 0
76  self._bass_bass = 0
77  self._treble_treble = 0
78  self._device_device = None
79  self._attr_device_info_attr_device_info = DeviceInfo(
80  identifiers={(DOMAIN, unique_id)}, name=host
81  )
82 
83  async def async_added_to_hass(self) -> None:
84  """Register the callback after hass is ready for it."""
85  await self.hasshass.async_add_executor_job(self._connect_connect)
86 
87  def _connect(self) -> None:
88  """Perform the actual devices setup."""
89  self._device_device = temescal.temescal(
90  self._host_host, port=self._port_port, callback=self.handle_eventhandle_event
91  )
92  self._device_device.get_product_info()
93  self._device_device.get_mac_info()
94  self.updateupdate()
95 
96  def handle_event(self, response):
97  """Handle responses from the speakers."""
98  data = response.get("data") or {}
99  if response["msg"] == "EQ_VIEW_INFO":
100  self._update_equalisers_update_equalisers(data)
101  elif response["msg"] == "SPK_LIST_VIEW_INFO":
102  if "i_vol" in data:
103  self._volume_volume = data["i_vol"]
104  if "i_vol_min" in data:
105  self._volume_min_volume_min = data["i_vol_min"]
106  if "i_vol_max" in data:
107  self._volume_max_volume_max = data["i_vol_max"]
108  if "b_mute" in data:
109  self._mute_mute = data["b_mute"]
110  if "i_curr_func" in data:
111  self._function_function = data["i_curr_func"]
112  if "b_powerstatus" in data:
113  if data["b_powerstatus"]:
114  self._attr_state_attr_state = MediaPlayerState.ON
115  else:
116  self._attr_state_attr_state = MediaPlayerState.OFF
117  elif response["msg"] == "FUNC_VIEW_INFO":
118  if "i_curr_func" in data:
119  self._function_function = data["i_curr_func"]
120  if "ai_func_list" in data:
121  self._functions_functions = data["ai_func_list"]
122  elif response["msg"] == "SETTING_VIEW_INFO":
123  if "i_rear_min" in data:
124  self._rear_volume_min_rear_volume_min = data["i_rear_min"]
125  if "i_rear_max" in data:
126  self._rear_volume_max_rear_volume_max = data["i_rear_max"]
127  if "i_rear_level" in data:
128  self._rear_volume_rear_volume = data["i_rear_level"]
129  if "i_woofer_min" in data:
130  self._woofer_volume_min_woofer_volume_min = data["i_woofer_min"]
131  if "i_woofer_max" in data:
132  self._woofer_volume_max_woofer_volume_max = data["i_woofer_max"]
133  if "i_woofer_level" in data:
134  self._woofer_volume_woofer_volume = data["i_woofer_level"]
135  if "i_curr_eq" in data:
136  self._equaliser_equaliser = data["i_curr_eq"]
137  if "s_user_name" in data:
138  self._attr_name_attr_name = data["s_user_name"]
139 
140  self.schedule_update_ha_stateschedule_update_ha_state()
141 
142  def _update_equalisers(self, data: dict[str, Any]) -> None:
143  """Update the equalisers."""
144  if "i_bass" in data:
145  self._bass_bass = data["i_bass"]
146  if "i_treble" in data:
147  self._treble_treble = data["i_treble"]
148  if "ai_eq_list" in data:
149  self._equalisers_equalisers = data["ai_eq_list"]
150  if "i_curr_eq" in data:
151  self._equaliser_equaliser = data["i_curr_eq"]
152 
153  def update(self) -> None:
154  """Trigger updates from the device."""
155  self._device_device.get_eq()
156  self._device_device.get_info()
157  self._device_device.get_func()
158  self._device_device.get_settings()
159 
160  @property
161  def volume_level(self):
162  """Volume level of the media player (0..1)."""
163  if self._volume_max_volume_max != 0:
164  return self._volume_volume / self._volume_max_volume_max
165  return 0
166 
167  @property
168  def is_volume_muted(self):
169  """Boolean if volume is currently muted."""
170  return self._mute_mute
171 
172  @property
173  def sound_mode(self):
174  """Return the current sound mode."""
175  if self._equaliser_equaliser == -1 or self._equaliser_equaliser >= len(temescal.equalisers):
176  return None
177  return temescal.equalisers[self._equaliser_equaliser]
178 
179  @property
180  def sound_mode_list(self):
181  """Return the available sound modes."""
182  return sorted(
183  temescal.equalisers[equaliser]
184  for equaliser in self._equalisers_equalisers
185  if equaliser < len(temescal.equalisers)
186  )
187 
188  @property
189  def source(self):
190  """Return the current input source."""
191  if self._function_function == -1 or self._function_function >= len(temescal.functions):
192  return None
193  return temescal.functions[self._function_function]
194 
195  @property
196  def source_list(self):
197  """List of available input sources."""
198  return sorted(
199  temescal.functions[function]
200  for function in self._functions_functions
201  if function < len(temescal.functions)
202  )
203 
204  def set_volume_level(self, volume: float) -> None:
205  """Set volume level, range 0..1."""
206  volume = volume * self._volume_max_volume_max
207  self._device_device.set_volume(int(volume))
208 
209  def mute_volume(self, mute: bool) -> None:
210  """Mute (true) or unmute (false) media player."""
211  self._device_device.set_mute(mute)
212 
213  def select_source(self, source: str) -> None:
214  """Select input source."""
215  self._device_device.set_func(temescal.functions.index(source))
216 
217  def select_sound_mode(self, sound_mode: str) -> None:
218  """Set Sound Mode for Receiver.."""
219  self._device_device.set_eq(temescal.equalisers.index(sound_mode))
220 
221  def turn_on(self) -> None:
222  """Turn the media player on."""
223  self._set_power_set_power(True)
224 
225  def turn_off(self) -> None:
226  """Turn the media player off."""
227  self._set_power_set_power(False)
228 
229  def _set_power(self, status: bool) -> None:
230  """Set the media player state."""
231  self._device_device.send_packet(
232  {"cmd": "set", "data": {"b_powerkey": status}, "msg": "SPK_LIST_VIEW_INFO"}
233  )
None schedule_update_ha_state(self, bool force_refresh=False)
Definition: entity.py:1244
dict[str, Any]|None get_info(HomeAssistant hass)
Definition: coordinator.py:69
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: media_player.py:27