From b3e84c6ee8dc5d6880751666e3448bbea7c2f04b Mon Sep 17 00:00:00 2001 From: jjlawren Date: Thu, 26 Aug 2021 11:35:35 -0500 Subject: [PATCH] Set up polling task with subscriptions in Sonos (#54355) --- homeassistant/components/sonos/speaker.py | 32 +++++++++-------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/homeassistant/components/sonos/speaker.py b/homeassistant/components/sonos/speaker.py index 6f37739a17a..30d107bdd8d 100644 --- a/homeassistant/components/sonos/speaker.py +++ b/homeassistant/components/sonos/speaker.py @@ -323,6 +323,18 @@ class SonosSpeaker: async def async_subscribe(self) -> bool: """Initiate event subscriptions.""" _LOGGER.debug("Creating subscriptions for %s", self.zone_name) + + # Create a polling task in case subscriptions fail or callback events do not arrive + if not self._poll_timer: + self._poll_timer = self.hass.helpers.event.async_track_time_interval( + partial( + async_dispatcher_send, + self.hass, + f"{SONOS_POLL_UPDATE}-{self.soco.uid}", + ), + SCAN_INTERVAL, + ) + try: await self.hass.async_add_executor_job(self.set_basic_info) @@ -337,10 +349,10 @@ class SonosSpeaker: for service in SUBSCRIPTION_SERVICES ] await asyncio.gather(*subscriptions) - return True except SoCoException as ex: _LOGGER.warning("Could not connect %s: %s", self.zone_name, ex) return False + return True async def _subscribe( self, target: SubscriptionBase, sub_callback: Callable @@ -497,15 +509,6 @@ class SonosSpeaker: self.soco.ip_address, ) - self._poll_timer = self.hass.helpers.event.async_track_time_interval( - partial( - async_dispatcher_send, - self.hass, - f"{SONOS_POLL_UPDATE}-{self.soco.uid}", - ), - SCAN_INTERVAL, - ) - if self._is_ready and not self.subscriptions_failed: done = await self.async_subscribe() if not done: @@ -567,15 +570,6 @@ class SonosSpeaker: self._seen_timer = self.hass.helpers.event.async_call_later( SEEN_EXPIRE_TIME.total_seconds(), self.async_unseen ) - if not self._poll_timer: - self._poll_timer = self.hass.helpers.event.async_track_time_interval( - partial( - async_dispatcher_send, - self.hass, - f"{SONOS_POLL_UPDATE}-{self.soco.uid}", - ), - SCAN_INTERVAL, - ) self.async_write_entity_states() #