Force an attempted subscribe on speaker reboot (#54100)

* Force an attempted subscribe on speaker reboot

* Recreate subscriptions and timers explicitly on speaker reboot

* only create poll timer if there is not one already

Co-authored-by: jjlawren <jjlawren@users.noreply.github.com>

* Black

Co-authored-by: jjlawren <jjlawren@users.noreply.github.com>
This commit is contained in:
Reuben Gow 2021-08-09 19:47:38 +01:00 committed by GitHub
parent a23da30c29
commit 74d41ac5e5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -496,9 +496,7 @@ class SonosSpeaker:
self.async_write_entity_states()
async def async_unseen(
self, now: datetime.datetime | None = None, will_reconnect: bool = False
) -> None:
async def async_unseen(self, now: datetime.datetime | None = None) -> None:
"""Make this player unavailable when it was not seen recently."""
if self._seen_timer:
self._seen_timer()
@ -527,9 +525,8 @@ class SonosSpeaker:
await self.async_unsubscribe()
if not will_reconnect:
self.hass.data[DATA_SONOS].discovery_known.discard(self.soco.uid)
self.async_write_entity_states()
self.hass.data[DATA_SONOS].discovery_known.discard(self.soco.uid)
self.async_write_entity_states()
async def async_rebooted(self, soco: SoCo) -> None:
"""Handle a detected speaker reboot."""
@ -538,8 +535,24 @@ class SonosSpeaker:
self.zone_name,
soco,
)
await self.async_unseen(will_reconnect=True)
await self.async_seen(soco)
await self.async_unsubscribe()
self.soco = soco
await self.async_subscribe()
if self._seen_timer:
self._seen_timer()
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()
#
# Battery management