Home Assistant Unofficial Reference 2024.12.1
entity.py
Go to the documentation of this file.
1 """Entity representing a Sonos player."""
2 
3 from __future__ import annotations
4 
5 from abc import abstractmethod
6 import datetime
7 import logging
8 
9 from soco.core import SoCo
10 
12 from homeassistant.helpers.device_registry import DeviceInfo
13 from homeassistant.helpers.dispatcher import async_dispatcher_connect
14 from homeassistant.helpers.entity import Entity
15 
16 from .const import DATA_SONOS, DOMAIN, SONOS_FALLBACK_POLL, SONOS_STATE_UPDATED
17 from .exception import SonosUpdateError
18 from .speaker import SonosSpeaker
19 
20 _LOGGER = logging.getLogger(__name__)
21 
22 
24  """Representation of a Sonos entity."""
25 
26  _attr_should_poll = False
27  _attr_has_entity_name = True
28 
29  def __init__(self, speaker: SonosSpeaker) -> None:
30  """Initialize a SonosEntity."""
31  self.speakerspeaker = speaker
32 
33  async def async_added_to_hass(self) -> None:
34  """Handle common setup when added to hass."""
35  self.hasshass.data[DATA_SONOS].entity_id_mappings[self.entity_identity_id] = self.speakerspeaker
36  self.async_on_removeasync_on_remove(
38  self.hasshass,
39  f"{SONOS_FALLBACK_POLL}-{self.soco.uid}",
40  self.async_fallback_pollasync_fallback_poll,
41  )
42  )
43  self.async_on_removeasync_on_remove(
45  self.hasshass,
46  f"{SONOS_STATE_UPDATED}-{self.soco.uid}",
47  self.async_write_ha_stateasync_write_ha_state,
48  )
49  )
50 
51  async def async_will_remove_from_hass(self) -> None:
52  """Clean up when entity is removed."""
53  del self.hasshass.data[DATA_SONOS].entity_id_mappings[self.entity_identity_id]
54 
55  async def async_fallback_poll(self, now: datetime.datetime) -> None:
56  """Poll the entity if subscriptions fail."""
57  if not self.speakerspeaker.subscriptions_failed:
58  self.speakerspeaker.subscriptions_failed = True
59  await self.speakerspeaker.async_unsubscribe()
60  try:
61  await self._async_fallback_poll_async_fallback_poll()
62  except SonosUpdateError as err:
63  _LOGGER.debug("Could not fallback poll: %s", err)
64 
65  @abstractmethod
66  async def _async_fallback_poll(self) -> None:
67  """Poll the specific functionality if subscriptions fail.
68 
69  Should be implemented by platforms if needed.
70  """
71 
72  @property
73  def soco(self) -> SoCo:
74  """Return the speaker SoCo instance."""
75  return self.speakerspeaker.soco
76 
77  @property
78  def device_info(self) -> DeviceInfo:
79  """Return information about the device."""
80  suggested_area: str | None = None
81  if not self.speakerspeaker.battery_info:
82  # Only set suggested area for non-portable devices
83  suggested_area = self.speakerspeaker.zone_name
84  return DeviceInfo(
85  identifiers={(DOMAIN, self.socosoco.uid)},
86  name=self.speakerspeaker.zone_name,
87  model=self.speakerspeaker.model_name.replace("Sonos ", ""),
88  model_id=self.speakerspeaker.model_number,
89  sw_version=self.speakerspeaker.version,
90  connections={
91  (dr.CONNECTION_NETWORK_MAC, self.speakerspeaker.mac_address),
92  (dr.CONNECTION_UPNP, f"uuid:{self.speaker.uid}"),
93  },
94  manufacturer="Sonos",
95  suggested_area=suggested_area,
96  configuration_url=f"http://{self.soco.ip_address}:1400/support/review",
97  )
98 
99  @property
100  def available(self) -> bool:
101  """Return whether this device is available."""
102  return self.speakerspeaker.available
103 
104 
106  """Representation of a Sonos entity which may not support updating by subscriptions."""
107 
108  @abstractmethod
109  def poll_state(self) -> None:
110  """Poll the device for the current state."""
111 
112  def update(self) -> None:
113  """Update the state using the built-in entity poller."""
114  if not self.available:
115  return
116  try:
117  self.poll_state()
118  except SonosUpdateError as err:
119  _LOGGER.debug("Could not poll: %s", err)
None __init__(self, SonosSpeaker speaker)
Definition: entity.py:29
None async_fallback_poll(self, datetime.datetime now)
Definition: entity.py:55
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103