Fix: correctly map player availability state for ha players
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 5 Feb 2025 21:54:04 +0000 (22:54 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Wed, 5 Feb 2025 21:54:04 +0000 (22:54 +0100)
music_assistant/providers/hass/constants.py
music_assistant/providers/hass_players/__init__.py

index 7e81837d26c2500585f5fefa1ef7cdcfcefe69c7..a29486b05b4622241562dc341e3985f979f87f73 100644 (file)
@@ -47,3 +47,4 @@ StateMap = {
 
 # HA states that we consider as "powered off"
 OFF_STATES = ("unavailable", "unknown", "standby", "off")
+UNAVAILABLE_STATES = ("unavailable", "unknown")
index d75ee45bc32a9b4364db8b13db4a2b6154604321..8c8a4652668525a7f763029df406f5ae44177bfa 100644 (file)
@@ -33,7 +33,12 @@ from music_assistant.helpers.datetime import from_iso_string
 from music_assistant.helpers.tags import async_parse_tags
 from music_assistant.models.player_provider import PlayerProvider
 from music_assistant.providers.hass import DOMAIN as HASS_DOMAIN
-from music_assistant.providers.hass.constants import OFF_STATES, MediaPlayerEntityFeature, StateMap
+from music_assistant.providers.hass.constants import (
+    OFF_STATES,
+    UNAVAILABLE_STATES,
+    MediaPlayerEntityFeature,
+    StateMap,
+)
 
 if TYPE_CHECKING:
     from collections.abc import AsyncGenerator
@@ -403,7 +408,7 @@ class HomeAssistantPlayers(PlayerProvider):
             provider=self.lookup_key,
             type=PlayerType.PLAYER,
             name=state["attributes"]["friendly_name"],
-            available=state["state"] not in ("unavailable", "unknown"),
+            available=state["state"] not in UNAVAILABLE_STATES,
             device_info=DeviceInfo.from_dict(dev_info),
             state=StateMap.get(state["state"], PlayerState.IDLE),
             extra_data={
@@ -435,7 +440,7 @@ class HomeAssistantPlayers(PlayerProvider):
             and MediaPlayerEntityFeature.TURN_OFF in hass_supported_features
         ):
             player.supported_features.add(PlayerFeature.POWER)
-            player.powered = state["state"] not in ("unavailable", "unknown", "standby", "off")
+            player.powered = state["state"] not in OFF_STATES
 
         self._update_player_attributes(player, state["attributes"])
         await self.mass.players.register_or_update(player)
@@ -456,6 +461,7 @@ class HomeAssistantPlayers(PlayerProvider):
                 return
             if "s" in state:
                 player.state = StateMap.get(state["s"], PlayerState.IDLE)
+                player.available = state["s"] not in UNAVAILABLE_STATES
                 if PlayerFeature.POWER in player.supported_features:
                     player.powered = state["s"] not in OFF_STATES
             if "a" in state: