From d9c5b3a6c1621e2b8d34f0973625d110ff8db426 Mon Sep 17 00:00:00 2001 From: Teemu Rytilahti Date: Tue, 23 Jan 2024 12:35:41 +0100 Subject: [PATCH 1/3] Add reboot and factory_reset to tapodevice --- kasa/tapo/tapodevice.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/kasa/tapo/tapodevice.py b/kasa/tapo/tapodevice.py index ff8bdaea8..156a61d1a 100644 --- a/kasa/tapo/tapodevice.py +++ b/kasa/tapo/tapodevice.py @@ -339,3 +339,18 @@ async def update_credentials(self, username: str, password: str): "time": t, } return await self.protocol.query({"set_qs_info": payload}) + + async def reboot(self, delay: int = 1) -> None: + """Reboot the device. + + Note that giving a delay of zero causes this to block, + as the device reboots immediately without responding to the call. + """ + await self.protocol.query({"device_reboot": {"delay": delay}}) + + async def factory_reset(self) -> None: + """Reset device back to factory settings. + + Note, this does not downgrade the firmware. + """ + await self.protocol.query("device_reset") From 5074070671fc9decceaae3dfe2fd231137586c7b Mon Sep 17 00:00:00 2001 From: Teemu Rytilahti Date: Tue, 23 Jan 2024 13:41:32 +0100 Subject: [PATCH 2/3] Add test for reboot command --- kasa/tests/test_cli.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/kasa/tests/test_cli.py b/kasa/tests/test_cli.py index b1db15e19..88d8f724d 100644 --- a/kasa/tests/test_cli.py +++ b/kasa/tests/test_cli.py @@ -21,6 +21,7 @@ cli, emeter, raw_command, + reboot, state, sysinfo, toggle, @@ -103,6 +104,18 @@ async def test_raw_command(dev): assert "Usage" in res.output +async def test_reboot(dev, mocker): + runner = CliRunner() + query_mock = mocker.patch.object(dev.protocol, "query") + res = await runner.invoke( + reboot, + obj=dev, + ) + + assert res.exit_code == 0 + query_mock.assert_called() + + @device_smart async def test_wifi_scan(dev): runner = CliRunner() From 26f06f047f1d2776c0af02794018e7618d705a91 Mon Sep 17 00:00:00 2001 From: Teemu Rytilahti Date: Tue, 23 Jan 2024 14:11:49 +0100 Subject: [PATCH 3/3] Fix mocking as different protocols use different methods for comms.. --- kasa/tests/test_cli.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/kasa/tests/test_cli.py b/kasa/tests/test_cli.py index 88d8f724d..3aad37dda 100644 --- a/kasa/tests/test_cli.py +++ b/kasa/tests/test_cli.py @@ -104,16 +104,19 @@ async def test_raw_command(dev): assert "Usage" in res.output +@device_smart async def test_reboot(dev, mocker): + """Test that reboot works on SMART devices.""" runner = CliRunner() query_mock = mocker.patch.object(dev.protocol, "query") + res = await runner.invoke( reboot, obj=dev, ) - assert res.exit_code == 0 query_mock.assert_called() + assert res.exit_code == 0 @device_smart