diff --git a/custom_components/loe_outages/calendar.py b/custom_components/loe_outages/calendar.py index 11e7dae..fad6849 100644 --- a/custom_components/loe_outages/calendar.py +++ b/custom_components/loe_outages/calendar.py @@ -52,16 +52,7 @@ def event(self) -> CalendarEvent | None: """Return the current or next upcoming event or None.""" now = dt_utils.now() LOGGER.debug("Getting current event for %s", now) - interval = self.coordinator.get_event_at(now) - if not interval: - return None - - return CalendarEvent( - summary=interval.state, - start=interval.startTime, - end=interval.endTime, - description=interval.state, - ) + return self.coordinator.get_calendar_at(now) async def async_get_events( self, @@ -71,14 +62,4 @@ async def async_get_events( ) -> list[CalendarEvent]: """Return calendar events within a datetime range.""" LOGGER.debug('Getting all events between "%s" -> "%s"', start_date, end_date) - intervals = self.coordinator.get_events_between(start_date, end_date) - - return [ - CalendarEvent( - summary=interval.state, - start=interval.startTime, - end=interval.endTime, - description=interval.state, - ) - for interval in intervals - ] + return self.coordinator.get_calendar_between(start_date, end_date) diff --git a/custom_components/loe_outages/coordinator.py b/custom_components/loe_outages/coordinator.py index 4993957..6fe34c9 100644 --- a/custom_components/loe_outages/coordinator.py +++ b/custom_components/loe_outages/coordinator.py @@ -4,6 +4,7 @@ import logging from .models import Interval +from homeassistant.components.calendar import CalendarEvent from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.translation import async_get_translations @@ -141,7 +142,7 @@ def current_state(self) -> str: def get_event_at(self, at: datetime.datetime) -> Interval: """Get the current event.""" event = self.api.get_current_event(at) - return self._get_calendar_event(event, translate=False) + return self._get_interval_event(event, translate=False) def get_events_between( self, @@ -150,13 +151,31 @@ def get_events_between( *, translate: bool = True, ) -> list[Interval]: + """Get all events.""" + events = self.api.get_events(start_date, end_date) + return [ + self._get_interval_event(event, translate=translate) for event in events + ] + + def get_calendar_at(self, at: datetime.datetime) -> CalendarEvent: + """Get the current event.""" + event = self.api.get_current_event(at) + return self._get_calendar_event(event, translate=False) + + def get_calendar_between( + self, + start_date: datetime.datetime, + end_date: datetime.datetime, + *, + translate: bool = True, + ) -> list[CalendarEvent]: """Get all events.""" events = self.api.get_events(start_date, end_date) return [ self._get_calendar_event(event, translate=translate) for event in events ] - def _get_calendar_event( + def _get_interval_event( self, event: dict | None, *, @@ -184,6 +203,35 @@ def _get_calendar_event( endTime=event_end, ) + def _get_calendar_event( + self, + event: dict | None, + *, + translate: bool = True, + ) -> CalendarEvent: + """Transform an event into a Inteval.""" + if not event: + return None + + event_summary = event["state"] + translated_summary = self.event_name_map.get(event_summary) + event_start = dt_utils.as_local(event["startTime"]) + event_end = dt_utils.as_local(event["endTime"]) + + LOGGER.debug( + "Transforming event: %s (%s -> %s)", + event_summary, + event_start, + event_end, + ) + + return CalendarEvent( + summary=translated_summary if translate else event_summary, + start=event_start, + end=event_end, + description=event_summary, + ) + def _event_to_state(self, event: Interval | None) -> str: state = event.state if event else None return { diff --git a/custom_components/loe_outages/translations/uk.json b/custom_components/loe_outages/translations/uk.json index 24758ba..dd4d1f5 100644 --- a/custom_components/loe_outages/translations/uk.json +++ b/custom_components/loe_outages/translations/uk.json @@ -1,70 +1,70 @@ { - "title": "ЛОЕ Відключення", - "config": { - "step": { - "user": { - "title": "Налаштування ЛОЕ Відключення", - "description": "Оберіть свою групу:", - "data": { - "group": "Група" - }, - "data_description": { - "group": "Знайдіть свою групу на: https://poweron.loe.lviv.ua/shedule-off" - } + "title": "ЛОЕ Відключення", + "config": { + "step": { + "user": { + "title": "Налаштування ЛОЕ Відключення", + "description": "Оберіть свою групу:", + "data": { + "group": "Група" + }, + "data_description": { + "group": "Знайдіть свою групу на: https://poweron.loe.lviv.ua/shedule-off" } } - }, - "options": { - "step": { - "init": { - "title": "Опції ЛОЕ Відключення", - "description": "Оберіть іншу групу:", - "data": { - "group": "Група" - }, - "data_description": { - "group": "Знайдіть свою групу на: https://poweron.loe.lviv.ua/shedule-off" - } + } + }, + "options": { + "step": { + "init": { + "title": "Опції ЛОЕ Відключення", + "description": "Оберіть іншу групу:", + "data": { + "group": "Група" + }, + "data_description": { + "group": "Знайдіть свою групу на: https://poweron.loe.lviv.ua/shedule-off" } } - }, - "device": { - "loe_outages": { - "name": "ЛОЕ Група {group}" - } - }, - "entity": { + } + }, + "device": { + "loe_outages": { + "name": "ЛОЕ Група {group}" + } + }, + "entity": { + "calendar": { "calendar": { - "calendar": { - "name": "Графік відключень", - "state_attributes": { - "message": { - "name": "Підключення", - "state": { - "poweroff": "Відключення" - } + "name": "Графік відключень", + "state_attributes": { + "message": { + "name": "Підключення", + "state": { + "poweroff": "Відключення" } } } - }, - "sensor": { - "electricity": { - "name": "Електрика", - "state": { - "poweron": "Заживлено", - "poweroff": "Відключення" - } - }, - "next_outage": { - "name": "Наступне відключення" - }, - "next_connectivity": { - "name": "Наступне харчування" - } } }, - "common": { - "electricity_on": "Заживлено", - "electricity_off": "Відключення" + "sensor": { + "electricity": { + "name": "Електрика", + "state": { + "poweron": "Заживлено", + "poweroff": "Відключення" + } + }, + "next_outage": { + "name": "Наступне відключення" + }, + "next_connectivity": { + "name": "Наступне заживлення" + } } - } \ No newline at end of file + }, + "common": { + "electricity_on": "Заживлено", + "electricity_off": "Відключення" + } +} diff --git a/requirements.txt b/requirements.txt index 41feb39..a55b53d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ homeassistant==2024.7.0 pip>=21.0,<24.2 pre-commit>=3.7.1 +pytz==2024.1 ruff==0.5.0