diff --git a/contributing.md b/contributing.md index 4fc3f22..4b1b9dc 100644 --- a/contributing.md +++ b/contributing.md @@ -8,7 +8,6 @@ Only native speaker can translate to specific language. 1. Copy `custom_components/yasno_outages/translations/en.json` file and name it with appropriate language code. 1. Translate only keys in this file, not values. -1. Mention your translation in `readme.md` file. 1. Open a PR. 1. Find someone to check and approve your PR. diff --git a/custom_components/yasno_outages/__init__.py b/custom_components/yasno_outages/__init__.py index a5fb35a..bde1b52 100644 --- a/custom_components/yasno_outages/__init__.py +++ b/custom_components/yasno_outages/__init__.py @@ -7,6 +7,7 @@ from homeassistant.const import Platform +from .const import CONF_CITY, DEFAULT_CITY from .coordinator import YasnoOutagesCoordinator if TYPE_CHECKING: @@ -18,6 +19,26 @@ PLATFORMS = [Platform.CALENDAR, Platform.SENSOR] +async def async_migrate_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> bool: + """Migrate old entry.""" + LOGGER.debug( + "Migrating configuration from version %s.%s", + config_entry.version, + config_entry.minor_version, + ) + + version = config_entry.version + + if version == 1: + LOGGER.debug("Migrating: city is set to default city (%s).", DEFAULT_CITY) + data = {**config_entry.data} + if CONF_CITY not in data: + data[CONF_CITY] = DEFAULT_CITY + hass.config_entries.async_update_entry(config_entry, data=data, version=2) + + return True + + async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a new entry.""" LOGGER.info("Setup entry: %s", entry) diff --git a/custom_components/yasno_outages/api.py b/custom_components/yasno_outages/api.py index bcc05a8..7fbce16 100644 --- a/custom_components/yasno_outages/api.py +++ b/custom_components/yasno_outages/api.py @@ -2,47 +2,83 @@ import datetime import logging -from pathlib import Path -import recurring_ical_events -from icalendar import Calendar - -from .const import CALENDAR_PATH +import requests +from dateutil.rrule import WEEKLY, rrule LOGGER = logging.getLogger(__name__) +API_ENDPOINT = ( + "https://api.yasno.com.ua/api/v1/pages/home/schedule-turn-off-electricity" +) +START_OF_DAY = 0 +END_OF_DAY = 24 + class YasnoOutagesApi: - """Class to interact with calendar files for Yasno outages.""" + """Class to interact with Yasno outages API.""" - calendar: recurring_ical_events.UnfoldableCalendar | None + """Group name format""" + group_name = "group_{group}" - def __init__(self, group: int) -> None: + def __init__(self, city: str | None = None, group: str | None = None) -> None: """Initialize the YasnoOutagesApi.""" self.group = group - self.calendar = None + self.city = city + self.api_url = API_ENDPOINT + self.schedule = None + + def _extract_schedule(self, data: dict) -> dict: + """Extract schedule from the API response.""" + schedule_component = next( + ( + item + for item in data["components"] + if item["template_name"] == "electricity-outages-schedule" + ), + None, + ) + if schedule_component: + return schedule_component["schedule"] + LOGGER.error("Schedule component not found in the API response.") + return None + + def _build_event_hour( + self, + date: datetime.datetime, + start_hour: int, + ) -> datetime.datetime: + return date.replace(hour=start_hour, minute=0, second=0, microsecond=0) + + def fetch_schedule(self) -> None: + """Fetch outages from the API.""" + try: + response = requests.get(self.api_url, timeout=60) + response.raise_for_status() + self.schedule = self._extract_schedule(response.json()) + except requests.RequestException as error: + LOGGER.exception("Error fetching schedule from Yasno API: %s", error) # noqa: TRY401 + self.schedule = {} - @property - def calendar_path(self) -> Path: - """Return the path to the ICS file.""" - return Path(__file__).parent / CALENDAR_PATH.format(group=self.group) + def get_cities(self) -> list[str]: + """Get a list of available cities.""" + return list(self.schedule.keys()) - def fetch_calendar(self) -> None: - """Fetch outages from the ICS file.""" - if not self.calendar: - with self.calendar_path.open() as file: - ical = Calendar.from_ical(file.read()) - self.calendar = recurring_ical_events.of(ical) - return self.calendar + def get_city_groups(self, city: str) -> dict[str, list]: + """Get all schedules for all of available groups for a city.""" + return self.schedule.get(city, {}) + + def get_group_schedule(self, city: str, group: int) -> list: + """Get the schedule for a specific group.""" + city_groups = self.get_city_groups(city) + return city_groups.get(self.group_name.format(group=group), []) def get_current_event(self, at: datetime.datetime) -> dict: """Get the current event.""" - if not self.calendar: - return None - events_at = self.calendar.at(at) - if not events_at: - return None - return events_at[0] # return only the first event + for event in self.get_events(at, at + datetime.timedelta(hours=1)): + if event["start"] <= at < event["end"]: + return event + return None def get_events( self, @@ -50,6 +86,44 @@ def get_events( end_date: datetime.datetime, ) -> list[dict]: """Get all events.""" - if not self.calendar: - return [] - return self.calendar.between(start_date, end_date) + group_schedule = self.get_group_schedule(self.city, self.group) + events = [] + + # For each day of the week in the schedule + for dow, day_events in enumerate(group_schedule): + # Build a recurrence rule the events between start and end dates + recurrance_rule = rrule( + WEEKLY, + dtstart=start_date, + until=end_date, + byweekday=dow, + ) + + # For each event in the day + for event in day_events: + event_start_hour = event["start"] + event_end_hour = event["end"] + + if event_end_hour == END_OF_DAY: + event_end_hour = START_OF_DAY + + # For each date in the recurrence rule + for dt in recurrance_rule: + event_start = self._build_event_hour(dt, event_start_hour) + event_end = self._build_event_hour(dt, event_end_hour) + if event_end_hour == START_OF_DAY: + event_end += datetime.timedelta(days=1) + if ( + start_date <= event_start <= end_date + or start_date <= event_end <= end_date + ): + events.append( + { + "summary": event["type"], + "start": event_start, + "end": event_end, + }, + ) + + # Sort events by start time to ensure correct order + return sorted(events, key=lambda event: event["start"]) diff --git a/custom_components/yasno_outages/config_flow.py b/custom_components/yasno_outages/config_flow.py index 834fd50..e4d0f15 100644 --- a/custom_components/yasno_outages/config_flow.py +++ b/custom_components/yasno_outages/config_flow.py @@ -11,11 +11,22 @@ OptionsFlow, ) from homeassistant.core import callback -from homeassistant.helpers.selector import selector +from homeassistant.helpers.selector import ( + SelectSelector, + SelectSelectorConfig, +) + +from .api import YasnoOutagesApi +from .const import CONF_CITY, CONF_GROUP, DEFAULT_CITY, DEFAULT_GROUP, DOMAIN, NAME + +LOGGER = logging.getLogger(__name__) + +GROUP_PREFIX = "group_" -from .const import CONF_GROUP, DEFAULT_GROUP, DOMAIN -_LOGGER = logging.getLogger(__name__) +def extract_group_index(group: str) -> str: + """Extract the group index from the group name.""" + return group[len(GROUP_PREFIX) :] def get_config_value( @@ -29,22 +40,45 @@ def get_config_value( return default -def build_schema(config_entry: ConfigEntry) -> vol.Schema: - """Build the schema for the config flow.""" +def build_city_schema(api: YasnoOutagesApi, config_entry: ConfigEntry) -> vol.Schema: + """Build the schema for the city selection step.""" + cities = api.get_cities() + return vol.Schema( + { + vol.Required( + CONF_CITY, + default=get_config_value(config_entry, CONF_CITY, DEFAULT_CITY), + ): SelectSelector( + SelectSelectorConfig( + options=cities, + translation_key="city", + ), + ), + }, + ) + + +def build_group_schema( + api: YasnoOutagesApi, + config_entry: ConfigEntry, + data: dict, +) -> vol.Schema: + """Build the schema for the group selection step.""" + city = data[CONF_CITY] + groups = api.get_city_groups(city).keys() + group_indexes = [extract_group_index(group) for group in groups] + LOGGER.debug("Getting %s groups: %s", city, groups) + return vol.Schema( { vol.Required( CONF_GROUP, default=get_config_value(config_entry, CONF_GROUP, DEFAULT_GROUP), - ): selector( - { - "select": { - "options": [ - {"value": str(i), "label": f"Group {i}"} - for i in range(1, 7) - ], - }, - }, + ): SelectSelector( + SelectSelectorConfig( + options=group_indexes, + translation_key="group", + ), ), }, ) @@ -56,16 +90,43 @@ class YasnoOutagesOptionsFlow(OptionsFlow): def __init__(self, config_entry: ConfigEntry) -> None: """Initialize options flow.""" self.config_entry = config_entry + self.api = YasnoOutagesApi() + self.data: dict[str, Any] = {} async def async_step_init(self, user_input: dict | None = None) -> ConfigFlowResult: - """Manage the options.""" + """Handle the city change.""" if user_input is not None: - _LOGGER.debug("Updating options: %s", user_input) - return self.async_create_entry(title="", data=user_input) + LOGGER.debug("Updating options: %s", user_input) + self.data.update(user_input) + return await self.async_step_group() + + await self.hass.async_add_executor_job(self.api.fetch_schedule) + + LOGGER.debug("Options: %s", self.config_entry.options) + LOGGER.debug("Data: %s", self.config_entry.data) return self.async_show_form( step_id="init", - data_schema=build_schema(config_entry=self.config_entry), + data_schema=build_city_schema(api=self.api, config_entry=self.config_entry), + ) + + async def async_step_group( + self, + user_input: dict | None = None, + ) -> ConfigFlowResult: + """Handle the group change.""" + if user_input is not None: + LOGGER.debug("User input: %s", user_input) + self.data.update(user_input) + return self.async_create_entry(title="", data=self.data) + + return self.async_show_form( + step_id="group", + data_schema=build_group_schema( + api=self.api, + config_entry=self.config_entry, + data=self.data, + ), ) @@ -74,6 +135,11 @@ class YasnoOutagesConfigFlow(ConfigFlow, domain=DOMAIN): VERSION = 1 + def __init__(self) -> None: + """Initialize config flow.""" + self.api = YasnoOutagesApi() + self.data: dict[str, Any] = {} + @staticmethod @callback def async_get_options_flow(config_entry: ConfigEntry) -> YasnoOutagesOptionsFlow: @@ -83,10 +149,32 @@ def async_get_options_flow(config_entry: ConfigEntry) -> YasnoOutagesOptionsFlow async def async_step_user(self, user_input: dict | None = None) -> ConfigFlowResult: """Handle the initial step.""" if user_input is not None: - _LOGGER.debug("User input: %s", user_input) - return self.async_create_entry(title="Yasno Outages", data=user_input) + LOGGER.debug("City selected: %s", user_input) + self.data.update(user_input) + return await self.async_step_group() + + await self.hass.async_add_executor_job(self.api.fetch_schedule) return self.async_show_form( step_id="user", - data_schema=build_schema(config_entry=None), + data_schema=build_city_schema(api=self.api, config_entry=None), + ) + + async def async_step_group( + self, + user_input: dict | None = None, + ) -> ConfigFlowResult: + """Handle the group step.""" + if user_input is not None: + LOGGER.debug("User input: %s", user_input) + self.data.update(user_input) + return self.async_create_entry(title=NAME, data=self.data) + + return self.async_show_form( + step_id="group", + data_schema=build_group_schema( + api=self.api, + config_entry=None, + data=self.data, + ), ) diff --git a/custom_components/yasno_outages/const.py b/custom_components/yasno_outages/const.py index bd84982..564cf1e 100644 --- a/custom_components/yasno_outages/const.py +++ b/custom_components/yasno_outages/const.py @@ -6,21 +6,24 @@ NAME: Final = "Yasno Outages" # Configuration option +CONF_CITY: Final = "city" CONF_GROUP: Final = "group" # Defaults +DEFAULT_CITY: Final = "kiev" DEFAULT_GROUP: Final = "1" # Consts -UPDATE_INTERVAL: Final = 60 +UPDATE_INTERVAL: Final = 15 # Values STATE_ON: Final = "on" STATE_OFF: Final = "off" STATE_MAYBE: Final = "maybe" -# File paths -CALENDAR_PATH = "schedules/group-{group}.ics" +# Event names +EVENT_NAME_OFF: Final = "DEFINITE_OUTAGE" +EVENT_NAME_MAYBE: Final = "POSSIBLE_OUTAGE" # Keys TRANSLATION_KEY_EVENT_OFF: Final = f"component.{DOMAIN}.common.electricity_off" diff --git a/custom_components/yasno_outages/coordinator.py b/custom_components/yasno_outages/coordinator.py index bfec6e1..efb0cd6 100644 --- a/custom_components/yasno_outages/coordinator.py +++ b/custom_components/yasno_outages/coordinator.py @@ -7,13 +7,17 @@ from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.translation import async_get_translations -from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed +from homeassistant.helpers.update_coordinator import DataUpdateCoordinator from homeassistant.util import dt as dt_utils from .api import YasnoOutagesApi from .const import ( + CONF_CITY, CONF_GROUP, + DEFAULT_CITY, DOMAIN, + EVENT_NAME_MAYBE, + EVENT_NAME_OFF, STATE_MAYBE, STATE_OFF, STATE_ON, @@ -38,23 +42,32 @@ def __init__(self, hass: HomeAssistant, config_entry: ConfigEntry) -> None: hass, LOGGER, name=DOMAIN, - update_interval=datetime.timedelta(seconds=UPDATE_INTERVAL), + update_interval=datetime.timedelta(minutes=UPDATE_INTERVAL), ) self.hass = hass self.config_entry = config_entry self.translations = {} + self.city = config_entry.options.get( + CONF_CITY, + config_entry.data.get(CONF_CITY), + ) self.group = config_entry.options.get( CONF_GROUP, config_entry.data.get(CONF_GROUP), ) - self.api = YasnoOutagesApi(self.group) + + if not self.city: + LOGGER.warning("City not set in configuration. Setting to default.") + self.city = DEFAULT_CITY + + self.api = YasnoOutagesApi(city=self.city, group=self.group) @property def event_name_map(self) -> dict: """Return a mapping of event names to translations.""" return { - STATE_OFF: self.translations.get(TRANSLATION_KEY_EVENT_OFF), - STATE_MAYBE: self.translations.get(TRANSLATION_KEY_EVENT_MAYBE), + EVENT_NAME_OFF: self.translations.get(TRANSLATION_KEY_EVENT_OFF), + EVENT_NAME_MAYBE: self.translations.get(TRANSLATION_KEY_EVENT_MAYBE), } async def update_config( @@ -63,35 +76,32 @@ async def update_config( config_entry: ConfigEntry, ) -> None: """Update configuration.""" + new_city = config_entry.options.get(CONF_CITY) new_group = config_entry.options.get(CONF_GROUP) - if new_group and new_group != self.group: + city_updated = new_city and new_city != self.city + group_updated = new_group and new_group != self.group + + if city_updated or group_updated: LOGGER.debug("Updating group from %s -> %s", self.group, new_group) self.group = new_group - self.api = YasnoOutagesApi(self.group) + self.api = YasnoOutagesApi(city=self.city, group=self.group) await self.async_refresh() else: LOGGER.debug("No group update necessary.") async def _async_update_data(self) -> None: """Fetch data from ICS file.""" - try: - await self.async_fetch_translations() - return await self.hass.async_add_executor_job(self.api.fetch_calendar) - except FileNotFoundError as err: - LOGGER.exception("Cannot read file for group %s", self.group) - msg = f"File not found: {err}" - raise UpdateFailed(msg) from err + await self.async_fetch_translations() + return await self.hass.async_add_executor_job(self.api.fetch_schedule) async def async_fetch_translations(self) -> None: """Fetch translations.""" - LOGGER.debug("Fetching translations for %s", DOMAIN) self.translations = await async_get_translations( self.hass, self.hass.config.language, "common", [DOMAIN], ) - LOGGER.debug("Translations loaded: %s", self.translations) def _get_next_event_of_type(self, state_type: str) -> CalendarEvent | None: """Get the next event of a specific type.""" @@ -174,10 +184,10 @@ def _get_calendar_event( if not event: return None - event_summary = event.get("SUMMARY") + event_summary = event.get("summary") + event_start = event.get("start") + event_end = event.get("end") translated_summary = self.event_name_map.get(event_summary) - event_start = event.decoded("DTSTART") - event_end = event.decoded("DTEND") LOGGER.debug( "Transforming event: %s (%s -> %s)", @@ -196,7 +206,7 @@ def _get_calendar_event( def _event_to_state(self, event: CalendarEvent | None) -> str: summary = event.as_dict().get("summary") if event else None return { - STATE_OFF: STATE_OFF, - STATE_MAYBE: STATE_MAYBE, None: STATE_ON, + EVENT_NAME_OFF: STATE_OFF, + EVENT_NAME_MAYBE: STATE_MAYBE, }[summary] diff --git a/custom_components/yasno_outages/schedules/group-1.ics b/custom_components/yasno_outages/schedules/group-1.ics deleted file mode 100644 index 6b97e69..0000000 --- a/custom_components/yasno_outages/schedules/group-1.ics +++ /dev/null @@ -1,161 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//ical.marudot.com//iCal Event Maker -CALSCALE:GREGORIAN -BEGIN:VTIMEZONE -TZID:Europe/Kyiv -LAST-MODIFIED:20231222T233358Z -TZURL:https://www.tzurl.org/zoneinfo-outlook/Europe/Kyiv -X-LIC-LOCATION:Europe/Kyiv -BEGIN:STANDARD -TZNAME:EET -TZOFFSETFROM:+0300 -TZOFFSETTO:+0200 -DTSTART:19701025T040000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU -END:STANDARD -BEGIN:DAYLIGHT -TZNAME:EEST -TZOFFSETFROM:+0200 -TZOFFSETTO:+0300 -DTSTART:19700329T030000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577465834-11393@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T000000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T040000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719870859414-27498@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T040000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T070000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717576924607-59050@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T090000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T130000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910065764-42530@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T130000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T160000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577186184-31357@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T180000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T220000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910177959-97277@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T220000 -RRULE:FREQ=WEEKLY;BYDAY=MO,TH -DTEND;TZID=Europe/Kyiv:20240604T010000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719942131390-34591@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T220000 -RRULE:FREQ=WEEKLY;BYDAY=SU -DTEND;TZID=Europe/Kyiv:20240604T000000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577231307-20192@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T030000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T070000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910276941-99370@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T070000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T100000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577275934-35254@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T120000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T160000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910299164-48085@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T160000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T190000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577310783-58271@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T210000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240605T010000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577348158-78273@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T010000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T040000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719941799756-19667@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T060000 -RRULE:FREQ=WEEKLY;BYDAY=WE -DTEND;TZID=Europe/Kyiv:20240605T100000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910477734-25112@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T100000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T130000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577369316-72203@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T150000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T190000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910505910-22913@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T190000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T220000 -SUMMARY:maybe -END:VEVENT -END:VCALENDAR diff --git a/custom_components/yasno_outages/schedules/group-2.ics b/custom_components/yasno_outages/schedules/group-2.ics deleted file mode 100644 index 309555b..0000000 --- a/custom_components/yasno_outages/schedules/group-2.ics +++ /dev/null @@ -1,161 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//ical.marudot.com//iCal Event Maker -CALSCALE:GREGORIAN -BEGIN:VTIMEZONE -TZID:Europe/Kyiv -LAST-MODIFIED:20231222T233358Z -TZURL:https://www.tzurl.org/zoneinfo-outlook/Europe/Kyiv -X-LIC-LOCATION:Europe/Kyiv -BEGIN:STANDARD -TZNAME:EET -TZOFFSETFROM:+0300 -TZOFFSETTO:+0200 -DTSTART:19701025T040000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU -END:STANDARD -BEGIN:DAYLIGHT -TZNAME:EEST -TZOFFSETFROM:+0200 -TZOFFSETTO:+0300 -DTSTART:19700329T030000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577465834-11393@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T000000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T040000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719870859414-27498@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T040000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T070000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717576924607-59050@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T090000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T130000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910065764-42530@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T130000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T160000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577186184-31357@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T180000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T220000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910177959-97277@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T220000 -RRULE:FREQ=WEEKLY;BYDAY=MO,TH -DTEND;TZID=Europe/Kyiv:20240604T010000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719942131390-34591@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T220000 -RRULE:FREQ=WEEKLY;BYDAY=SU -DTEND;TZID=Europe/Kyiv:20240604T000000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577231307-20192@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T030000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T070000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910276941-99370@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T070000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T100000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577275934-35254@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T120000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T160000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910299164-48085@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T160000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T190000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577310783-58271@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T210000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240605T010000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577348158-78273@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T010000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T040000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719941799756-19667@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T060000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T100000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910477734-25112@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T100000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T130000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1717577369316-72203@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T150000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T190000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T183323Z -UID:1719910505910-22913@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T190000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T220000 -SUMMARY:maybe -END:VEVENT -END:VCALENDAR diff --git a/custom_components/yasno_outages/schedules/group-3.ics b/custom_components/yasno_outages/schedules/group-3.ics deleted file mode 100644 index 2b41e69..0000000 --- a/custom_components/yasno_outages/schedules/group-3.ics +++ /dev/null @@ -1,161 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//ical.marudot.com//iCal Event Maker -CALSCALE:GREGORIAN -BEGIN:VTIMEZONE -TZID:Europe/Kyiv -LAST-MODIFIED:20231222T233358Z -TZURL:https://www.tzurl.org/zoneinfo-outlook/Europe/Kyiv -X-LIC-LOCATION:Europe/Kyiv -BEGIN:STANDARD -TZNAME:EET -TZOFFSETFROM:+0300 -TZOFFSETTO:+0200 -DTSTART:19701025T040000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU -END:STANDARD -BEGIN:DAYLIGHT -TZNAME:EEST -TZOFFSETFROM:+0200 -TZOFFSETTO:+0300 -DTSTART:19700329T030000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577465834-11393@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T000000 -RRULE:FREQ=WEEKLY;BYDAY=MO -DTEND;TZID=Europe/Kyiv:20240603T010000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719870859414-27498@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T030000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T070000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717576924607-59050@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T070000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T100000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910065764-42530@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T120000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T160000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577186184-31357@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T160000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T190000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910177959-97277@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T210000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240604T010000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577231307-20192@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T010000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T040000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910276941-99370@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T060000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T100000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577275934-35254@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T100000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T130000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910299164-48085@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T150000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T190000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577310783-58271@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T190000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T220000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577348158-78273@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T000000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T040000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910477734-25112@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T040000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T070000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577369316-72203@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T090000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T130000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910505910-22913@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T130000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T160000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577517116-67155@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T180000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T220000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719946995164-10492@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T220000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240606T010000 -SUMMARY:maybe -END:VEVENT -END:VCALENDAR diff --git a/custom_components/yasno_outages/schedules/group-4.ics b/custom_components/yasno_outages/schedules/group-4.ics deleted file mode 100644 index 2b41e69..0000000 --- a/custom_components/yasno_outages/schedules/group-4.ics +++ /dev/null @@ -1,161 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//ical.marudot.com//iCal Event Maker -CALSCALE:GREGORIAN -BEGIN:VTIMEZONE -TZID:Europe/Kyiv -LAST-MODIFIED:20231222T233358Z -TZURL:https://www.tzurl.org/zoneinfo-outlook/Europe/Kyiv -X-LIC-LOCATION:Europe/Kyiv -BEGIN:STANDARD -TZNAME:EET -TZOFFSETFROM:+0300 -TZOFFSETTO:+0200 -DTSTART:19701025T040000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU -END:STANDARD -BEGIN:DAYLIGHT -TZNAME:EEST -TZOFFSETFROM:+0200 -TZOFFSETTO:+0300 -DTSTART:19700329T030000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577465834-11393@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T000000 -RRULE:FREQ=WEEKLY;BYDAY=MO -DTEND;TZID=Europe/Kyiv:20240603T010000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719870859414-27498@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T030000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T070000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717576924607-59050@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T070000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T100000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910065764-42530@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T120000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T160000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577186184-31357@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T160000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T190000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910177959-97277@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T210000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240604T010000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577231307-20192@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T010000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T040000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910276941-99370@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T060000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T100000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577275934-35254@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T100000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T130000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910299164-48085@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T150000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T190000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577310783-58271@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T190000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T220000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577348158-78273@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T000000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T040000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910477734-25112@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T040000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T070000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577369316-72203@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T090000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T130000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719910505910-22913@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T130000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T160000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1717577517116-67155@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T180000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T220000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T190358Z -UID:1719946995164-10492@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T220000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240606T010000 -SUMMARY:maybe -END:VEVENT -END:VCALENDAR diff --git a/custom_components/yasno_outages/schedules/group-5.ics b/custom_components/yasno_outages/schedules/group-5.ics deleted file mode 100644 index 77b6ae2..0000000 --- a/custom_components/yasno_outages/schedules/group-5.ics +++ /dev/null @@ -1,161 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//ical.marudot.com//iCal Event Maker -CALSCALE:GREGORIAN -BEGIN:VTIMEZONE -TZID:Europe/Kyiv -LAST-MODIFIED:20231222T233358Z -TZURL:https://www.tzurl.org/zoneinfo-outlook/Europe/Kyiv -X-LIC-LOCATION:Europe/Kyiv -BEGIN:STANDARD -TZNAME:EET -TZOFFSETFROM:+0300 -TZOFFSETTO:+0200 -DTSTART:19701025T040000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU -END:STANDARD -BEGIN:DAYLIGHT -TZNAME:EEST -TZOFFSETFROM:+0200 -TZOFFSETTO:+0300 -DTSTART:19700329T030000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577465834-11393@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T000000 -RRULE:FREQ=WEEKLY;BYDAY=MO -DTEND;TZID=Europe/Kyiv:20240603T010000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719870859414-27498@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T010000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T040000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717576924607-59050@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T060000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T100000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910065764-42530@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T100000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T130000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577186184-31357@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T150000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T190000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910177959-97277@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T190000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T220000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577231307-20192@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T000000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T040000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910276941-99370@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T040000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T070000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577275934-35254@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T090000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T130000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910299164-48085@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T130000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T160000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577310783-58271@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T180000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T220000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910328356-90505@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T220000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240605T010000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577348158-78273@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T030000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T070000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910477734-25112@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T070000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T100000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577369316-72203@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T120000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T160000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910505910-22913@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T160000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T190000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577517116-67155@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T210000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240606T010000 -SUMMARY:off -END:VEVENT -END:VCALENDAR diff --git a/custom_components/yasno_outages/schedules/group-6.ics b/custom_components/yasno_outages/schedules/group-6.ics deleted file mode 100644 index 77b6ae2..0000000 --- a/custom_components/yasno_outages/schedules/group-6.ics +++ /dev/null @@ -1,161 +0,0 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//ical.marudot.com//iCal Event Maker -CALSCALE:GREGORIAN -BEGIN:VTIMEZONE -TZID:Europe/Kyiv -LAST-MODIFIED:20231222T233358Z -TZURL:https://www.tzurl.org/zoneinfo-outlook/Europe/Kyiv -X-LIC-LOCATION:Europe/Kyiv -BEGIN:STANDARD -TZNAME:EET -TZOFFSETFROM:+0300 -TZOFFSETTO:+0200 -DTSTART:19701025T040000 -RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU -END:STANDARD -BEGIN:DAYLIGHT -TZNAME:EEST -TZOFFSETFROM:+0200 -TZOFFSETTO:+0300 -DTSTART:19700329T030000 -RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU -END:DAYLIGHT -END:VTIMEZONE -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577465834-11393@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T000000 -RRULE:FREQ=WEEKLY;BYDAY=MO -DTEND;TZID=Europe/Kyiv:20240603T010000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719870859414-27498@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T010000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T040000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717576924607-59050@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T060000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T100000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910065764-42530@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T100000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T130000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577186184-31357@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T150000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T190000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910177959-97277@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240603T190000 -RRULE:FREQ=WEEKLY;BYDAY=SU,MO,TH -DTEND;TZID=Europe/Kyiv:20240603T220000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577231307-20192@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T000000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T040000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910276941-99370@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T040000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T070000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577275934-35254@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T090000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T130000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910299164-48085@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T130000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T160000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577310783-58271@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T180000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240604T220000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910328356-90505@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240604T220000 -RRULE:FREQ=WEEKLY;BYDAY=TU,FR -DTEND;TZID=Europe/Kyiv:20240605T010000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577348158-78273@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T030000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T070000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910477734-25112@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T070000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T100000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577369316-72203@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T120000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T160000 -SUMMARY:off -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1719910505910-22913@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T160000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240605T190000 -SUMMARY:maybe -END:VEVENT -BEGIN:VEVENT -DTSTAMP:20240702T090112Z -UID:1717577517116-67155@ical.marudot.com -DTSTART;TZID=Europe/Kyiv:20240605T210000 -RRULE:FREQ=WEEKLY;BYDAY=WE,SA -DTEND;TZID=Europe/Kyiv:20240606T010000 -SUMMARY:off -END:VEVENT -END:VCALENDAR diff --git a/custom_components/yasno_outages/translations/en.json b/custom_components/yasno_outages/translations/en.json index b267191..44f6f71 100644 --- a/custom_components/yasno_outages/translations/en.json +++ b/custom_components/yasno_outages/translations/en.json @@ -4,12 +4,17 @@ "step": { "user": { "title": "Yasno Outages Settings", - "description": "Please select your group:", "data": { - "group": "Group" + "city": "Please select your city:" + } + }, + "group": { + "title": "Yasno Outages Settings", + "data": { + "group": "Please select your group:" }, "data_description": { - "group": "You can find your group on: https://yasno.com.ua" + "group": "You can find your group at: https://yasno.com.ua" } } } @@ -17,17 +22,46 @@ "options": { "step": { "init": { - "title": "Yasno Outages Options", - "description": "Please select another group:", + "title": "Yasno Outages Settings", + "data": { + "city": "Please select your city:" + } + }, + "group": { + "title": "Yasno Outages Settings", "data": { - "group": "Group" + "group": "Please select your group:" }, "data_description": { - "group": "You can find your group on: https://yasno.com.ua" + "group": "You can find your group at: https://yasno.com.ua" } } } }, + "selector": { + "city": { + "options": { + "kiev": "Kyiv", + "dnipro": "Dnipro" + } + }, + "group": { + "options": { + "1": "Group 1", + "2": "Group 2", + "3": "Group 3", + "4": "Group 4", + "5": "Group 5", + "6": "Group 6", + "7": "Group 7", + "8": "Group 8", + "9": "Group 9", + "10": "Group 10", + "11": "Group 11", + "12": "Group 12" + } + } + }, "device": { "yasno_outages": { "name": "Yasno Group {group}" diff --git a/custom_components/yasno_outages/translations/uk.json b/custom_components/yasno_outages/translations/uk.json index b6f944d..0949f3e 100644 --- a/custom_components/yasno_outages/translations/uk.json +++ b/custom_components/yasno_outages/translations/uk.json @@ -4,9 +4,14 @@ "step": { "user": { "title": "Налаштування Yasno Відключення", - "description": "Оберіть свою групу:", "data": { - "group": "Група" + "city": "Оберіть своє місто:" + } + }, + "group": { + "title": "Налаштування Yasno Відключення", + "data": { + "group": "Оберіть свою групу:" }, "data_description": { "group": "Знайдіть свою групу на: https://yasno.com.ua" @@ -17,10 +22,15 @@ "options": { "step": { "init": { - "title": "Опції Yasno Відключення", - "description": "Оберіть іншу групу:", + "title": "Налаштування Yasno Відключення", + "data": { + "city": "Оберіть своє місто:" + } + }, + "group": { + "title": "Налаштування Yasno Відключення", "data": { - "group": "Група" + "group": "Оберіть свою групу:" }, "data_description": { "group": "Знайдіть свою групу на: https://yasno.com.ua" @@ -28,6 +38,30 @@ } } }, + "selector": { + "city": { + "options": { + "kiev": "Київ", + "dnipro": "Дніпро" + } + }, + "group": { + "options": { + "1": "Група 1", + "2": "Група 2", + "3": "Група 3", + "4": "Група 4", + "5": "Група 5", + "6": "Група 6", + "7": "Група 7", + "8": "Група 8", + "9": "Група 9", + "10": "Група 10", + "11": "Група 11", + "12": "Група 12" + } + } + }, "device": { "yasno_outages": { "name": "Yasno Група {group}"