Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """Base entity model."""
2 
3 from __future__ import annotations
4 
5 from typing import TYPE_CHECKING
6 
7 from music_assistant_models.enums import EventType
8 from music_assistant_models.event import MassEvent
9 from music_assistant_models.player import Player
10 
11 from homeassistant.helpers.device_registry import DeviceInfo
12 from homeassistant.helpers.entity import Entity
13 
14 from .const import DOMAIN
15 
16 if TYPE_CHECKING:
17  from music_assistant_client import MusicAssistantClient
18 
19 
21  """Base Entity from Music Assistant Player."""
22 
23  _attr_has_entity_name = True
24  _attr_should_poll = False
25 
26  def __init__(self, mass: MusicAssistantClient, player_id: str) -> None:
27  """Initialize MediaPlayer entity."""
28  self.massmass = mass
29  self.player_idplayer_id = player_id
30  provider = self.massmass.get_provider(self.playerplayer.provider)
31  if TYPE_CHECKING:
32  assert provider is not None
33  self._attr_device_info_attr_device_info = DeviceInfo(
34  identifiers={(DOMAIN, player_id)},
35  manufacturer=self.playerplayer.device_info.manufacturer or provider.name,
36  model=self.playerplayer.device_info.model or self.playerplayer.name,
37  name=self.playerplayer.display_name,
38  configuration_url=f"{mass.server_url}/#/settings/editplayer/{player_id}",
39  )
40 
41  async def async_added_to_hass(self) -> None:
42  """Register callbacks."""
43  await self.async_on_updateasync_on_update()
44  self.async_on_removeasync_on_remove(
45  self.massmass.subscribe(
46  self.__on_mass_update__on_mass_update, EventType.PLAYER_UPDATED, self.player_idplayer_id
47  )
48  )
49  self.async_on_removeasync_on_remove(
50  self.massmass.subscribe(
51  self.__on_mass_update__on_mass_update,
52  EventType.QUEUE_UPDATED,
53  )
54  )
55 
56  @property
57  def player(self) -> Player:
58  """Return the Mass Player attached to this HA entity."""
59  return self.massmass.players[self.player_idplayer_id]
60 
61  @property
62  def unique_id(self) -> str | None:
63  """Return unique id for entity."""
64  _base = self.player_idplayer_id
65  if hasattr(self, "entity_description"):
66  return f"{_base}_{self.entity_description.key}"
67  return _base
68 
69  @property
70  def available(self) -> bool:
71  """Return availability of entity."""
72  return self.playerplayer.available and bool(self.massmass.connection.connected)
73 
74  async def __on_mass_update(self, event: MassEvent) -> None:
75  """Call when we receive an event from MusicAssistant."""
76  if event.event == EventType.QUEUE_UPDATED and event.object_id not in (
77  self.playerplayer.active_source,
78  self.playerplayer.active_group,
79  self.playerplayer.player_id,
80  ):
81  return
82  await self.async_on_updateasync_on_update()
83  self.async_write_ha_stateasync_write_ha_state()
84 
85  async def async_on_update(self) -> None:
86  """Handle player updates."""
None __init__(self, MusicAssistantClient mass, str player_id)
Definition: entity.py:26
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
Callable[[], None] subscribe(HomeAssistant hass, str topic, MessageCallbackType msg_callback, int qos=DEFAULT_QOS, str encoding="utf-8")
Definition: client.py:247