8000 Add brightness module by rytilahti · Pull Request #806 · python-kasa/python-kasa · GitHub
[go: up one dir, main page]

Skip to content

Add brightness module #806

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions kasa/smart/modules/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from .alarmmodule import AlarmModule
from .autooffmodule import AutoOffModule
from .battery import BatterySensor
from .brightness import Brightness
from .childdevicemodule import ChildDeviceModule
from .cloudmodule import CloudModule
from .devicemodule import DeviceModule
Expand All @@ -26,6 +27,7 @@
"ReportModule",
"AutoOffModule",
"LedModule",
"Brightness",
"Firmware",
"CloudModule",
"LightTransitionModule",
Expand Down
43 changes: 43 additions & 0 deletions kasa/smart/modules/brightness.py
Original file line number Diff line number Diff line change
@@ -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})
11 changes: 8 additions & 3 deletions kasa/smart/smartmodule.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,19 @@ def call(self, method, params=None):
def data(self):
"""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()

if not q:
return dev.internal_state["get_device_info"]
Comment on lines +63 to +64
8000 Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If a module reports its query as non-true, it means that the information is stored in the main get_device_info responses.


q_keys = list(q.keys())
query_key = q_keys[0]

dev = self._device

# TODO: hacky way to check if update has been called.
# The way this falls back to parent may not always be wanted.
# Especially, devices can have their own firmware updates.
Expand Down
2 changes: 0 additions & 2 deletions kasa/tests/device_fixtures.py
Original file line number Diff line number Diff line change
Expand Up @@ -249,8 +249,6 @@ def parametrize(
"devices iot", model_filter=ALL_DEVICES_IOT, protocol_filter={"IOT"}
)

brightness = parametrize("brightness smart", component_filter="brightness")


def check_categories():
"""Check that every fixture file is categorized."""
Expand Down
24 changes: 20 additions & 4 deletions kasa/tests/test_feature_brightness.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,28 @@
import pytest

from kasa.smart import SmartDevice
from kasa.tests.conftest import parametrize

from .conftest import (
brightness,
)
brightness = parametrize("brightness smart", component_filter="brightness")


@brightness
async def test_brightness_component(dev: SmartDevice):
"""Placeholder to test framwework component filter."""
"""Test brightness feature."""
assert isinstance(dev, SmartDevice)
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)
0