Handle Sonos connection errors during setup (#25135)

This commit is contained in:
Anders Melchiorsen 2019-07-14 23:36:05 +02:00 committed by Paulus Schoutsen
parent d91e5a6b66
commit 1798522ec8

View File

@ -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))