mirror of
https://github.com/python-kasa/python-kasa.git
synced 2024-12-22 19:23:34 +00:00
Enable setting brightness with color temp for smart devices (#1091)
This commit is contained in:
parent
7bba9926ed
commit
cb7e904d30
@ -211,14 +211,14 @@ class Feature:
|
|||||||
"""Range of values if applicable."""
|
"""Range of values if applicable."""
|
||||||
return self._get_property_value(self.range_getter)
|
return self._get_property_value(self.range_getter)
|
||||||
|
|
||||||
@cached_property
|
@property
|
||||||
def maximum_value(self) -> int:
|
def maximum_value(self) -> int:
|
||||||
"""Maximum value."""
|
"""Maximum value."""
|
||||||
if range := self.range:
|
if range := self.range:
|
||||||
return range[1]
|
return range[1]
|
||||||
return self.DEFAULT_MAX
|
return self.DEFAULT_MAX
|
||||||
|
|
||||||
@cached_property
|
@property
|
||||||
def minimum_value(self) -> int:
|
def minimum_value(self) -> int:
|
||||||
"""Minimum value."""
|
"""Minimum value."""
|
||||||
if range := self.range:
|
if range := self.range:
|
||||||
|
@ -429,7 +429,7 @@ class IotBulb(IotDevice):
|
|||||||
if not self._is_variable_color_temp:
|
if not self._is_variable_color_temp:
|
||||||
raise KasaException("Bulb does not support colortemp.")
|
raise KasaException("Bulb does not support colortemp.")
|
||||||
|
|
||||||
valid_temperature_range = self.valid_temperature_range
|
valid_temperature_range = self._valid_temperature_range
|
||||||
if temp < valid_temperature_range[0] or temp > valid_temperature_range[1]:
|
if temp < valid_temperature_range[0] or temp > valid_temperature_range[1]:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Temperature should be between {} and {}, was {}".format(
|
"Temperature should be between {} and {}, was {}".format(
|
||||||
|
@ -3,16 +3,11 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from typing import TYPE_CHECKING
|
|
||||||
|
|
||||||
from ...feature import Feature
|
from ...feature import Feature
|
||||||
from ...interfaces.light import ColorTempRange
|
from ...interfaces.light import ColorTempRange
|
||||||
from ..smartmodule import SmartModule
|
from ..smartmodule import SmartModule
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from ..smartdevice import SmartDevice
|
|
||||||
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
DEFAULT_TEMP_RANGE = [2500, 6500]
|
DEFAULT_TEMP_RANGE = [2500, 6500]
|
||||||
@ -23,11 +18,11 @@ class ColorTemperature(SmartModule):
|
|||||||
|
|
||||||
REQUIRED_COMPONENT = "color_temperature"
|
REQUIRED_COMPONENT = "color_temperature"
|
||||||
|
|
||||||
def __init__(self, device: SmartDevice, module: str):
|
def _initialize_features(self):
|
||||||
super().__init__(device, module)
|
"""Initialize features."""
|
||||||
self._add_feature(
|
self._add_feature(
|
||||||
Feature(
|
Feature(
|
||||||
device,
|
self._device,
|
||||||
"color_temperature",
|
"color_temperature",
|
||||||
"Color temperature",
|
"Color temperature",
|
||||||
container=self,
|
container=self,
|
||||||
@ -61,7 +56,7 @@ class ColorTemperature(SmartModule):
|
|||||||
"""Return current color temperature."""
|
"""Return current color temperature."""
|
||||||
return self.data["color_temp"]
|
return self.data["color_temp"]
|
||||||
|
|
||||||
async def set_color_temp(self, temp: int):
|
async def set_color_temp(self, temp: int, *, brightness=None):
|
||||||
"""Set the color temperature."""
|
"""Set the color temperature."""
|
||||||
valid_temperature_range = self.valid_temperature_range
|
valid_temperature_range = self.valid_temperature_range
|
||||||
if temp < valid_temperature_range[0] or temp > valid_temperature_range[1]:
|
if temp < valid_temperature_range[0] or temp > valid_temperature_range[1]:
|
||||||
@ -70,8 +65,10 @@ class ColorTemperature(SmartModule):
|
|||||||
*valid_temperature_range, temp
|
*valid_temperature_range, temp
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
params = {"color_temp": temp}
|
||||||
return await self.call("set_device_info", {"color_temp": temp})
|
if brightness:
|
||||||
|
params["brightness"] = brightness
|
||||||
|
return await self.call("set_device_info", params)
|
||||||
|
|
||||||
async def _check_supported(self) -> bool:
|
async def _check_supported(self) -> bool:
|
||||||
"""Check the color_temp_range has more than one value."""
|
"""Check the color_temp_range has more than one value."""
|
||||||
|
@ -107,7 +107,9 @@ class Light(SmartModule, LightInterface):
|
|||||||
"""
|
"""
|
||||||
if not self.is_variable_color_temp:
|
if not self.is_variable_color_temp:
|
||||||
raise KasaException("Bulb does not support colortemp.")
|
raise KasaException("Bulb does not support colortemp.")
|
||||||
return await self._device.modules[Module.ColorTemperature].set_color_temp(temp)
|
return await self._device.modules[Module.ColorTemperature].set_color_temp(
|
||||||
|
temp, brightness=brightness
|
||||||
|
)
|
||||||
|
|
||||||
async def set_brightness(
|
async def set_brightness(
|
||||||
self, brightness: int, *, transition: int | None = None
|
self, brightness: int, *, transition: int | None = None
|
||||||
|
@ -12,6 +12,7 @@ from kasa.tests.device_fixtures import (
|
|||||||
parametrize,
|
parametrize,
|
||||||
parametrize_combine,
|
parametrize_combine,
|
||||||
plug_iot,
|
plug_iot,
|
||||||
|
variable_temp_iot,
|
||||||
)
|
)
|
||||||
|
|
||||||
led_smart = parametrize(
|
led_smart = parametrize(
|
||||||
@ -36,6 +37,14 @@ dimmable_smart = parametrize(
|
|||||||
)
|
)
|
||||||
dimmable = parametrize_combine([dimmable_smart, dimmer_iot, dimmable_iot])
|
dimmable = parametrize_combine([dimmable_smart, dimmer_iot, dimmable_iot])
|
||||||
|
|
||||||
|
variable_temp_smart = parametrize(
|
||||||
|
"variable temp smart",
|
||||||
|
component_filter="color_temperature",
|
||||||
|
protocol_filter={"SMART"},
|
||||||
|
)
|
||||||
|
|
||||||
|
variable_temp = parametrize_combine([variable_temp_iot, variable_temp_smart])
|
||||||
|
|
||||||
light_preset_smart = parametrize(
|
light_preset_smart = parametrize(
|
||||||
"has light preset smart", component_filter="preset", protocol_filter={"SMART"}
|
"has light preset smart", component_filter="preset", protocol_filter={"SMART"}
|
||||||
)
|
)
|
||||||
@ -147,6 +156,45 @@ async def test_light_brightness(dev: Device):
|
|||||||
await light.set_brightness(feature.maximum_value + 10)
|
await light.set_brightness(feature.maximum_value + 10)
|
||||||
|
|
||||||
|
|
||||||
|
@variable_temp
|
||||||
|
async def test_light_color_temp(dev: Device):
|
||||||
|
"""Test color temp setter and getter."""
|
||||||
|
assert isinstance(dev, Device)
|
||||||
|
|
||||||
|
light = next(get_parent_and_child_modules(dev, Module.Light))
|
||||||
|
assert light
|
||||||
|
if not light.is_variable_color_temp:
|
||||||
|
pytest.skip(
|
||||||
|
"Some smart light strips have color_temperature"
|
||||||
|
" component but min and max are the same"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Test getting the value
|
||||||
|
feature = light._device.features["color_temperature"]
|
||||||
|
assert isinstance(feature.minimum_value, int)
|
||||||
|
assert isinstance(feature.maximum_value, int)
|
||||||
|
|
||||||
|
await light.set_color_temp(feature.minimum_value + 10)
|
||||||
|
await dev.update()
|
||||||
|
assert light.color_temp == feature.minimum_value + 10
|
||||||
|
|
||||||
|
# Test setting brightness with color temp
|
||||||
|
await light.set_brightness(50)
|
||||||
|
await dev.update()
|
||||||
|
assert light.brightness == 50
|
||||||
|
|
||||||
|
await light.set_color_temp(feature.minimum_value + 20, brightness=60)
|
||||||
|
await dev.update()
|
||||||
|
assert light.color_temp == feature.minimum_value + 20
|
||||||
|
assert light.brightness == 60
|
||||||
|
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
await light.set_color_temp(feature.minimum_value - 10)
|
||||||
|
|
||||||
|
with pytest.raises(ValueError):
|
||||||
|
await light.set_color_temp(feature.maximum_value + 10)
|
||||||
|
|
||||||
|
|
||||||
@light
|
@light
|
||||||
async def test_light_set_state(dev: Device):
|
async def test_light_set_state(dev: Device):
|
||||||
"""Test brightness setter and getter."""
|
"""Test brightness setter and getter."""
|
||||||
|
Loading…
Reference in New Issue
Block a user