mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 03:07:37 +00:00
Handle Sonos connection errors during setup (#25135)
This commit is contained in:
parent
d91e5a6b66
commit
1798522ec8
@ -342,12 +342,21 @@ class SonosEntity(MediaPlayerDevice):
|
|||||||
self._seen_timer = self.hass.helpers.event.async_call_later(
|
self._seen_timer = self.hass.helpers.event.async_call_later(
|
||||||
2.5*DISCOVERY_INTERVAL, self.async_unseen)
|
2.5*DISCOVERY_INTERVAL, self.async_unseen)
|
||||||
|
|
||||||
if not was_available:
|
if was_available:
|
||||||
await self.hass.async_add_executor_job(self._attach_player)
|
return
|
||||||
self.async_schedule_update_ha_state()
|
|
||||||
|
self._poll_timer = self.hass.helpers.event.async_track_time_interval(
|
||||||
|
self.update, datetime.timedelta(seconds=SCAN_INTERVAL))
|
||||||
|
|
||||||
|
done = await self.hass.async_add_executor_job(self._attach_player)
|
||||||
|
if not done:
|
||||||
|
self._seen_timer()
|
||||||
|
self.async_unseen()
|
||||||
|
|
||||||
|
self.async_schedule_update_ha_state()
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def async_unseen(self, now):
|
def async_unseen(self, now=None):
|
||||||
"""Make this player unavailable when it was not seen recently."""
|
"""Make this player unavailable when it was not seen recently."""
|
||||||
self._seen_timer = None
|
self._seen_timer = None
|
||||||
|
|
||||||
@ -396,29 +405,31 @@ class SonosEntity(MediaPlayerDevice):
|
|||||||
|
|
||||||
def _attach_player(self):
|
def _attach_player(self):
|
||||||
"""Get basic information and add event subscriptions."""
|
"""Get basic information and add event subscriptions."""
|
||||||
self._shuffle = self.soco.shuffle
|
try:
|
||||||
self.update_volume()
|
self._shuffle = self.soco.shuffle
|
||||||
self._set_favorites()
|
self.update_volume()
|
||||||
|
self._set_favorites()
|
||||||
|
|
||||||
self._poll_timer = self.hass.helpers.event.track_time_interval(
|
# New player available, build the current group topology
|
||||||
self.update, datetime.timedelta(seconds=SCAN_INTERVAL))
|
for entity in self.hass.data[DATA_SONOS].entities:
|
||||||
|
entity.update_groups()
|
||||||
|
|
||||||
# New player available, build the current group topology
|
player = self.soco
|
||||||
for entity in self.hass.data[DATA_SONOS].entities:
|
|
||||||
entity.update_groups()
|
|
||||||
|
|
||||||
player = self.soco
|
def subscribe(service, action):
|
||||||
|
"""Add a subscription to a pysonos service."""
|
||||||
|
queue = _ProcessSonosEventQueue(action)
|
||||||
|
sub = service.subscribe(auto_renew=True, event_queue=queue)
|
||||||
|
self._subscriptions.append(sub)
|
||||||
|
|
||||||
def subscribe(service, action):
|
subscribe(player.avTransport, self.update_media)
|
||||||
"""Add a subscription to a pysonos service."""
|
subscribe(player.renderingControl, self.update_volume)
|
||||||
queue = _ProcessSonosEventQueue(action)
|
subscribe(player.zoneGroupTopology, self.update_groups)
|
||||||
sub = service.subscribe(auto_renew=True, event_queue=queue)
|
subscribe(player.contentDirectory, self.update_content)
|
||||||
self._subscriptions.append(sub)
|
return True
|
||||||
|
except SoCoException as ex:
|
||||||
subscribe(player.avTransport, self.update_media)
|
_LOGGER.warning("Could not connect %s: %s", self.entity_id, ex)
|
||||||
subscribe(player.renderingControl, self.update_volume)
|
return False
|
||||||
subscribe(player.zoneGroupTopology, self.update_groups)
|
|
||||||
subscribe(player.contentDirectory, self.update_content)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def should_poll(self):
|
def should_poll(self):
|
||||||
@ -656,6 +667,11 @@ class SonosEntity(MediaPlayerDevice):
|
|||||||
|
|
||||||
async def _async_handle_group_event(event):
|
async def _async_handle_group_event(event):
|
||||||
"""Get async lock and handle event."""
|
"""Get async lock and handle event."""
|
||||||
|
if event and self._poll_timer:
|
||||||
|
# Cancel poll timer since we do receive events
|
||||||
|
self._poll_timer()
|
||||||
|
self._poll_timer = None
|
||||||
|
|
||||||
async with self.hass.data[DATA_SONOS].topology_condition:
|
async with self.hass.data[DATA_SONOS].topology_condition:
|
||||||
group = await _async_extract_group(event)
|
group = await _async_extract_group(event)
|
||||||
|
|
||||||
@ -664,14 +680,8 @@ class SonosEntity(MediaPlayerDevice):
|
|||||||
|
|
||||||
self.hass.data[DATA_SONOS].topology_condition.notify_all()
|
self.hass.data[DATA_SONOS].topology_condition.notify_all()
|
||||||
|
|
||||||
if event:
|
if event and not hasattr(event, 'zone_player_uui_ds_in_group'):
|
||||||
# Cancel poll timer since we do receive events
|
return
|
||||||
if self._poll_timer:
|
|
||||||
self._poll_timer()
|
|
||||||
self._poll_timer = None
|
|
||||||
|
|
||||||
if not hasattr(event, 'zone_player_uui_ds_in_group'):
|
|
||||||
return
|
|
||||||
|
|
||||||
self.hass.add_job(_async_handle_group_event(event))
|
self.hass.add_job(_async_handle_group_event(event))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user