| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,94 @@ | ||
| """Implementation of color module.""" | ||
|
|
||
| from __future__ import annotations | ||
|
|
||
| from typing import TYPE_CHECKING | ||
|
|
||
| from ...bulb import HSV | ||
| from ...feature import Feature | ||
| from ..smartmodule import SmartModule | ||
|
|
||
| if TYPE_CHECKING: | ||
| from ..smartdevice import SmartDevice | ||
|
|
||
|
|
||
| class ColorModule(SmartModule): | ||
| """Implementation of color module.""" | ||
|
|
||
| REQUIRED_COMPONENT = "color" | ||
|
|
||
| def __init__(self, device: SmartDevice, module: str): | ||
| super().__init__(device, module) | ||
| self._add_feature( | ||
| Feature( | ||
| device, | ||
| "HSV", | ||
| container=self, | ||
| attribute_getter="hsv", | ||
| # TODO proper type for setting hsv | ||
| attribute_setter="set_hsv", | ||
| ) | ||
| ) | ||
|
|
||
| def query(self) -> dict: | ||
| """Query to execute during the update cycle.""" | ||
| # HSV is contained in the main device info response. | ||
| return {} | ||
|
|
||
| @property | ||
| def hsv(self) -> HSV: | ||
| """Return the current HSV state of the bulb. | ||
|
|
||
| :return: hue, saturation and value (degrees, %, 1-100) | ||
| """ | ||
| h, s, v = ( | ||
| self.data.get("hue", 0), | ||
| self.data.get("saturation", 0), | ||
| self.data.get("brightness", 0), | ||
| ) | ||
|
|
||
| return HSV(hue=h, saturation=s, value=v) | ||
|
|
||
| def _raise_for_invalid_brightness(self, value: int): | ||
| """Raise error on invalid brightness value.""" | ||
| if not isinstance(value, int) or not (1 <= value <= 100): | ||
| raise ValueError(f"Invalid brightness value: {value} (valid range: 1-100%)") | ||
|
|
||
| async def set_hsv( | ||
| self, | ||
| hue: int, | ||
| saturation: int, | ||
| value: int | None = None, | ||
| *, | ||
| transition: int | None = None, | ||
| ) -> dict: | ||
| """Set new HSV. | ||
|
|
||
| Note, transition is not supported and will be ignored. | ||
|
|
||
| :param int hue: hue in degrees | ||
| :param int saturation: saturation in percentage [0,100] | ||
| :param int value: value in percentage [0, 100] | ||
| :param int transition: transition in milliseconds. | ||
| """ | ||
| if not isinstance(hue, int) or not (0 <= hue <= 360): | ||
| raise ValueError(f"Invalid hue value: {hue} (valid range: 0-360)") | ||
|
|
||
| if not isinstance(saturation, int) or not (0 <= saturation <= 100): | ||
| raise ValueError( | ||
| f"Invalid saturation value: {saturation} (valid range: 0-100%)" | ||
| ) | ||
|
|
||
| if value is not None: | ||
| self._raise_for_invalid_brightness(value) | ||
|
|
||
| request_payload = { | ||
| "color_temp": 0, # If set, color_temp takes precedence over hue&sat | ||
| "hue": hue, | ||
| "saturation": saturation, | ||
| } | ||
| # The device errors on invalid brightness values. | ||
| if value is not None: | ||
| request_payload["brightness"] = value | ||
|
|
||
| return await self.call("set_device_info", {**request_payload}) | ||
| Back | FazBrowse Home | New Git URL |
Uh oh!
There was an error while loading. Please reload this page.