1 """Holiday Calendar."""
3 from __future__
import annotations
5 from datetime
import datetime, timedelta
7 from holidays
import HolidayBase, country_holidays
18 from .const
import CONF_PROVINCE, DOMAIN
22 country: str, province: str |
None, language: str
23 ) -> tuple[HolidayBase, str]:
24 """Get the object for the requested country and year."""
25 obj_holidays = country_holidays(
28 years={dt_util.now().year, dt_util.now().year + 1},
32 for lang
in obj_holidays.supported_languages:
33 if lang.startswith(
"en"):
34 obj_holidays = country_holidays(
37 years={dt_util.now().year, dt_util.now().year + 1},
43 obj_holidays.supported_languages
44 and language
not in obj_holidays.supported_languages
45 and (default_language := obj_holidays.default_language)
47 obj_holidays = country_holidays(
50 years={dt_util.now().year, dt_util.now().year + 1},
51 language=default_language,
53 language = default_language
55 return (obj_holidays, language)
60 config_entry: ConfigEntry,
61 async_add_entities: AddEntitiesCallback,
63 """Set up the Holiday Calendar config entry."""
64 country: str = config_entry.data[CONF_COUNTRY]
65 province: str |
None = config_entry.data.get(CONF_PROVINCE)
66 language = hass.config.language
68 obj_holidays, language = await hass.async_add_executor_job(
69 _get_obj_holidays_and_language, country, province, language
80 config_entry.entry_id,
88 """Representation of a Holiday Calendar element."""
90 _attr_has_entity_name =
True
92 _attr_event: CalendarEvent |
None =
None
93 _attr_should_poll =
False
94 unsub: CALLBACK_TYPE |
None =
None
100 province: str |
None,
102 obj_holidays: HolidayBase,
105 """Initialize HolidayCalendarEntity."""
112 identifiers={(DOMAIN, unique_id)},
113 entry_type=DeviceEntryType.SERVICE,
119 """Compute next time an update should occur."""
120 tomorrow = dt_util.as_local(now) +
timedelta(days=1)
121 return dt_util.start_of_local_day(tomorrow)
124 """Update state and setup listener for next interval."""
133 """Get the latest data and update state."""
138 """Set up first update."""
142 """Return the next upcoming event."""
144 for holiday_date, holiday_name
in sorted(
147 if holiday_date >= now.date():
148 next_holiday = (holiday_date, holiday_name)
151 if next_holiday
is None:
155 summary=next_holiday[1],
156 start=next_holiday[0],
162 def event(self) -> CalendarEvent | None:
163 """Return the next upcoming event."""
167 self, hass: HomeAssistant, start_date: datetime, end_date: datetime
168 ) -> list[CalendarEvent]:
169 """Get all events in a specific time frame."""
170 obj_holidays = country_holidays(
173 years=
list({start_date.year, end_date.year}),
177 event_list: list[CalendarEvent] = []
179 for holiday_date, holiday_name
in obj_holidays.items():
180 if start_date.date() <= holiday_date <= end_date.date():
182 summary=holiday_name,
187 event_list.append(event)
None async_write_ha_state(self)
CalendarEvent|None update_event(self, datetime now)
None point_in_time_listener(self, datetime time_date)
None async_added_to_hass(self)
CalendarEvent|None event(self)
None __init__(self, str name, str country, str|None province, str language, HolidayBase obj_holidays, str unique_id)
None _update_state_and_setup_listener(self)
list[CalendarEvent] async_get_events(self, HomeAssistant hass, datetime start_date, datetime end_date)
datetime get_next_interval(self, datetime now)
None async_write_ha_state(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
tuple[HolidayBase, str] _get_obj_holidays_and_language(str country, str|None province, str language)
CALLBACK_TYPE async_track_point_in_utc_time(HomeAssistant hass, HassJob[[datetime], Coroutine[Any, Any, None]|None]|Callable[[datetime], Coroutine[Any, Any, None]|None] action, datetime point_in_time)