Skip to content

Commit 4595b60

Browse files
authored
Merge pull request #12 from Jurkash/develop
Fix calendar timezone issue
2 parents 6704af9 + 3ac9f31 commit 4595b60

File tree

4 files changed

+111
-81
lines changed

4 files changed

+111
-81
lines changed

custom_components/loe_outages/calendar.py

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,7 @@ def event(self) -> CalendarEvent | None:
5252
"""Return the current or next upcoming event or None."""
5353
now = dt_utils.now()
5454
LOGGER.debug("Getting current event for %s", now)
55-
interval = self.coordinator.get_event_at(now)
56-
if not interval:
57-
return None
58-
59-
return CalendarEvent(
60-
summary=interval.state,
61-
start=interval.startTime,
62-
end=interval.endTime,
63-
description=interval.state,
64-
)
55+
return self.coordinator.get_calendar_at(now)
6556

6657
async def async_get_events(
6758
self,
@@ -71,14 +62,4 @@ async def async_get_events(
7162
) -> list[CalendarEvent]:
7263
"""Return calendar events within a datetime range."""
7364
LOGGER.debug('Getting all events between "%s" -> "%s"', start_date, end_date)
74-
intervals = self.coordinator.get_events_between(start_date, end_date)
75-
76-
return [
77-
CalendarEvent(
78-
summary=interval.state,
79-
start=interval.startTime,
80-
end=interval.endTime,
81-
description=interval.state,
82-
)
83-
for interval in intervals
84-
]
65+
return self.coordinator.get_calendar_between(start_date, end_date)

custom_components/loe_outages/coordinator.py

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import logging
55

66
from .models import Interval
7+
from homeassistant.components.calendar import CalendarEvent
78
from homeassistant.config_entries import ConfigEntry
89
from homeassistant.core import HomeAssistant
910
from homeassistant.helpers.translation import async_get_translations
@@ -141,7 +142,7 @@ def current_state(self) -> str:
141142
def get_event_at(self, at: datetime.datetime) -> Interval:
142143
"""Get the current event."""
143144
event = self.api.get_current_event(at)
144-
return self._get_calendar_event(event, translate=False)
145+
return self._get_interval_event(event, translate=False)
145146

146147
def get_events_between(
147148
self,
@@ -150,13 +151,31 @@ def get_events_between(
150151
*,
151152
translate: bool = True,
152153
) -> list[Interval]:
154+
"""Get all events."""
155+
events = self.api.get_events(start_date, end_date)
156+
return [
157+
self._get_interval_event(event, translate=translate) for event in events
158+
]
159+
160+
def get_calendar_at(self, at: datetime.datetime) -> CalendarEvent:
161+
"""Get the current event."""
162+
event = self.api.get_current_event(at)
163+
return self._get_calendar_event(event, translate=False)
164+
165+
def get_calendar_between(
166+
self,
167+
start_date: datetime.datetime,
168+
end_date: datetime.datetime,
169+
*,
170+
translate: bool = True,
171+
) -> list[CalendarEvent]:
153172
"""Get all events."""
154173
events = self.api.get_events(start_date, end_date)
155174
return [
156175
self._get_calendar_event(event, translate=translate) for event in events
157176
]
158177

159-
def _get_calendar_event(
178+
def _get_interval_event(
160179
self,
161180
event: dict | None,
162181
*,
@@ -184,6 +203,35 @@ def _get_calendar_event(
184203
endTime=event_end,
185204
)
186205

206+
def _get_calendar_event(
207+
self,
208+
event: dict | None,
209+
*,
210+
translate: bool = True,
211+
) -> CalendarEvent:
212+
"""Transform an event into a Inteval."""
213+
if not event:
214+
return None
215+
216+
event_summary = event["state"]
217+
translated_summary = self.event_name_map.get(event_summary)
218+
event_start = dt_utils.as_local(event["startTime"])
219+
event_end = dt_utils.as_local(event["endTime"])
220+
221+
LOGGER.debug(
222+
"Transforming event: %s (%s -> %s)",
223+
event_summary,
224+
event_start,
225+
event_end,
226+
)
227+
228+
return CalendarEvent(
229+
summary=translated_summary if translate else event_summary,
230+
start=event_start,
231+
end=event_end,
232+
description=event_summary,
233+
)
234+
187235
def _event_to_state(self, event: Interval | None) -> str:
188236
state = event.state if event else None
189237
return {
Lines changed: 58 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,70 @@
11
{
2-
"title": "ЛОЕ Відключення",
3-
"config": {
4-
"step": {
5-
"user": {
6-
"title": "Налаштування ЛОЕ Відключення",
7-
"description": "Оберіть свою групу:",
8-
"data": {
9-
"group": "Група"
10-
},
11-
"data_description": {
12-
"group": "Знайдіть свою групу на: https://poweron.loe.lviv.ua/shedule-off"
13-
}
2+
"title": "ЛОЕ Відключення",
3+
"config": {
4+
"step": {
5+
"user": {
6+
"title": "Налаштування ЛОЕ Відключення",
7+
"description": "Оберіть свою групу:",
8+
"data": {
9+
"group": "Група"
10+
},
11+
"data_description": {
12+
"group": "Знайдіть свою групу на: https://poweron.loe.lviv.ua/shedule-off"
1413
}
1514
}
16-
},
17-
"options": {
18-
"step": {
19-
"init": {
20-
"title": "Опції ЛОЕ Відключення",
21-
"description": "Оберіть іншу групу:",
22-
"data": {
23-
"group": "Група"
24-
},
25-
"data_description": {
26-
"group": "Знайдіть свою групу на: https://poweron.loe.lviv.ua/shedule-off"
27-
}
15+
}
16+
},
17+
"options": {
18+
"step": {
19+
"init": {
20+
"title": "Опції ЛОЕ Відключення",
21+
"description": "Оберіть іншу групу:",
22+
"data": {
23+
"group": "Група"
24+
},
25+
"data_description": {
26+
"group": "Знайдіть свою групу на: https://poweron.loe.lviv.ua/shedule-off"
2827
}
2928
}
30-
},
31-
"device": {
32-
"loe_outages": {
33-
"name": "ЛОЕ Група {group}"
34-
}
35-
},
36-
"entity": {
29+
}
30+
},
31+
"device": {
32+
"loe_outages": {
33+
"name": "ЛОЕ Група {group}"
34+
}
35+
},
36+
"entity": {
37+
"calendar": {
3738
"calendar": {
38-
"calendar": {
39-
"name": "Графік відключень",
40-
"state_attributes": {
41-
"message": {
42-
"name": "Підключення",
43-
"state": {
44-
"poweroff": "Відключення"
45-
}
39+
"name": "Графік відключень",
40+
"state_attributes": {
41+
"message": {
42+
"name": "Підключення",
43+
"state": {
44+
"poweroff": "Відключення"
4645
}
4746
}
4847
}
49-
},
50-
"sensor": {
51-
"electricity": {
52-
"name": "Електрика",
53-
"state": {
54-
"poweron": "Заживлено",
55-
"poweroff": "Відключення"
56-
}
57-
},
58-
"next_outage": {
59-
"name": "Наступне відключення"
60-
},
61-
"next_connectivity": {
62-
"name": "Наступне харчування"
63-
}
6448
}
6549
},
66-
"common": {
67-
"electricity_on": "Заживлено",
68-
"electricity_off": "Відключення"
50+
"sensor": {
51+
"electricity": {
52+
"name": "Електрика",
53+
"state": {
54+
"poweron": "Заживлено",
55+
"poweroff": "Відключення"
56+
}
57+
},
58+
"next_outage": {
59+
"name": "Наступне відключення"
60+
},
61+
"next_connectivity": {
62+
"name": "Наступне заживлення"
63+
}
6964
}
70-
}
65+
},
66+
"common": {
67+
"electricity_on": "Заживлено",
68+
"electricity_off": "Відключення"
69+
}
70+
}

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
homeassistant==2024.7.0
22
pip>=21.0,<24.2
33
pre-commit>=3.7.1
4+
pytz==2024.1
45
ruff==0.5.0

0 commit comments

Comments
 (0)