Home Assistant Unofficial Reference 2024.12.1
sensor.py
Go to the documentation of this file.
1 """Support for ReCollect Waste sensors."""
2 
3 from __future__ import annotations
4 
5 from datetime import date
6 
7 from aiorecollect.client import PickupEvent
8 
10  SensorDeviceClass,
11  SensorEntity,
12  SensorEntityDescription,
13 )
14 from homeassistant.config_entries import ConfigEntry
15 from homeassistant.core import HomeAssistant, callback
16 from homeassistant.helpers.entity_platform import AddEntitiesCallback
17 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
18 
19 from .const import DOMAIN, LOGGER
20 from .entity import ReCollectWasteEntity
21 from .util import async_get_pickup_type_names
22 
23 ATTR_PICKUP_TYPES = "pickup_types"
24 ATTR_AREA_NAME = "area_name"
25 
26 SENSOR_TYPE_CURRENT_PICKUP = "current_pickup"
27 SENSOR_TYPE_NEXT_PICKUP = "next_pickup"
28 
29 SENSOR_DESCRIPTIONS = (
31  key=SENSOR_TYPE_CURRENT_PICKUP,
32  translation_key=SENSOR_TYPE_CURRENT_PICKUP,
33  ),
35  key=SENSOR_TYPE_NEXT_PICKUP,
36  translation_key=SENSOR_TYPE_NEXT_PICKUP,
37  ),
38 )
39 
40 
42  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
43 ) -> None:
44  """Set up ReCollect Waste sensors based on a config entry."""
45  coordinator: DataUpdateCoordinator[list[PickupEvent]] = hass.data[DOMAIN][
46  entry.entry_id
47  ]
48 
50  ReCollectWasteSensor(coordinator, entry, description)
51  for description in SENSOR_DESCRIPTIONS
52  )
53 
54 
56  """Define a ReCollect Waste sensor."""
57 
58  _attr_device_class = SensorDeviceClass.DATE
59 
60  PICKUP_INDEX_MAP = {
61  SENSOR_TYPE_CURRENT_PICKUP: 1,
62  SENSOR_TYPE_NEXT_PICKUP: 2,
63  }
64 
65  def __init__(
66  self,
67  coordinator: DataUpdateCoordinator[list[PickupEvent]],
68  entry: ConfigEntry,
69  description: SensorEntityDescription,
70  ) -> None:
71  """Initialize."""
72  super().__init__(coordinator, entry)
73 
74  self._attr_unique_id_attr_unique_id = f"{self._identifier}_{description.key}"
75  self.entity_descriptionentity_description = description
76 
77  @callback
78  def _handle_coordinator_update(self) -> None:
79  """Handle updated data from the coordinator."""
80  relevant_events = (e for e in self.coordinator.data if e.date >= date.today())
81  pickup_index = self.PICKUP_INDEX_MAPPICKUP_INDEX_MAP[self.entity_descriptionentity_description.key]
82 
83  try:
84  for _ in range(pickup_index):
85  event = next(relevant_events)
86  except StopIteration:
87  LOGGER.debug("No pickup event found for %s", self.entity_descriptionentity_description.key)
88  self._attr_extra_state_attributes_attr_extra_state_attributes_attr_extra_state_attributes = {}
89  self._attr_native_value_attr_native_value = None
90  else:
91  self._attr_extra_state_attributes_attr_extra_state_attributes_attr_extra_state_attributes[ATTR_AREA_NAME] = event.area_name
92  self._attr_extra_state_attributes_attr_extra_state_attributes_attr_extra_state_attributes[ATTR_PICKUP_TYPES] = (
93  async_get_pickup_type_names(self._entry_entry, event.pickup_types)
94  )
95  self._attr_native_value_attr_native_value = event.date
96 
None __init__(self, DataUpdateCoordinator[list[PickupEvent]] coordinator, ConfigEntry entry, SensorEntityDescription description)
Definition: sensor.py:70
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: sensor.py:43
list[str] async_get_pickup_type_names(ConfigEntry entry, list[PickupType] pickup_types)
Definition: util.py:13