Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Sensor for Last.fm account status."""
2 
3 from __future__ import annotations
4 
5 import hashlib
6 from typing import Any
7 
8 from homeassistant.components.sensor import SensorEntity
9 from homeassistant.config_entries import ConfigEntry
10 from homeassistant.core import HomeAssistant
11 from homeassistant.helpers.device_registry import DeviceEntryType, DeviceInfo
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 from homeassistant.helpers.update_coordinator import CoordinatorEntity
14 
15 from .const import (
16  ATTR_LAST_PLAYED,
17  ATTR_PLAY_COUNT,
18  ATTR_TOP_PLAYED,
19  CONF_USERS,
20  DEFAULT_NAME,
21  DOMAIN,
22  STATE_NOT_SCROBBLING,
23 )
24 from .coordinator import LastFMDataUpdateCoordinator, LastFMUserData
25 
26 
28  hass: HomeAssistant,
29  entry: ConfigEntry,
30  async_add_entities: AddEntitiesCallback,
31 ) -> None:
32  """Initialize the entries."""
33 
34  coordinator: LastFMDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
36  (
37  LastFmSensor(coordinator, username, entry.entry_id)
38  for username in entry.options[CONF_USERS]
39  ),
40  )
41 
42 
43 class LastFmSensor(CoordinatorEntity[LastFMDataUpdateCoordinator], SensorEntity):
44  """A class for the Last.fm account."""
45 
46  _attr_attribution = "Data provided by Last.fm"
47  _attr_translation_key = "lastfm"
48  _attr_has_entity_name = True
49  _attr_name = None
50 
51  def __init__(
52  self,
53  coordinator: LastFMDataUpdateCoordinator,
54  username: str,
55  entry_id: str,
56  ) -> None:
57  """Initialize the sensor."""
58  super().__init__(coordinator)
59  self._username_username = username
60  self._attr_unique_id_attr_unique_id = hashlib.sha256(username.encode("utf-8")).hexdigest()
61  self._attr_device_info_attr_device_info = DeviceInfo(
62  configuration_url="https://www.last.fm",
63  entry_type=DeviceEntryType.SERVICE,
64  identifiers={(DOMAIN, f"{entry_id}_{self._attr_unique_id}")},
65  manufacturer=DEFAULT_NAME,
66  name=f"{DEFAULT_NAME} {username}",
67  )
68 
69  @property
70  def user_data(self) -> LastFMUserData | None:
71  """Returns the user from the coordinator."""
72  return self.coordinator.data.get(self._username_username)
73 
74  @property
75  def available(self) -> bool:
76  """If user not found in coordinator, entity is unavailable."""
77  return super().available and self.user_datauser_data is not None
78 
79  @property
80  def entity_picture(self) -> str | None:
81  """Return user avatar."""
82  if self.user_datauser_data and self.user_datauser_data.image is not None:
83  return self.user_datauser_data.image
84  return None
85 
86  @property
87  def native_value(self) -> str:
88  """Return value of sensor."""
89  if self.user_datauser_data and self.user_datauser_data.now_playing is not None:
90  return self.user_datauser_data.now_playing
91  return STATE_NOT_SCROBBLING
92 
93  @property
94  def extra_state_attributes(self) -> dict[str, Any]:
95  """Return state attributes."""
96  play_count = None
97  last_track = None
98  top_track = None
99  if self.user_datauser_data:
100  play_count = self.user_datauser_data.play_count
101  last_track = self.user_datauser_data.last_track
102  top_track = self.user_datauser_data.top_track
103  return {
104  ATTR_PLAY_COUNT: play_count,
105  ATTR_LAST_PLAYED: last_track,
106  ATTR_TOP_PLAYED: top_track,
107  }
None __init__(self, LastFMDataUpdateCoordinator coordinator, str username, str entry_id)
Definition: sensor.py:56
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:31