Skip to content

Commit 22ff7f4

Browse files
fix: merging timer entities
1 parent 9e2a3c5 commit 22ff7f4

File tree

2 files changed

+43
-41
lines changed

2 files changed

+43
-41
lines changed

roborock/containers.py

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
from __future__ import annotations
22

3+
import datetime
34
import logging
45
import re
56
from dataclasses import asdict, dataclass
6-
from datetime import time
77
from enum import Enum
88
from typing import Any, Optional, Type
99

@@ -45,6 +45,7 @@
4545
SENSOR_DIRTY_REPLACE_TIME,
4646
SIDE_BRUSH_REPLACE_TIME,
4747
)
48+
from .util import parse_time_to_datetime
4849

4950
_LOGGER = logging.getLogger(__name__)
5051

@@ -95,6 +96,29 @@ def as_dict(self) -> dict:
9596
)
9697

9798

99+
@dataclass
100+
class RoborockBaseTimer(RoborockBase):
101+
start_hour: Optional[int] = None
102+
start_minute: Optional[int] = None
103+
end_hour: Optional[int] = None
104+
end_minute: Optional[int] = None
105+
enabled: Optional[int] = None
106+
start_time: Optional[datetime.datetime] = None
107+
end_time: Optional[datetime.datetime] = None
108+
109+
def __post_init__(self) -> None:
110+
self.start_time = (
111+
parse_time_to_datetime(datetime.time(hour=self.start_hour, minute=self.start_minute))
112+
if self.start_hour is not None and self.start_minute is not None
113+
else None
114+
)
115+
self.end_time = (
116+
parse_time_to_datetime(datetime.time(hour=self.end_hour, minute=self.end_minute))
117+
if self.end_hour is not None and self.end_minute is not None
118+
else None
119+
)
120+
121+
98122
@dataclass
99123
class Reference(RoborockBase):
100124
r: Optional[str] = None
@@ -338,49 +362,13 @@ class S8Status(Status):
338362

339363

340364
@dataclass
341-
class DnDTimer(RoborockBase):
342-
start_hour: Optional[int] = None
343-
start_minute: Optional[int] = None
344-
end_hour: Optional[int] = None
345-
end_minute: Optional[int] = None
346-
enabled: Optional[int] = None
347-
start_time: Optional[time] = None
348-
end_time: Optional[time] = None
349-
350-
def __post_init__(self) -> None:
351-
self.start_time = (
352-
time(hour=self.start_hour, minute=self.start_minute)
353-
if self.start_hour is not None and self.start_minute is not None
354-
else None
355-
)
356-
self.end_time = (
357-
time(hour=self.end_hour, minute=self.end_minute)
358-
if self.end_hour is not None and self.end_minute is not None
359-
else None
360-
)
365+
class DnDTimer(RoborockBaseTimer):
366+
"""DnDTimer"""
361367

362368

363369
@dataclass
364-
class ValleyElectricityTimer(RoborockBase):
365-
start_hour: Optional[int] = None
366-
start_minute: Optional[int] = None
367-
end_hour: Optional[int] = None
368-
end_minute: Optional[int] = None
369-
enabled: Optional[int] = None
370-
start_time: Optional[time] = None
371-
end_time: Optional[time] = None
372-
373-
def __post_init__(self) -> None:
374-
self.start_time = (
375-
time(hour=self.start_hour, minute=self.start_minute)
376-
if self.start_hour is not None and self.start_minute is not None
377-
else None
378-
)
379-
self.end_time = (
380-
time(hour=self.end_hour, minute=self.end_minute)
381-
if self.end_hour is not None and self.end_minute is not None
382-
else None
383-
)
370+
class ValleyElectricityTimer(RoborockBaseTimer):
371+
"""ValleyElectricityTimer"""
384372

385373

386374
@dataclass

roborock/util.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
from __future__ import annotations
22

33
import asyncio
4+
import datetime
45
import functools
56
from asyncio import AbstractEventLoop
67
from typing import Callable, Coroutine, Optional, TypeVar
78

89
T = TypeVar("T")
10+
DEFAULT_TIME_ZONE: datetime.tzinfo = datetime.timezone.utc
911

1012

1113
def unpack_list(value: list[T], size: int) -> list[Optional[T]]:
@@ -21,6 +23,18 @@ def get_running_loop_or_create_one() -> AbstractEventLoop:
2123
return loop
2224

2325

26+
def parse_time_to_datetime(initial_time: datetime.time) -> datetime.datetime:
27+
"""Help to handle time data."""
28+
time = datetime.datetime.now(DEFAULT_TIME_ZONE).replace(
29+
hour=initial_time.hour, minute=initial_time.minute, second=0, microsecond=0
30+
)
31+
32+
if time < datetime.datetime.now(DEFAULT_TIME_ZONE):
33+
time += datetime.timedelta(days=1)
34+
35+
return time
36+
37+
2438
def run_sync():
2539
loop = get_running_loop_or_create_one()
2640

0 commit comments

Comments
 (0)