Home Assistant Unofficial Reference 2024.12.1
calendar.py
Go to the documentation of this file.
1 """Support for ReCollect Waste calendars."""
2 
3 from __future__ import annotations
4 
5 import datetime
6 
7 from aiorecollect.client import PickupEvent
8 
9 from homeassistant.components.calendar import CalendarEntity, CalendarEvent
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.core import HomeAssistant, callback
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
14 
15 from .const import DOMAIN
16 from .entity import ReCollectWasteEntity
17 from .util import async_get_pickup_type_names
18 
19 
20 @callback
22  entry: ConfigEntry, pickup_event: PickupEvent
23 ) -> CalendarEvent:
24  """Get a HASS CalendarEvent from an aiorecollect PickupEvent."""
25  pickup_type_string = ", ".join(
26  async_get_pickup_type_names(entry, pickup_event.pickup_types)
27  )
28  return CalendarEvent(
29  summary="ReCollect Waste Pickup",
30  description=f"Pickup types: {pickup_type_string}",
31  location=pickup_event.area_name,
32  start=pickup_event.date,
33  end=pickup_event.date + datetime.timedelta(days=1),
34  )
35 
36 
38  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
39 ) -> None:
40  """Set up ReCollect Waste sensors based on a config entry."""
41  coordinator: DataUpdateCoordinator[list[PickupEvent]] = hass.data[DOMAIN][
42  entry.entry_id
43  ]
44 
45  async_add_entities([ReCollectWasteCalendar(coordinator, entry)])
46 
47 
49  """Define a ReCollect Waste calendar."""
50 
51  _attr_name = None
52  _attr_translation_key = "calendar"
53 
54  def __init__(
55  self,
56  coordinator: DataUpdateCoordinator[list[PickupEvent]],
57  entry: ConfigEntry,
58  ) -> None:
59  """Initialize the ReCollect Waste entity."""
60  super().__init__(coordinator, entry)
61 
62  self._attr_unique_id_attr_unique_id = self._identifier_identifier
63  self._event_event: CalendarEvent | None = None
64 
65  @property
66  def event(self) -> CalendarEvent | None:
67  """Return the next upcoming event."""
68  return self._event_event
69 
70  @callback
71  def _handle_coordinator_update(self) -> None:
72  """Handle updated data from the coordinator."""
73  try:
74  current_event = next(
75  event
76  for event in self.coordinator.data
77  if event.date >= datetime.date.today()
78  )
79  except StopIteration:
80  self._event_event = None
81  else:
83  self._entry_entry, current_event
84  )
85 
87 
88  async def async_get_events(
89  self,
90  hass: HomeAssistant,
91  start_date: datetime.datetime,
92  end_date: datetime.datetime,
93  ) -> list[CalendarEvent]:
94  """Return calendar events within a datetime range."""
95  return [
97  for event in self.coordinator.data
98  ]
list[CalendarEvent] async_get_events(self, HomeAssistant hass, datetime.datetime start_date, datetime.datetime end_date)
Definition: calendar.py:93
None __init__(self, DataUpdateCoordinator[list[PickupEvent]] coordinator, ConfigEntry entry)
Definition: calendar.py:58
CalendarEvent async_get_calendar_event_from_pickup_event(ConfigEntry entry, PickupEvent pickup_event)
Definition: calendar.py:23
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: calendar.py:39
list[str] async_get_pickup_type_names(ConfigEntry entry, list[PickupType] pickup_types)
Definition: util.py:13