From e2f93c64a442bc1d4aef2b90c13c76c600b4acbd Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Wed, 3 Jun 2026 23:58:25 +0200 Subject: [PATCH] feat(q7): add set_child_lock trait method Co-Authored-By: Claude Opus 4.8 (1M context) --- roborock/devices/traits/b01/q7/__init__.py | 4 ++++ tests/devices/traits/b01/q7/test_init.py | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/roborock/devices/traits/b01/q7/__init__.py b/roborock/devices/traits/b01/q7/__init__.py index 3a3707d8..f6f4887c 100644 --- a/roborock/devices/traits/b01/q7/__init__.py +++ b/roborock/devices/traits/b01/q7/__init__.py @@ -108,6 +108,10 @@ async def set_repeat_state(self, repeat: CleanRepeatMapping) -> None: """Set the cleaning repeat state (cycles).""" await self.set_prop(RoborockB01Props.REPEAT_STATE, repeat.code) + async def set_child_lock(self, enabled: bool) -> None: + """Enable or disable the child lock.""" + await self.set_prop(RoborockB01Props.CHILD_LOCK, int(enabled)) + async def start_clean(self) -> None: """Start cleaning.""" await self.send( diff --git a/tests/devices/traits/b01/q7/test_init.py b/tests/devices/traits/b01/q7/test_init.py index ebf2d74b..e8b68649 100644 --- a/tests/devices/traits/b01/q7/test_init.py +++ b/tests/devices/traits/b01/q7/test_init.py @@ -152,6 +152,28 @@ async def test_q7_api_set_water_level( assert payload_data["dps"]["10000"]["params"] == {RoborockB01Props.WATER: WaterLevelMapping.HIGH.code} +@pytest.mark.parametrize( + ("enabled", "expected_code"), + [(True, 1), (False, 0)], +) +async def test_q7_api_set_child_lock( + enabled: bool, + expected_code: int, + q7_api: Q7PropertiesApi, + fake_channel: FakeChannel, + message_builder: B01MessageBuilder, +): + """Test toggling the child lock.""" + fake_channel.response_queue.append(message_builder.build({"result": "ok"})) + await q7_api.set_child_lock(enabled) + + assert len(fake_channel.published_messages) == 1 + message = fake_channel.published_messages[0] + payload_data = json.loads(unpad(message.payload, AES.block_size)) + assert payload_data["dps"]["10000"]["method"] == "prop.set" + assert payload_data["dps"]["10000"]["params"] == {RoborockB01Props.CHILD_LOCK: expected_code} + + @pytest.mark.parametrize( ("mode", "expected_code"), [