108 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
"""Sensor for Last.fm account status."""
 | 
						|
 | 
						|
from __future__ import annotations
 | 
						|
 | 
						|
import hashlib
 | 
						|
from typing import Any
 | 
						|
 | 
						|
from homeassistant.components.sensor import SensorEntity
 | 
						|
from homeassistant.config_entries import ConfigEntry
 | 
						|
from homeassistant.core import HomeAssistant
 | 
						|
from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
 | 
						|
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
 | 
						|
from homeassistant.helpers.update_coordinator import CoordinatorEntity
 | 
						|
 | 
						|
from .const import (
 | 
						|
    ATTR_LAST_PLAYED,
 | 
						|
    ATTR_PLAY_COUNT,
 | 
						|
    ATTR_TOP_PLAYED,
 | 
						|
    CONF_USERS,
 | 
						|
    DEFAULT_NAME,
 | 
						|
    DOMAIN,
 | 
						|
    STATE_NOT_SCROBBLING,
 | 
						|
)
 | 
						|
from .coordinator import LastFMDataUpdateCoordinator, LastFMUserData
 | 
						|
 | 
						|
 | 
						|
async def async_setup_entry(
 | 
						|
    hass: HomeAssistant,
 | 
						|
    entry: ConfigEntry,
 | 
						|
    async_add_entities: AddConfigEntryEntitiesCallback,
 | 
						|
) -> None:
 | 
						|
    """Initialize the entries."""
 | 
						|
 | 
						|
    coordinator: LastFMDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
 | 
						|
    async_add_entities(
 | 
						|
        (
 | 
						|
            LastFmSensor(coordinator, username, entry.entry_id)
 | 
						|
            for username in entry.options[CONF_USERS]
 | 
						|
        ),
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
class LastFmSensor(CoordinatorEntity[LastFMDataUpdateCoordinator], SensorEntity):
 | 
						|
    """A class for the Last.fm account."""
 | 
						|
 | 
						|
    _attr_attribution = "Data provided by Last.fm"
 | 
						|
    _attr_translation_key = "lastfm"
 | 
						|
    _attr_has_entity_name = True
 | 
						|
    _attr_name = None
 | 
						|
 | 
						|
    def __init__(
 | 
						|
        self,
 | 
						|
        coordinator: LastFMDataUpdateCoordinator,
 | 
						|
        username: str,
 | 
						|
        entry_id: str,
 | 
						|
    ) -> None:
 | 
						|
        """Initialize the sensor."""
 | 
						|
        super().__init__(coordinator)
 | 
						|
        self._username = username
 | 
						|
        self._attr_unique_id = hashlib.sha256(username.encode("utf-8")).hexdigest()
 | 
						|
        self._attr_device_info = DeviceInfo(
 | 
						|
            configuration_url="https://www.last.fm",
 | 
						|
            entry_type=DeviceEntryType.SERVICE,
 | 
						|
            identifiers={(DOMAIN, f"{entry_id}_{self._attr_unique_id}")},
 | 
						|
            manufacturer=DEFAULT_NAME,
 | 
						|
            name=f"{DEFAULT_NAME} {username}",
 | 
						|
        )
 | 
						|
 | 
						|
    @property
 | 
						|
    def user_data(self) -> LastFMUserData | None:
 | 
						|
        """Returns the user from the coordinator."""
 | 
						|
        return self.coordinator.data.get(self._username)
 | 
						|
 | 
						|
    @property
 | 
						|
    def available(self) -> bool:
 | 
						|
        """If user not found in coordinator, entity is unavailable."""
 | 
						|
        return super().available and self.user_data is not None
 | 
						|
 | 
						|
    @property
 | 
						|
    def entity_picture(self) -> str | None:
 | 
						|
        """Return user avatar."""
 | 
						|
        if self.user_data and self.user_data.image is not None:
 | 
						|
            return self.user_data.image
 | 
						|
        return None
 | 
						|
 | 
						|
    @property
 | 
						|
    def native_value(self) -> str:
 | 
						|
        """Return value of sensor."""
 | 
						|
        if self.user_data and self.user_data.now_playing is not None:
 | 
						|
            return self.user_data.now_playing
 | 
						|
        return STATE_NOT_SCROBBLING
 | 
						|
 | 
						|
    @property
 | 
						|
    def extra_state_attributes(self) -> dict[str, Any]:
 | 
						|
        """Return state attributes."""
 | 
						|
        play_count = None
 | 
						|
        last_track = None
 | 
						|
        top_track = None
 | 
						|
        if self.user_data:
 | 
						|
            play_count = self.user_data.play_count
 | 
						|
            last_track = self.user_data.last_track
 | 
						|
            top_track = self.user_data.top_track
 | 
						|
        return {
 | 
						|
            ATTR_PLAY_COUNT: play_count,
 | 
						|
            ATTR_LAST_PLAYED: last_track,
 | 
						|
            ATTR_TOP_PLAYED: top_track,
 | 
						|
        }
 |