Add childprotection module (#1141)

When turned on, rotating the thermostat will not change the target
temperature.
This commit is contained in:
Teemu R.
2024-11-01 20:46:36 +01:00
committed by GitHub
parent 77b654a9aa
commit 0360107e3f
5 changed files with 102 additions and 1 deletions

View File

@@ -430,6 +430,16 @@ class FakeSmartTransport(BaseTransport):
info["get_preset_rules"]["states"][params["index"]] = params["state"]
return {"error_code": 0}
def _update_sysinfo_key(self, info: dict, key: str, value: str) -> dict:
"""Update a single key in the main system info.
This is used to implement child device setters that change the main sysinfo state.
"""
sys_info = info.get("get_device_info", info)
sys_info[key] = value
return {"error_code": 0}
async def _send_request(self, request_dict: dict):
method = request_dict["method"]
@@ -437,7 +447,7 @@ class FakeSmartTransport(BaseTransport):
if method == "control_child":
return await self._handle_control_child(request_dict["params"])
params = request_dict.get("params")
params = request_dict.get("params", {})
if method == "component_nego" or method[:4] == "get_":
if method in info:
result = copy.deepcopy(info[method])
@@ -518,6 +528,8 @@ class FakeSmartTransport(BaseTransport):
return self._edit_preset_rules(info, params)
elif method == "set_on_off_gradually_info":
return self._set_on_off_gradually_info(info, params)
elif method == "set_child_protection":
return self._update_sysinfo_key(info, "child_protection", params["enable"])
elif method[:4] == "set_":
target_method = f"get_{method[4:]}"
info[target_method].update(params)

View File

@@ -0,0 +1,43 @@
import pytest
from kasa import Module
from kasa.smart.modules import ChildProtection
from kasa.tests.device_fixtures import parametrize
child_protection = parametrize(
"has child protection",
component_filter="child_protection",
protocol_filter={"SMART.CHILD"},
)
@child_protection
@pytest.mark.parametrize(
("feature", "prop_name", "type"),
[
("child_lock", "enabled", bool),
],
)
async def test_features(dev, feature, prop_name, type):
"""Test that features are registered and work as expected."""
protect: ChildProtection = dev.modules[Module.ChildProtection]
assert protect is not None
prop = getattr(protect, prop_name)
assert isinstance(prop, type)
feat = protect._device.features[feature]
assert feat.value == prop
assert isinstance(feat.value, type)
@child_protection
async def test_enabled(dev):
"""Test the API."""
protect: ChildProtection = dev.modules[Module.ChildProtection]
assert protect is not None
assert isinstance(protect.enabled, bool)
await protect.set_enabled(False)
await dev.update()
assert protect.enabled is False