mirror of
https://github.com/python-kasa/python-kasa.git
synced 2024-12-23 03:33:35 +00:00
7bba9926ed
Re-query failed modules after some delay instead of immediately disabling them. Changes to features so they can still be created when modules are erroring.
79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
"""Implementation of brightness module."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from ...feature import Feature
|
|
from ..smartmodule import Module, SmartModule
|
|
|
|
BRIGHTNESS_MIN = 0
|
|
BRIGHTNESS_MAX = 100
|
|
|
|
|
|
class Brightness(SmartModule):
|
|
"""Implementation of brightness module."""
|
|
|
|
REQUIRED_COMPONENT = "brightness"
|
|
|
|
def _initialize_features(self):
|
|
"""Initialize features."""
|
|
super()._initialize_features()
|
|
|
|
device = self._device
|
|
self._add_feature(
|
|
Feature(
|
|
device,
|
|
id="brightness",
|
|
name="Brightness",
|
|
container=self,
|
|
attribute_getter="brightness",
|
|
attribute_setter="set_brightness",
|
|
range_getter=lambda: (BRIGHTNESS_MIN, BRIGHTNESS_MAX),
|
|
type=Feature.Type.Number,
|
|
category=Feature.Category.Primary,
|
|
)
|
|
)
|
|
|
|
def query(self) -> dict:
|
|
"""Query to execute during the update cycle."""
|
|
# Brightness is contained in the main device info response.
|
|
return {}
|
|
|
|
@property
|
|
def brightness(self):
|
|
"""Return current brightness."""
|
|
# If the device supports effects and one is active, use its brightness
|
|
if (
|
|
light_effect := self._device.modules.get(Module.SmartLightEffect)
|
|
) is not None and light_effect.is_active:
|
|
return light_effect.brightness
|
|
|
|
return self.data["brightness"]
|
|
|
|
async def set_brightness(self, brightness: int, *, transition: int | None = None):
|
|
"""Set the brightness. A brightness value of 0 will turn off the light.
|
|
|
|
Note, transition is not supported and will be ignored.
|
|
"""
|
|
if not isinstance(brightness, int) or not (
|
|
BRIGHTNESS_MIN <= brightness <= BRIGHTNESS_MAX
|
|
):
|
|
raise ValueError(
|
|
f"Invalid brightness value: {brightness} "
|
|
f"(valid range: {BRIGHTNESS_MIN}-{BRIGHTNESS_MAX}%)"
|
|
)
|
|
|
|
if brightness == 0:
|
|
return await self._device.turn_off()
|
|
|
|
# If the device supports effects and one is active, we adjust its brightness
|
|
if (
|
|
light_effect := self._device.modules.get(Module.SmartLightEffect)
|
|
) is not None and light_effect.is_active:
|
|
return await light_effect.set_brightness(brightness)
|
|
|
|
return await self.call("set_device_info", {"brightness": brightness})
|
|
|
|
async def _check_supported(self):
|
|
"""Additional check to see if the module is supported by the device."""
|
|
return "brightness" in self.data
|