python-kasa/kasa/smart/modules/powerprotection.py
2024-12-04 14:04:20 +01:00

99 lines
3.4 KiB
Python

"""Power protection module."""
from __future__ import annotations
from ...feature import Feature
from ..smartmodule import SmartModule
class PowerProtection(SmartModule):
"""Implementation for power_protection."""
REQUIRED_COMPONENT = "power_protection"
def _initialize_features(self) -> None:
"""Initialize features after the initial update."""
self._add_feature(
Feature(
device=self._device,
id="overloaded",
name="Overloaded",
container=self,
attribute_getter="overloaded",
type=Feature.Type.BinarySensor,
category=Feature.Category.Info,
)
)
self._add_feature(
Feature(
device=self._device,
id="power_protection_enabled",
name="Power protection enabled",
container=self,
attribute_getter="enabled",
attribute_setter="set_enabled",
type=Feature.Type.Switch,
category=Feature.Category.Config,
)
)
self._add_feature(
Feature(
device=self._device,
id="power_protection_threshold",
name="Power protection threshold",
container=self,
attribute_getter="protection_threshold",
attribute_setter="set_protection_threshold",
unit_getter=lambda: "W",
type=Feature.Type.Number,
range_getter="protection_threshold_range",
category=Feature.Category.Config,
)
)
def query(self) -> dict:
"""Query to execute during the update cycle."""
return {"get_protection_power": None, "get_max_power": None}
@property
def overloaded(self) -> bool:
"""Return True is power protection has been triggered.
This value remains True until the device is turned on again.
"""
return self._device.sys_info["power_protection_status"] == "overloaded"
@property
def enabled(self) -> bool:
"""Return True if child protection is enabled."""
return self.data["get_protection_power"]["enabled"]
async def set_enabled(self, enabled: bool) -> dict:
"""Set child protection."""
params = {**self.data["get_protection_power"], "enabled": enabled}
return await self.call("set_protection_power", params)
@property
def protection_threshold_range(self) -> tuple[int, int]:
"""Return threshold range."""
return 0, self.data["get_max_power"]["max_power"]
@property
def protection_threshold(self) -> int:
"""Return protection threshold in watts."""
# If never configured, there is no value set.
return self.data["get_protection_power"].get("protection_power", 0)
async def set_protection_threshold(self, threshold: int) -> dict:
"""Set protection threshold."""
if threshold < 0 or threshold > self.protection_threshold_range[1]:
raise ValueError(
"Threshold out of range: %s (%s)", threshold, self.protection_threshold
)
params = {
**self.data["get_protection_power"],
"protection_power": threshold,
}
return await self.call("set_protection_power", params)