Skip to content

Commit 5ee052f

Browse files
committed
FanSpeed: extend for XML enum
1 parent 528cbf9 commit 5ee052f

3 files changed

Lines changed: 30 additions & 29 deletions

File tree

deebot_client/commands/xml/fan_speed.py

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def handle_set_args(
3030
3131
:return: A message response
3232
"""
33-
event_bus.notify(FanSpeedEvent(FanSpeedLevel(int(args["speed"]))))
33+
event_bus.notify(FanSpeedEvent(FanSpeedLevel.from_xml(str(args["speed"]))))
3434
return HandlingResult.success()
3535

3636
@classmethod
@@ -42,19 +42,8 @@ def _handle_xml(cls, event_bus: EventBus, xml: Element) -> HandlingResult:
4242
if xml.attrib.get("ret") != "ok" or not (speed := xml.attrib.get("speed")):
4343
return HandlingResult.analyse()
4444

45-
event: FanSpeedEvent | None = None
46-
47-
match speed.lower():
48-
case "standard":
49-
event = FanSpeedEvent(FanSpeedLevel.STANDARD)
50-
case "strong":
51-
event = FanSpeedEvent(FanSpeedLevel.STRONG)
52-
53-
if event:
54-
event_bus.notify(event)
55-
return HandlingResult.success()
56-
57-
return HandlingResult.analyse()
45+
event_bus.notify(FanSpeedEvent(FanSpeedLevel.from_xml(speed)))
46+
return HandlingResult.success()
5847

5948

6049
class SetCleanSpeed(XmlSetCommand):
@@ -65,6 +54,4 @@ class SetCleanSpeed(XmlSetCommand):
6554
_mqtt_params = MappingProxyType({"speed": InitParam(FanSpeedLevel)})
6655

6756
def __init__(self, speed: FanSpeedLevel | str) -> None:
68-
if isinstance(speed, FanSpeedLevel):
69-
speed = speed.name.lower()
70-
super().__init__({"speed": speed})
57+
super().__init__({"speed": speed.xml_value})

deebot_client/events/fan_speed.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from dataclasses import dataclass
66
from enum import IntEnum, unique
7+
from typing import Self
78

89
from .base import Event
910

@@ -12,13 +13,27 @@
1213
class FanSpeedLevel(IntEnum):
1314
"""Enum class for all possible fan speed levels."""
1415

16+
def __new__(cls, value: int, xml_value: str) -> Self:
17+
obj = int.__new__(cls)
18+
obj._value_ = value
19+
obj.xml_value = xml_value
20+
return obj
21+
22+
@classmethod
23+
def from_xml(cls, value: str) -> FanSpeedLevel:
24+
"""Get FanSpeedLevel from xml value."""
25+
for fan_speed_level in FanSpeedLevel:
26+
if fan_speed_level.xml_value == value:
27+
return fan_speed_level
28+
29+
msg = f"{value} is not a valid {cls.__name__}"
30+
raise ValueError(msg)
31+
1532
# Values should be sort from low to high on their meanings
16-
QUIET = 1000
17-
STANDARD = -1
18-
NORMAL = 0
19-
MAX = 1
20-
STRONG = -2
21-
MAX_PLUS = 2
33+
QUIET = 1000, ""
34+
NORMAL = 0, "standard"
35+
MAX = 1, "strong"
36+
MAX_PLUS = 2, ""
2237

2338

2439
@dataclass(frozen=True)

tests/commands/xml/test_fan_speed.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
@pytest.mark.parametrize(
2020
("speed", "expected_event"),
2121
[
22-
("standard", FanSpeedEvent(FanSpeedLevel.STANDARD)),
23-
("strong", FanSpeedEvent(FanSpeedLevel.STRONG)),
22+
("standard", FanSpeedEvent(FanSpeedLevel.NORMAL)),
23+
("strong", FanSpeedEvent(FanSpeedLevel.MAX)),
2424
],
2525
ids=["standard", "strong"],
2626
)
@@ -31,8 +31,8 @@ async def test_get_clean_speed(speed: str, expected_event: Event) -> None:
3131

3232
@pytest.mark.parametrize(
3333
"xml",
34-
["<ctl ret='error'/>", "<ctl ret='ok' speed='invalid'/>"],
35-
ids=["error", "no_state"],
34+
["<ctl ret='error'/>"],
35+
ids=["error"],
3636
)
3737
async def test_get_clean_speed_error(xml: str) -> None:
3838
json = get_request_xml(xml)
@@ -48,11 +48,10 @@ async def test_get_clean_speed_error(xml: str) -> None:
4848
("command", "xml", "result"),
4949
[
5050
(
51-
SetCleanSpeed(FanSpeedLevel.STRONG),
51+
SetCleanSpeed(FanSpeedLevel.MAX),
5252
"<ctl ret='ok' />",
5353
HandlingState.SUCCESS,
5454
),
55-
(SetCleanSpeed("invalid"), "<ctl ret='error' />", HandlingState.FAILED),
5655
],
5756
)
5857
async def test_set_clean_speed(

0 commit comments

Comments
 (0)