mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 19:27:45 +00:00
Use entity class attributes for Cast (#53348)
This commit is contained in:
parent
736577abef
commit
13443310fe
@ -160,6 +160,9 @@ class CastDevice(MediaPlayerEntity):
|
||||
"elected leader" itself.
|
||||
"""
|
||||
|
||||
_attr_should_poll = False
|
||||
_attr_media_image_remotely_accessible = True
|
||||
|
||||
def __init__(self, cast_info: ChromecastInfo) -> None:
|
||||
"""Initialize the cast device."""
|
||||
|
||||
@ -172,12 +175,21 @@ class CastDevice(MediaPlayerEntity):
|
||||
self.mz_media_status: dict[str, pychromecast.controllers.media.MediaStatus] = {}
|
||||
self.mz_media_status_received: dict[str, datetime] = {}
|
||||
self.mz_mgr = None
|
||||
self._available = False
|
||||
self._attr_available = False
|
||||
self._status_listener: CastStatusListener | None = None
|
||||
self._hass_cast_controller: HomeAssistantController | None = None
|
||||
|
||||
self._add_remove_handler = None
|
||||
self._cast_view_remove_handler = None
|
||||
self._attr_unique_id = cast_info.uuid
|
||||
self._attr_name = cast_info.friendly_name
|
||||
if cast_info.model_name != "Google Cast Group":
|
||||
self._attr_device_info = {
|
||||
"name": str(cast_info.friendly_name),
|
||||
"identifiers": {(CAST_DOMAIN, str(cast_info.uuid).replace("-", ""))},
|
||||
"model": cast_info.model_name,
|
||||
"manufacturer": str(cast_info.manufacturer),
|
||||
}
|
||||
|
||||
async def async_added_to_hass(self):
|
||||
"""Create chromecast object when added to hass."""
|
||||
@ -239,7 +251,7 @@ class CastDevice(MediaPlayerEntity):
|
||||
self.mz_mgr = self.hass.data[CAST_MULTIZONE_MANAGER_KEY]
|
||||
|
||||
self._status_listener = CastStatusListener(self, chromecast, self.mz_mgr)
|
||||
self._available = False
|
||||
self._attr_available = False
|
||||
self.cast_status = chromecast.status
|
||||
self.media_status = chromecast.media_controller.status
|
||||
self._chromecast.start()
|
||||
@ -255,7 +267,7 @@ class CastDevice(MediaPlayerEntity):
|
||||
self.entity_id,
|
||||
self._cast_info.friendly_name,
|
||||
)
|
||||
self._available = False
|
||||
self._attr_available = False
|
||||
self.async_write_ha_state()
|
||||
|
||||
await self.hass.async_add_executor_job(self._chromecast.disconnect)
|
||||
@ -282,6 +294,10 @@ class CastDevice(MediaPlayerEntity):
|
||||
def new_cast_status(self, cast_status):
|
||||
"""Handle updates of the cast status."""
|
||||
self.cast_status = cast_status
|
||||
self._attr_volume_level = cast_status.volume_level if cast_status else None
|
||||
self._attr_is_volume_muted = (
|
||||
cast_status.volume_muted if self.cast_status else None
|
||||
)
|
||||
self.schedule_update_ha_state()
|
||||
|
||||
def new_media_status(self, media_status):
|
||||
@ -334,13 +350,13 @@ class CastDevice(MediaPlayerEntity):
|
||||
connection_status.status,
|
||||
)
|
||||
if connection_status.status == CONNECTION_STATUS_DISCONNECTED:
|
||||
self._available = False
|
||||
self._attr_available = False
|
||||
self._invalidate()
|
||||
self.schedule_update_ha_state()
|
||||
return
|
||||
|
||||
new_available = connection_status.status == CONNECTION_STATUS_CONNECTED
|
||||
if new_available != self._available:
|
||||
if new_available != self.available:
|
||||
# Connection status callbacks happen often when disconnected.
|
||||
# Only update state when availability changed to put less pressure
|
||||
# on state machine.
|
||||
@ -350,7 +366,7 @@ class CastDevice(MediaPlayerEntity):
|
||||
self._cast_info.friendly_name,
|
||||
connection_status.status,
|
||||
)
|
||||
self._available = new_available
|
||||
self._attr_available = new_available
|
||||
self.schedule_update_ha_state()
|
||||
|
||||
def multizone_new_media_status(self, group_uuid, media_status):
|
||||
@ -527,32 +543,6 @@ class CastDevice(MediaPlayerEntity):
|
||||
media_id, media_type, **kwargs.get(ATTR_MEDIA_EXTRA, {})
|
||||
)
|
||||
|
||||
# ========== Properties ==========
|
||||
@property
|
||||
def should_poll(self):
|
||||
"""No polling needed."""
|
||||
return False
|
||||
|
||||
@property
|
||||
def name(self):
|
||||
"""Return the name of the device."""
|
||||
return self._cast_info.friendly_name
|
||||
|
||||
@property
|
||||
def device_info(self):
|
||||
"""Return information about the device."""
|
||||
cast_info = self._cast_info
|
||||
|
||||
if cast_info.model_name == "Google Cast Group":
|
||||
return None
|
||||
|
||||
return {
|
||||
"name": cast_info.friendly_name,
|
||||
"identifiers": {(CAST_DOMAIN, cast_info.uuid.replace("-", ""))},
|
||||
"model": cast_info.model_name,
|
||||
"manufacturer": cast_info.manufacturer,
|
||||
}
|
||||
|
||||
def _media_status(self):
|
||||
"""
|
||||
Return media status.
|
||||
@ -589,21 +579,6 @@ class CastDevice(MediaPlayerEntity):
|
||||
return STATE_OFF
|
||||
return None
|
||||
|
||||
@property
|
||||
def available(self):
|
||||
"""Return True if the cast device is connected."""
|
||||
return self._available
|
||||
|
||||
@property
|
||||
def volume_level(self):
|
||||
"""Volume level of the media player (0..1)."""
|
||||
return self.cast_status.volume_level if self.cast_status else None
|
||||
|
||||
@property
|
||||
def is_volume_muted(self):
|
||||
"""Boolean if volume is currently muted."""
|
||||
return self.cast_status.volume_muted if self.cast_status else None
|
||||
|
||||
@property
|
||||
def media_content_id(self):
|
||||
"""Content ID of current playing media."""
|
||||
@ -641,11 +616,6 @@ class CastDevice(MediaPlayerEntity):
|
||||
|
||||
return images[0].url if images and images[0].url else None
|
||||
|
||||
@property
|
||||
def media_image_remotely_accessible(self) -> bool:
|
||||
"""If the image url is remotely accessible."""
|
||||
return True
|
||||
|
||||
@property
|
||||
def media_title(self):
|
||||
"""Title of current playing media."""
|
||||
@ -748,11 +718,6 @@ class CastDevice(MediaPlayerEntity):
|
||||
media_status_recevied = self._media_status()[1]
|
||||
return media_status_recevied
|
||||
|
||||
@property
|
||||
def unique_id(self) -> str | None:
|
||||
"""Return a unique ID."""
|
||||
return self._cast_info.uuid
|
||||
|
||||
async def _async_cast_discovered(self, discover: ChromecastInfo):
|
||||
"""Handle discovery of new Chromecast."""
|
||||
if self._cast_info.uuid != discover.uuid:
|
||||
|
Loading…
x
Reference in New Issue
Block a user