Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """The MusicCast integration."""
2 
3 from __future__ import annotations
4 
5 from aiomusiccast.capabilities import Capability
6 
7 from homeassistant.const import ATTR_CONNECTIONS, ATTR_VIA_DEVICE
9  CONNECTION_NETWORK_MAC,
10  DeviceInfo,
11  format_mac,
12 )
13 from homeassistant.helpers.update_coordinator import CoordinatorEntity
14 
15 from .const import BRAND, DEFAULT_ZONE, DOMAIN, ENTITY_CATEGORY_MAPPING
16 from .coordinator import MusicCastDataUpdateCoordinator
17 
18 
19 class MusicCastEntity(CoordinatorEntity[MusicCastDataUpdateCoordinator]):
20  """Defines a base MusicCast entity."""
21 
22  def __init__(
23  self,
24  *,
25  name: str,
26  icon: str,
27  coordinator: MusicCastDataUpdateCoordinator,
28  enabled_default: bool = True,
29  ) -> None:
30  """Initialize the MusicCast entity."""
31  super().__init__(coordinator)
32  self._attr_entity_registry_enabled_default_attr_entity_registry_enabled_default = enabled_default
33  self._attr_icon_attr_icon = icon
34  self._attr_name_attr_name = name
35 
36 
38  """Defines a MusicCast device entity."""
39 
40  _zone_id: str = DEFAULT_ZONE
41 
42  @property
43  def device_id(self):
44  """Return the ID of the current device."""
45  if self._zone_id_zone_id == DEFAULT_ZONE:
46  return self.coordinator.data.device_id
47  return f"{self.coordinator.data.device_id}_{self._zone_id}"
48 
49  @property
50  def device_name(self):
51  """Return the name of the current device."""
52  return self.coordinator.data.zones[self._zone_id_zone_id].name
53 
54  @property
55  def device_info(self) -> DeviceInfo:
56  """Return device information about this MusicCast device."""
57 
58  device_info = DeviceInfo(
59  name=self.device_namedevice_name,
60  identifiers={
61  (
62  DOMAIN,
63  self.device_iddevice_id,
64  )
65  },
66  manufacturer=BRAND,
67  model=self.coordinator.data.model_name,
68  sw_version=self.coordinator.data.system_version,
69  )
70 
71  if self._zone_id_zone_id == DEFAULT_ZONE:
72  device_info[ATTR_CONNECTIONS] = {
73  (CONNECTION_NETWORK_MAC, format_mac(mac))
74  for mac in self.coordinator.data.mac_addresses.values()
75  }
76  else:
77  device_info[ATTR_VIA_DEVICE] = (DOMAIN, self.coordinator.data.device_id)
78 
79  return device_info
80 
81  async def async_added_to_hass(self):
82  """Run when this Entity has been added to HA."""
83  await super().async_added_to_hass()
84  # All entities should register callbacks to update HA when their state changes
85  self.coordinator.musiccast.register_callback(self.async_write_ha_state)
86 
87  async def async_will_remove_from_hass(self):
88  """Entity being removed from hass."""
89  await super().async_will_remove_from_hass()
90  self.coordinator.musiccast.remove_callback(self.async_write_ha_state)
91 
92 
94  """Base Entity type for all capabilities."""
95 
96  def __init__(
97  self,
98  coordinator: MusicCastDataUpdateCoordinator,
99  capability: Capability,
100  zone_id: str | None = None,
101  ) -> None:
102  """Initialize a capability based entity."""
103  if zone_id is not None:
104  self._zone_id_zone_id_zone_id = zone_id
105  self.capabilitycapability = capability
106  super().__init__(name=capability.name, icon="", coordinator=coordinator)
107  self._attr_entity_category_attr_entity_category = ENTITY_CATEGORY_MAPPING.get(capability.entity_type)
108 
109  @property
110  def unique_id(self) -> str:
111  """Return the unique ID for this entity."""
112  return f"{self.device_id}_{self.capability.id}"
None __init__(self, MusicCastDataUpdateCoordinator coordinator, Capability capability, str|None zone_id=None)
Definition: entity.py:101
None __init__(self, *str name, str icon, MusicCastDataUpdateCoordinator coordinator, bool enabled_default=True)
Definition: entity.py:29