Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Sensor platform for the Bring! integration."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from dataclasses import dataclass
7 from enum import StrEnum
8 
9 from bring_api import BringUserSettingsResponse
10 from bring_api.const import BRING_SUPPORTED_LOCALES
11 
13  SensorDeviceClass,
14  SensorEntity,
15  SensorEntityDescription,
16 )
17 from homeassistant.const import EntityCategory
18 from homeassistant.core import HomeAssistant
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 from homeassistant.helpers.typing import StateType
21 
22 from . import BringConfigEntry
23 from .const import UNIT_ITEMS
24 from .coordinator import BringData, BringDataUpdateCoordinator
25 from .entity import BringBaseEntity
26 from .util import list_language, sum_attributes
27 
28 
29 @dataclass(kw_only=True, frozen=True)
31  """Bring Sensor Description."""
32 
33  value_fn: Callable[[BringData, BringUserSettingsResponse], StateType]
34 
35 
36 class BringSensor(StrEnum):
37  """Bring sensors."""
38 
39  URGENT = "urgent"
40  CONVENIENT = "convenient"
41  DISCOUNTED = "discounted"
42  LIST_LANGUAGE = "list_language"
43  LIST_ACCESS = "list_access"
44 
45 
46 SENSOR_DESCRIPTIONS: tuple[BringSensorEntityDescription, ...] = (
48  key=BringSensor.URGENT,
49  translation_key=BringSensor.URGENT,
50  value_fn=lambda lst, _: sum_attributes(lst, "urgent"),
51  native_unit_of_measurement=UNIT_ITEMS,
52  ),
54  key=BringSensor.CONVENIENT,
55  translation_key=BringSensor.CONVENIENT,
56  value_fn=lambda lst, _: sum_attributes(lst, "convenient"),
57  native_unit_of_measurement=UNIT_ITEMS,
58  ),
60  key=BringSensor.DISCOUNTED,
61  translation_key=BringSensor.DISCOUNTED,
62  value_fn=lambda lst, _: sum_attributes(lst, "discounted"),
63  native_unit_of_measurement=UNIT_ITEMS,
64  ),
66  key=BringSensor.LIST_LANGUAGE,
67  translation_key=BringSensor.LIST_LANGUAGE,
68  value_fn=(
69  lambda lst, settings: x.lower()
70  if (x := list_language(lst["listUuid"], settings))
71  else None
72  ),
73  entity_category=EntityCategory.DIAGNOSTIC,
74  options=[x.lower() for x in BRING_SUPPORTED_LOCALES],
75  device_class=SensorDeviceClass.ENUM,
76  ),
78  key=BringSensor.LIST_ACCESS,
79  translation_key=BringSensor.LIST_ACCESS,
80  value_fn=lambda lst, _: lst["status"].lower(),
81  entity_category=EntityCategory.DIAGNOSTIC,
82  options=["registered", "shared", "invitation"],
83  device_class=SensorDeviceClass.ENUM,
84  ),
85 )
86 
87 
89  hass: HomeAssistant,
90  config_entry: BringConfigEntry,
91  async_add_entities: AddEntitiesCallback,
92 ) -> None:
93  """Set up the sensor platform."""
94  coordinator = config_entry.runtime_data
95 
98  coordinator,
99  bring_list,
100  description,
101  )
102  for description in SENSOR_DESCRIPTIONS
103  for bring_list in coordinator.data.values()
104  )
105 
106 
108  """A sensor entity."""
109 
110  entity_description: BringSensorEntityDescription
111 
112  def __init__(
113  self,
114  coordinator: BringDataUpdateCoordinator,
115  bring_list: BringData,
116  entity_description: BringSensorEntityDescription,
117  ) -> None:
118  """Initialize the entity."""
119  super().__init__(coordinator, bring_list)
120  self.entity_descriptionentity_description = entity_description
121  self._attr_unique_id_attr_unique_id = f"{coordinator.config_entry.unique_id}_{self._list_uuid}_{self.entity_description.key}"
122 
123  @property
124  def native_value(self) -> StateType:
125  """Return the state of the sensor."""
126 
127  return self.entity_descriptionentity_description.value_fn(
128  self.coordinator.data[self._list_uuid_list_uuid],
129  self.coordinator.user_settings,
130  )
None __init__(self, BringDataUpdateCoordinator coordinator, BringData bring_list, BringSensorEntityDescription entity_description)
Definition: sensor.py:117
None async_setup_entry(HomeAssistant hass, BringConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:92
str|None list_language(str list_uuid, BringUserSettingsResponse user_settings)
Definition: util.py:13
int sum_attributes(BringData bring_list, str attribute)
Definition: util.py:34