110 lines
3.5 KiB
Python
110 lines
3.5 KiB
Python
"""Media Player platform for Tessie integration."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from homeassistant.components.media_player import (
|
|
MediaPlayerDeviceClass,
|
|
MediaPlayerEntity,
|
|
MediaPlayerState,
|
|
)
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.core import HomeAssistant
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
|
|
from .const import DOMAIN
|
|
from .coordinator import TessieStateUpdateCoordinator
|
|
from .entity import TessieEntity
|
|
|
|
STATES = {
|
|
"Playing": MediaPlayerState.PLAYING,
|
|
"Paused": MediaPlayerState.PAUSED,
|
|
"Stopped": MediaPlayerState.IDLE,
|
|
}
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
|
) -> None:
|
|
"""Set up the Tessie Media platform from a config entry."""
|
|
data = hass.data[DOMAIN][entry.entry_id]
|
|
|
|
async_add_entities(TessieMediaEntity(vehicle.state_coordinator) for vehicle in data)
|
|
|
|
|
|
class TessieMediaEntity(TessieEntity, MediaPlayerEntity):
|
|
"""Vehicle Location Media Class."""
|
|
|
|
_attr_device_class = MediaPlayerDeviceClass.SPEAKER
|
|
|
|
def __init__(
|
|
self,
|
|
coordinator: TessieStateUpdateCoordinator,
|
|
) -> None:
|
|
"""Initialize the media player entity."""
|
|
super().__init__(coordinator, "media")
|
|
|
|
@property
|
|
def state(self) -> MediaPlayerState:
|
|
"""State of the player."""
|
|
return STATES.get(
|
|
self.get("vehicle_state_media_info_media_playback_status"),
|
|
MediaPlayerState.OFF,
|
|
)
|
|
|
|
@property
|
|
def volume_level(self) -> float:
|
|
"""Volume level of the media player (0..1)."""
|
|
return self.get("vehicle_state_media_info_audio_volume", 0) / self.get(
|
|
"vehicle_state_media_info_audio_volume_max", 10.333333
|
|
)
|
|
|
|
@property
|
|
def media_duration(self) -> int | None:
|
|
"""Duration of current playing media in seconds."""
|
|
if duration := self.get("vehicle_state_media_info_now_playing_duration"):
|
|
return duration / 1000
|
|
return None
|
|
|
|
@property
|
|
def media_position(self) -> int | None:
|
|
"""Position of current playing media in seconds."""
|
|
# Return media position only when a media duration is > 0
|
|
if self.get("vehicle_state_media_info_now_playing_duration"):
|
|
return self.get("vehicle_state_media_info_now_playing_elapsed") / 1000
|
|
return None
|
|
|
|
@property
|
|
def media_title(self) -> str | None:
|
|
"""Title of current playing media."""
|
|
if title := self.get("vehicle_state_media_info_now_playing_title"):
|
|
return title
|
|
return None
|
|
|
|
@property
|
|
def media_artist(self) -> str | None:
|
|
"""Artist of current playing media, music track only."""
|
|
if artist := self.get("vehicle_state_media_info_now_playing_artist"):
|
|
return artist
|
|
return None
|
|
|
|
@property
|
|
def media_album_name(self) -> str | None:
|
|
"""Album name of current playing media, music track only."""
|
|
if album := self.get("vehicle_state_media_info_now_playing_album"):
|
|
return album
|
|
return None
|
|
|
|
@property
|
|
def media_playlist(self) -> str | None:
|
|
"""Title of Playlist currently playing."""
|
|
if playlist := self.get("vehicle_state_media_info_now_playing_station"):
|
|
return playlist
|
|
return None
|
|
|
|
@property
|
|
def source(self) -> str | None:
|
|
"""Name of the current input source."""
|
|
if source := self.get("vehicle_state_media_info_now_playing_source"):
|
|
return source
|
|
return None
|