Home Assistant Unofficial Reference 2024.12.1
calendar.py
Go to the documentation of this file.
1 """Calendar platform for Withings."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Callable
6 from datetime import datetime
7 
8 from aiowithings import WithingsClient, WorkoutCategory
9 
10 from homeassistant.components.calendar import CalendarEntity, CalendarEvent
11 from homeassistant.const import Platform
12 from homeassistant.core import HomeAssistant
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15 
16 from . import DOMAIN, WithingsConfigEntry
17 from .coordinator import WithingsWorkoutDataUpdateCoordinator
18 from .entity import WithingsEntity
19 
20 
22  hass: HomeAssistant,
23  entry: WithingsConfigEntry,
24  async_add_entities: AddEntitiesCallback,
25 ) -> None:
26  """Set up the calendar platform for entity."""
27  ent_reg = er.async_get(hass)
28  withings_data = entry.runtime_data
29 
30  workout_coordinator = withings_data.workout_coordinator
31 
32  calendar_setup_before = ent_reg.async_get_entity_id(
33  Platform.CALENDAR,
34  DOMAIN,
35  f"withings_{entry.unique_id}_workout",
36  )
37 
38  if workout_coordinator.data is not None or calendar_setup_before:
40  [WithingsWorkoutCalendarEntity(withings_data.client, workout_coordinator)],
41  )
42  else:
43  remove_calendar_listener: Callable[[], None]
44 
45  def _async_add_calendar_entity() -> None:
46  """Add calendar entity."""
47  if workout_coordinator.data is not None:
49  [
51  withings_data.client, workout_coordinator
52  )
53  ],
54  )
55  remove_calendar_listener()
56 
57  remove_calendar_listener = workout_coordinator.async_add_listener(
58  _async_add_calendar_entity
59  )
60 
61 
62 def get_event_name(category: WorkoutCategory) -> str:
63  """Return human-readable category."""
64  name = category.name.lower().capitalize()
65  return name.replace("_", " ")
66 
67 
69  WithingsEntity[WithingsWorkoutDataUpdateCoordinator], CalendarEntity
70 ):
71  """A calendar entity."""
72 
73  _attr_translation_key = "workout"
74 
75  def __init__(
76  self, client: WithingsClient, coordinator: WithingsWorkoutDataUpdateCoordinator
77  ) -> None:
78  """Create the Calendar entity."""
79  super().__init__(coordinator, "workout")
80  self.clientclient = client
81 
82  @property
83  def event(self) -> CalendarEvent | None:
84  """Return the next upcoming event."""
85  return None
86 
87  async def async_get_events(
88  self, hass: HomeAssistant, start_date: datetime, end_date: datetime
89  ) -> list[CalendarEvent]:
90  """Get all events in a specific time frame."""
91  workouts = await self.clientclient.get_workouts_in_period(
92  start_date.date(), end_date.date()
93  )
94  event_list = []
95  for workout in workouts:
96  event = CalendarEvent(
97  start=workout.start_date,
98  end=workout.end_date,
99  summary=get_event_name(workout.category),
100  )
101 
102  event_list.append(event)
103 
104  return event_list
list[CalendarEvent] async_get_events(self, HomeAssistant hass, datetime start_date, datetime end_date)
Definition: calendar.py:89
None __init__(self, WithingsClient client, WithingsWorkoutDataUpdateCoordinator coordinator)
Definition: calendar.py:77
str get_event_name(WorkoutCategory category)
Definition: calendar.py:62
None async_setup_entry(HomeAssistant hass, WithingsConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: calendar.py:25