Home Assistant Unofficial Reference 2024.12.1
calendar.py
Go to the documentation of this file.
1 """Support for Twente Milieu Calendar."""
2 
3 from __future__ import annotations
4 
5 from datetime import datetime, timedelta
6 
7 from homeassistant.components.calendar import CalendarEntity, CalendarEvent
8 from homeassistant.const import CONF_ID
9 from homeassistant.core import HomeAssistant, callback
10 from homeassistant.helpers.entity_platform import AddEntitiesCallback
11 import homeassistant.util.dt as dt_util
12 
13 from . import TwenteMilieuConfigEntry
14 from .const import WASTE_TYPE_TO_DESCRIPTION
15 from .entity import TwenteMilieuEntity
16 
17 
19  hass: HomeAssistant,
20  entry: TwenteMilieuConfigEntry,
21  async_add_entities: AddEntitiesCallback,
22 ) -> None:
23  """Set up Twente Milieu calendar based on a config entry."""
25 
26 
28  """Defines a Twente Milieu calendar."""
29 
30  _attr_has_entity_name = True
31  _attr_name = None
32  _attr_translation_key = "calendar"
33 
34  def __init__(self, entry: TwenteMilieuConfigEntry) -> None:
35  """Initialize the Twente Milieu entity."""
36  super().__init__(entry)
37  self._attr_unique_id_attr_unique_id = str(entry.data[CONF_ID])
38  self._event_event: CalendarEvent | None = None
39 
40  @property
41  def event(self) -> CalendarEvent | None:
42  """Return the next upcoming event."""
43  return self._event_event
44 
45  async def async_get_events(
46  self, hass: HomeAssistant, start_date: datetime, end_date: datetime
47  ) -> list[CalendarEvent]:
48  """Return calendar events within a datetime range."""
49  events: list[CalendarEvent] = []
50  for waste_type, waste_dates in self.coordinator.data.items():
51  events.extend(
53  summary=WASTE_TYPE_TO_DESCRIPTION[waste_type],
54  start=waste_date,
55  end=waste_date + timedelta(days=1),
56  )
57  for waste_date in waste_dates
58  if start_date.date() <= waste_date <= end_date.date()
59  )
60 
61  return events
62 
63  @callback
64  def _handle_coordinator_update(self) -> None:
65  """Handle updated data from the coordinator."""
66  next_waste_pickup_type = None
67  next_waste_pickup_date = None
68  for waste_type, waste_dates in self.coordinator.data.items():
69  if (
70  waste_dates
71  and (
72  next_waste_pickup_date is None
73  or waste_dates[0] # type: ignore[unreachable]
74  < next_waste_pickup_date
75  )
76  and waste_dates[0] >= dt_util.now().date()
77  ):
78  next_waste_pickup_date = waste_dates[0]
79  next_waste_pickup_type = waste_type
80 
81  self._event_event = None
82  if next_waste_pickup_date is not None and next_waste_pickup_type is not None:
83  self._event_event = CalendarEvent(
84  summary=WASTE_TYPE_TO_DESCRIPTION[next_waste_pickup_type],
85  start=next_waste_pickup_date,
86  end=next_waste_pickup_date + timedelta(days=1),
87  )
88 
90 
91  async def async_added_to_hass(self) -> None:
92  """When entity is added to hass."""
93  await super().async_added_to_hass()
94  self._handle_coordinator_update_handle_coordinator_update()
list[CalendarEvent] async_get_events(self, HomeAssistant hass, datetime start_date, datetime end_date)
Definition: calendar.py:47
None __init__(self, TwenteMilieuConfigEntry entry)
Definition: calendar.py:34
None async_setup_entry(HomeAssistant hass, TwenteMilieuConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: calendar.py:22