Skip to content

Commit 9efeecb

Browse files
committed
feat: add the ability to set q7 mode
1 parent a69286f commit 9efeecb

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

roborock/data/b01_q7/b01_q7_containers.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
from ..containers import RoborockBase
44
from .b01_q7_code_mappings import (
55
B01Fault,
6+
CleanTypeMapping,
67
SCWindMapping,
8+
WaterLevelMapping,
79
WorkModeMapping,
810
WorkStatusMapping,
911
)
@@ -77,8 +79,8 @@ class B01Props(RoborockBase):
7779
status: WorkStatusMapping | None = None
7880
fault: B01Fault | None = None
7981
wind: SCWindMapping | None = None
80-
water: int | None = None
81-
mode: int | None = None
82+
water: WaterLevelMapping | None = None
83+
mode: CleanTypeMapping | None = None
8284
quantity: int | None = None
8385
alarm: int | None = None
8486
volume: int | None = None

roborock/devices/traits/b01/q7/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from roborock import B01Props
77
from roborock.data.b01_q7.b01_q7_code_mappings import (
88
CleanTaskTypeMapping,
9+
CleanTypeMapping,
910
SCDeviceCleanParam,
1011
SCWindMapping,
1112
WaterLevelMapping,
@@ -54,6 +55,10 @@ async def set_water_level(self, water_level: WaterLevelMapping) -> None:
5455
"""Set the water level (water)."""
5556
await self.set_prop(RoborockB01Props.WATER, water_level.code)
5657

58+
async def set_mode(self, mode: CleanTypeMapping) -> None:
59+
"""Set the cleaning mode (vacuum, mop, or vacuum and mop)."""
60+
await self.set_prop(RoborockB01Props.MODE, mode.code)
61+
5762
async def start_clean(self) -> None:
5863
"""Start cleaning."""
5964
await self.send(

tests/devices/traits/b01/q7/test_init.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
from roborock.data.b01_q7 import (
1313
CleanTaskTypeMapping,
14+
CleanTypeMapping,
1415
SCDeviceCleanParam,
1516
SCWindMapping,
1617
WaterLevelMapping,
@@ -217,6 +218,32 @@ async def test_q7_api_set_water_level(
217218
assert payload_data["dps"]["10000"]["params"] == {RoborockB01Props.WATER: WaterLevelMapping.HIGH.code}
218219

219220

221+
@pytest.mark.parametrize(
222+
("mode", "expected_code"),
223+
[
224+
(CleanTypeMapping.VACUUM, 0),
225+
(CleanTypeMapping.VAC_AND_MOP, 1),
226+
(CleanTypeMapping.MOP, 2),
227+
],
228+
)
229+
async def test_q7_api_set_mode(
230+
mode: CleanTypeMapping,
231+
expected_code: int,
232+
q7_api: Q7PropertiesApi,
233+
fake_channel: FakeChannel,
234+
message_builder: B01MessageBuilder,
235+
):
236+
"""Test setting cleaning mode (vacuum, mop, or both)."""
237+
fake_channel.response_queue.append(message_builder.build({"result": "ok"}))
238+
await q7_api.set_mode(mode)
239+
240+
assert len(fake_channel.published_messages) == 1
241+
message = fake_channel.published_messages[0]
242+
payload_data = json.loads(unpad(message.payload, AES.block_size))
243+
assert payload_data["dps"]["10000"]["method"] == "prop.set"
244+
assert payload_data["dps"]["10000"]["params"] == {RoborockB01Props.MODE: expected_code}
245+
246+
220247
async def test_q7_api_start_clean(
221248
q7_api: Q7PropertiesApi, fake_channel: FakeChannel, message_builder: B01MessageBuilder
222249
):

0 commit comments

Comments
 (0)