Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Platform for sensor integration."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from typing import Any
8 
10  SensorDeviceClass,
11  SensorEntity,
12  SensorEntityDescription,
13 )
14 from homeassistant.config_entries import ConfigEntry
15 from homeassistant.core import HomeAssistant
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 from homeassistant.helpers.typing import StateType
18 
19 from . import MonzoCoordinator
20 from .const import DOMAIN
21 from .coordinator import MonzoData
22 from .entity import MonzoBaseEntity
23 
24 
25 @dataclass(frozen=True, kw_only=True)
27  """Describes Monzo sensor entity."""
28 
29  value_fn: Callable[[dict[str, Any]], StateType]
30 
31 
32 ACCOUNT_SENSORS = (
34  key="balance",
35  translation_key="balance",
36  value_fn=lambda data: data["balance"]["balance"] / 100,
37  device_class=SensorDeviceClass.MONETARY,
38  native_unit_of_measurement="GBP",
39  suggested_display_precision=2,
40  ),
42  key="total_balance",
43  translation_key="total_balance",
44  value_fn=lambda data: data["balance"]["total_balance"] / 100,
45  device_class=SensorDeviceClass.MONETARY,
46  native_unit_of_measurement="GBP",
47  suggested_display_precision=2,
48  ),
49 )
50 
51 POT_SENSORS = (
53  key="pot_balance",
54  translation_key="pot_balance",
55  value_fn=lambda data: data["balance"] / 100,
56  device_class=SensorDeviceClass.MONETARY,
57  native_unit_of_measurement="GBP",
58  suggested_display_precision=2,
59  ),
60 )
61 
62 MODEL_POT = "Pot"
63 
64 
66  hass: HomeAssistant,
67  config_entry: ConfigEntry,
68  async_add_entities: AddEntitiesCallback,
69 ) -> None:
70  """Defer sensor setup to the shared sensor module."""
71  coordinator: MonzoCoordinator = hass.data[DOMAIN][config_entry.entry_id]
72 
73  accounts = [
75  coordinator,
76  entity_description,
77  index,
78  account["name"],
79  lambda x: x.accounts,
80  )
81  for entity_description in ACCOUNT_SENSORS
82  for index, account in enumerate(coordinator.data.accounts)
83  ]
84 
85  pots = [
86  MonzoSensor(coordinator, entity_description, index, MODEL_POT, lambda x: x.pots)
87  for entity_description in POT_SENSORS
88  for index, _pot in enumerate(coordinator.data.pots)
89  ]
90 
91  async_add_entities(accounts + pots)
92 
93 
95  """Represents a Monzo sensor."""
96 
97  entity_description: MonzoSensorEntityDescription
98 
99  def __init__(
100  self,
101  coordinator: MonzoCoordinator,
102  entity_description: MonzoSensorEntityDescription,
103  index: int,
104  device_model: str,
105  data_accessor: Callable[[MonzoData], list[dict[str, Any]]],
106  ) -> None:
107  """Initialize the sensor."""
108  super().__init__(coordinator, index, device_model, data_accessor)
109  self.entity_descriptionentity_description = entity_description
110  self._attr_unique_id_attr_unique_id = f"{self.data['id']}_{entity_description.key}"
111 
112  @property
113  def native_value(self) -> StateType:
114  """Return the state."""
115 
116  try:
117  state = self.entity_descriptionentity_description.value_fn(self.datadatadata)
118  except (KeyError, ValueError):
119  return None
120 
121  return state
None __init__(self, MonzoCoordinator coordinator, MonzoSensorEntityDescription entity_description, int index, str device_model, Callable[[MonzoData], list[dict[str, Any]]] data_accessor)
Definition: sensor.py:106
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:69