Fix Sonos has wrong grouping info at startup
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 17 Jan 2025 22:48:26 +0000 (23:48 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Fri, 17 Jan 2025 22:48:26 +0000 (23:48 +0100)
music_assistant/mass.py
music_assistant/providers/sonos/player.py
music_assistant/providers/sonos/provider.py

index d0295d627b554e3fef7f6e2beefa00d9e3e26ab1..b4e83ea873551a959476431c01ebb1422e8c9719 100644 (file)
@@ -421,15 +421,15 @@ class MusicAssistant:
                 "Non-Async operation detected: This method may only be called from the eventloop."
             )
 
-        def _create_task() -> None:
+        def _create_task(_target: Coroutine[Any, Any, _R]) -> None:
             self._tracked_timers.pop(task_id)
-            if TYPE_CHECKING:
-                target = cast(Coroutine[Any, Any, _R], target)  # noqa: F823
-            self.create_task(target, *args, task_id=task_id, abort_existing=True, **kwargs)
+            self.create_task(_target, *args, task_id=task_id, abort_existing=True, **kwargs)
 
         if asyncio.iscoroutinefunction(target) or asyncio.iscoroutine(target):
             # coroutine function
-            handle = self.loop.call_later(delay, _create_task)
+            if TYPE_CHECKING:
+                target = cast(Coroutine[Any, Any, _R], target)
+            handle = self.loop.call_later(delay, _create_task, target)
         else:
             # regular callable
             if TYPE_CHECKING:
index ee516d59e48c9ad96af4c4508663c9aa34f5fa19..561781628de55d2bcfcc1d563f362dd391e2ee88 100644 (file)
@@ -141,7 +141,7 @@ class SonosPlayer:
         # register callback for state changed
         self._on_cleanup_callbacks.append(
             self.client.subscribe(
-                self._on_player_event,
+                self.on_player_event,
                 (
                     SonosEventType.GROUP_UPDATED,
                     SonosEventType.PLAYER_UPDATED,
@@ -426,7 +426,7 @@ class SonosPlayer:
             await self.client.disconnect()
         self.logger.debug("Disconnected from player API")
 
-    def _on_player_event(self, event: SonosEvent) -> None:
+    def on_player_event(self, event: SonosEvent | None) -> None:
         """Handle incoming event from player."""
         self.update_attributes()
         self.mass.players.update(self.player_id)
index e446c1d8ba9d42b052c9abdf30418d47b26ce720..f9892fe58582d9118ede1949d024f3bcc3b40db7 100644 (file)
@@ -350,6 +350,10 @@ class SonosPlayerProvider(PlayerProvider):
             self, player_id, discovery_info=discovery_info, ip_address=address
         )
         await sonos_player.setup()
+        # trigger update on all existing players to update the group status
+        for _player in self.sonos_players.values():
+            if _player.player_id != player_id:
+                _player.on_player_event(None)
 
     async def _handle_sonos_queue_itemwindow(self, request: web.Request) -> web.Response:
         """