Home Assistant Unofficial Reference 2024.12.1
calendar.py
Go to the documentation of this file.
1 """Rain Bird irrigation calendar."""
2 
3 from __future__ import annotations
4 
5 from datetime import datetime
6 import logging
7 
8 from homeassistant.components.calendar import CalendarEntity, CalendarEvent
9 from homeassistant.core import HomeAssistant
10 from homeassistant.exceptions import HomeAssistantError
11 from homeassistant.helpers.device_registry import DeviceInfo
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 from homeassistant.helpers.update_coordinator import CoordinatorEntity
14 from homeassistant.util import dt as dt_util
15 
16 from .coordinator import RainbirdScheduleUpdateCoordinator
17 from .types import RainbirdConfigEntry
18 
19 _LOGGER = logging.getLogger(__name__)
20 
21 
23  hass: HomeAssistant,
24  config_entry: RainbirdConfigEntry,
25  async_add_entities: AddEntitiesCallback,
26 ) -> None:
27  """Set up entry for a Rain Bird irrigation calendar."""
28  data = config_entry.runtime_data
29  if not data.model_info.model_info.max_programs:
30  return
31 
33  [
35  data.schedule_coordinator,
36  data.coordinator.unique_id,
37  data.coordinator.device_info,
38  data.coordinator.device_name,
39  )
40  ]
41  )
42 
43 
45  CoordinatorEntity[RainbirdScheduleUpdateCoordinator], CalendarEntity
46 ):
47  """A calendar event entity."""
48 
49  _attr_has_entity_name = True
50  _attr_name: str | None = None
51  _attr_translation_key = "calendar"
52 
53  def __init__(
54  self,
55  coordinator: RainbirdScheduleUpdateCoordinator,
56  unique_id: str | None,
57  device_info: DeviceInfo | None,
58  device_name: str,
59  ) -> None:
60  """Create the Calendar event device."""
61  super().__init__(coordinator)
62  self._event: CalendarEvent | None = None
63  if unique_id is not None:
64  self._attr_unique_id_attr_unique_id = unique_id
65  self._attr_device_info_attr_device_info = device_info
66  else:
67  self._attr_name_attr_name = device_name
68 
69  @property
70  def event(self) -> CalendarEvent | None:
71  """Return the next upcoming event."""
72  schedule = self.coordinator.data
73  if not schedule:
74  return None
75  cursor = schedule.timeline_tz(dt_util.get_default_time_zone()).active_after(
76  dt_util.now()
77  )
78  program_event = next(cursor, None)
79  if not program_event:
80  return None
81  return CalendarEvent(
82  summary=program_event.program_id.name,
83  start=dt_util.as_local(program_event.start),
84  end=dt_util.as_local(program_event.end),
85  rrule=program_event.rrule_str,
86  )
87 
88  async def async_get_events(
89  self, hass: HomeAssistant, start_date: datetime, end_date: datetime
90  ) -> list[CalendarEvent]:
91  """Get all events in a specific time frame."""
92  schedule = self.coordinator.data
93  if not schedule:
94  raise HomeAssistantError(
95  "Unable to get events: No data from controller yet"
96  )
97  cursor = schedule.timeline_tz(start_date.tzinfo).overlapping(
98  start_date,
99  end_date,
100  )
101  return [
103  summary=program_event.program_id.name,
104  start=dt_util.as_local(program_event.start),
105  end=dt_util.as_local(program_event.end),
106  rrule=program_event.rrule_str,
107  )
108  for program_event in cursor
109  ]
110 
111  async def async_added_to_hass(self) -> None:
112  """When entity is added to hass."""
113  await super().async_added_to_hass()
114 
115  # We do not ask for an update with async_add_entities()
116  # because it will update disabled entities. This is started as a
117  # task to let it sync in the background without blocking startup
118  self.coordinator.config_entry.async_create_background_task(
119  self.hasshasshass,
120  self.coordinator.async_request_refresh(),
121  "rainbird.calendar-refresh",
122  )
None __init__(self, RainbirdScheduleUpdateCoordinator coordinator, str|None unique_id, DeviceInfo|None device_info, str device_name)
Definition: calendar.py:59
list[CalendarEvent] async_get_events(self, HomeAssistant hass, datetime start_date, datetime end_date)
Definition: calendar.py:90
None async_setup_entry(HomeAssistant hass, RainbirdConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: calendar.py:26