mirror of
https://github.com/home-assistant/core.git
synced 2025-04-26 10:17:51 +00:00
Poll cast groups when media player is added or reconnected (#74610)
This commit is contained in:
parent
2169b70874
commit
996544da2d
@ -37,7 +37,7 @@ class ChromecastInfo:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def friendly_name(self) -> str:
|
def friendly_name(self) -> str:
|
||||||
"""Return the UUID."""
|
"""Return the Friendly Name."""
|
||||||
return self.cast_info.friendly_name
|
return self.cast_info.friendly_name
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -441,6 +441,19 @@ class CastMediaPlayerEntity(CastDevice, MediaPlayerEntity):
|
|||||||
connection_status.status,
|
connection_status.status,
|
||||||
)
|
)
|
||||||
self._attr_available = new_available
|
self._attr_available = new_available
|
||||||
|
if new_available and not self._cast_info.is_audio_group:
|
||||||
|
# Poll current group status
|
||||||
|
for group_uuid in self.mz_mgr.get_multizone_memberships(
|
||||||
|
self._cast_info.uuid
|
||||||
|
):
|
||||||
|
group_media_controller = self.mz_mgr.get_multizone_mediacontroller(
|
||||||
|
group_uuid
|
||||||
|
)
|
||||||
|
if not group_media_controller:
|
||||||
|
continue
|
||||||
|
self.multizone_new_media_status(
|
||||||
|
group_uuid, group_media_controller.status
|
||||||
|
)
|
||||||
self.schedule_update_ha_state()
|
self.schedule_update_ha_state()
|
||||||
|
|
||||||
def multizone_new_media_status(self, group_uuid, media_status):
|
def multizone_new_media_status(self, group_uuid, media_status):
|
||||||
|
@ -733,6 +733,20 @@ async def test_entity_availability(hass: HomeAssistant):
|
|||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state == "off"
|
assert state.state == "off"
|
||||||
|
|
||||||
|
connection_status = MagicMock()
|
||||||
|
connection_status.status = "LOST"
|
||||||
|
conn_status_cb(connection_status)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state.state == "unavailable"
|
||||||
|
|
||||||
|
connection_status = MagicMock()
|
||||||
|
connection_status.status = "CONNECTED"
|
||||||
|
conn_status_cb(connection_status)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state.state == "off"
|
||||||
|
|
||||||
connection_status = MagicMock()
|
connection_status = MagicMock()
|
||||||
connection_status.status = "DISCONNECTED"
|
connection_status.status = "DISCONNECTED"
|
||||||
conn_status_cb(connection_status)
|
conn_status_cb(connection_status)
|
||||||
@ -740,6 +754,14 @@ async def test_entity_availability(hass: HomeAssistant):
|
|||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state == "unavailable"
|
assert state.state == "unavailable"
|
||||||
|
|
||||||
|
# Can't reconnect after receiving DISCONNECTED
|
||||||
|
connection_status = MagicMock()
|
||||||
|
connection_status.status = "CONNECTED"
|
||||||
|
conn_status_cb(connection_status)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state.state == "unavailable"
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("port,entry_type", ((8009, None), (12345, None)))
|
@pytest.mark.parametrize("port,entry_type", ((8009, None), (12345, None)))
|
||||||
async def test_device_registry(hass: HomeAssistant, hass_ws_client, port, entry_type):
|
async def test_device_registry(hass: HomeAssistant, hass_ws_client, port, entry_type):
|
||||||
@ -1677,6 +1699,59 @@ async def test_group_media_states(hass, mz_mock):
|
|||||||
assert state.state == "playing"
|
assert state.state == "playing"
|
||||||
|
|
||||||
|
|
||||||
|
async def test_group_media_states_early(hass, mz_mock):
|
||||||
|
"""Test media states are read from group if entity has no state.
|
||||||
|
|
||||||
|
This tests case asserts group state is polled when the player is created.
|
||||||
|
"""
|
||||||
|
entity_id = "media_player.speaker"
|
||||||
|
reg = er.async_get(hass)
|
||||||
|
|
||||||
|
info = get_fake_chromecast_info()
|
||||||
|
|
||||||
|
mz_mock.get_multizone_memberships = MagicMock(return_value=[str(FakeGroupUUID)])
|
||||||
|
mz_mock.get_multizone_mediacontroller = MagicMock(
|
||||||
|
return_value=MagicMock(status=MagicMock(images=None, player_state="BUFFERING"))
|
||||||
|
)
|
||||||
|
|
||||||
|
chromecast, _ = await async_setup_media_player_cast(hass, info)
|
||||||
|
_, conn_status_cb, _, _ = get_status_callbacks(chromecast, mz_mock)
|
||||||
|
|
||||||
|
state = hass.states.get(entity_id)
|
||||||
|
assert state is not None
|
||||||
|
assert state.name == "Speaker"
|
||||||
|
assert state.state == "unavailable"
|
||||||
|
assert entity_id == reg.async_get_entity_id("media_player", "cast", str(info.uuid))
|
||||||
|
|
||||||
|
# Check group state is polled when player is first created
|
||||||
|
connection_status = MagicMock()
|
||||||
|
connection_status.status = "CONNECTED"
|
||||||
|
conn_status_cb(connection_status)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert hass.states.get(entity_id).state == "buffering"
|
||||||
|
|
||||||
|
connection_status = MagicMock()
|
||||||
|
connection_status.status = "LOST"
|
||||||
|
conn_status_cb(connection_status)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert hass.states.get(entity_id).state == "unavailable"
|
||||||
|
|
||||||
|
# Check group state is polled when player reconnects
|
||||||
|
mz_mock.get_multizone_mediacontroller = MagicMock(
|
||||||
|
return_value=MagicMock(status=MagicMock(images=None, player_state="PLAYING"))
|
||||||
|
)
|
||||||
|
|
||||||
|
connection_status = MagicMock()
|
||||||
|
connection_status.status = "CONNECTED"
|
||||||
|
conn_status_cb(connection_status)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert hass.states.get(entity_id).state == "playing"
|
||||||
|
|
||||||
|
|
||||||
async def test_group_media_control(hass, mz_mock, quick_play_mock):
|
async def test_group_media_control(hass, mz_mock, quick_play_mock):
|
||||||
"""Test media controls are handled by group if entity has no state."""
|
"""Test media controls are handled by group if entity has no state."""
|
||||||
entity_id = "media_player.speaker"
|
entity_id = "media_player.speaker"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user