Add brightness module (#806)

Add module for controlling the brightness.
This commit is contained in:
Teemu R 2024-03-05 15:41:40 +01:00 committed by GitHub
parent eb4c048b57
commit 0d5a3c8439
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 74 additions and 10 deletions

View File

@ -2,6 +2,7 @@
from .alarmmodule import AlarmModule from .alarmmodule import AlarmModule
from .autooffmodule import AutoOffModule from .autooffmodule import AutoOffModule
from .battery import BatterySensor from .battery import BatterySensor
from .brightness import Brightness
from .childdevicemodule import ChildDeviceModule from .childdevicemodule import ChildDeviceModule
from .cloudmodule import CloudModule from .cloudmodule import CloudModule
from .devicemodule import DeviceModule from .devicemodule import DeviceModule
@ -26,6 +27,7 @@ __all__ = [
"ReportModule", "ReportModule",
"AutoOffModule", "AutoOffModule",
"LedModule", "LedModule",
"Brightness",
"Firmware", "Firmware",
"CloudModule", "CloudModule",
"LightTransitionModule", "LightTransitionModule",

View File

@ -0,0 +1,43 @@
"""Implementation of brightness module."""
from typing import TYPE_CHECKING, Dict
from ...feature import Feature, FeatureType
from ..smartmodule import SmartModule
if TYPE_CHECKING:
from ..smartdevice import SmartDevice
class Brightness(SmartModule):
"""Implementation of brightness module."""
REQUIRED_COMPONENT = "brightness"
def __init__(self, device: "SmartDevice", module: str):
super().__init__(device, module)
self._add_feature(
Feature(
device,
"Brightness",
container=self,
attribute_getter="brightness",
attribute_setter="set_brightness",
minimum_value=1,
maximum_value=100,
type=FeatureType.Number,
)
)
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."""
return self.data["brightness"]
async def set_brightness(self, brightness: int):
"""Set the brightness."""
return await self.call("set_device_info", {"brightness": brightness})

View File

@ -53,14 +53,19 @@ class SmartModule(Module):
def data(self): def data(self):
"""Return response data for the module. """Return response data for the module.
If module performs only a single query, the resulting response is unwrapped. If the module performs only a single query, the resulting response is unwrapped.
If the module does not define a query, this property returns a reference
to the main "get_device_info" response.
""" """
dev = self._device
q = self.query() q = self.query()
if not q:
return dev.internal_state["get_device_info"]
q_keys = list(q.keys()) q_keys = list(q.keys())
query_key = q_keys[0] query_key = q_keys[0]
dev = self._device
# TODO: hacky way to check if update has been called. # TODO: hacky way to check if update has been called.
# The way this falls back to parent may not always be wanted. # The way this falls back to parent may not always be wanted.
# Especially, devices can have their own firmware updates. # Especially, devices can have their own firmware updates.

View File

@ -249,8 +249,6 @@ device_iot = parametrize(
"devices iot", model_filter=ALL_DEVICES_IOT, protocol_filter={"IOT"} "devices iot", model_filter=ALL_DEVICES_IOT, protocol_filter={"IOT"}
) )
brightness = parametrize("brightness smart", component_filter="brightness")
def check_categories(): def check_categories():
"""Check that every fixture file is categorized.""" """Check that every fixture file is categorized."""

View File

@ -1,12 +1,28 @@
from kasa.smart import SmartDevice import pytest
from .conftest import ( from kasa.smart import SmartDevice
brightness, from kasa.tests.conftest import parametrize
)
brightness = parametrize("brightness smart", component_filter="brightness")
@brightness @brightness
async def test_brightness_component(dev: SmartDevice): async def test_brightness_component(dev: SmartDevice):
"""Placeholder to test framwework component filter.""" """Test brightness feature."""
assert isinstance(dev, SmartDevice) assert isinstance(dev, SmartDevice)
assert "brightness" in dev._components assert "brightness" in dev._components
# Test getting the value
feature = dev.features["brightness"]
assert isinstance(feature.value, int)
assert feature.value > 0 and feature.value <= 100
# Test setting the value
await feature.set_value(10)
assert feature.value == 10
with pytest.raises(ValueError):
await feature.set_value(feature.minimum_value - 10)
with pytest.raises(ValueError):
await feature.set_value(feature.maximum_value + 10)