from __future__ import annotations from pathlib import Path import sys import pytest sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "config.example")) from ha_deconz_bridge.color import Color from ha_deconz_bridge.lights import ChannelSpec, ControllerModeSpec, ControllerSpec, VirtualLightSpec from ha_deconz_bridge.settings import Settings @pytest.fixture def settings() -> Settings: return Settings() def _rgb_controller(zigbee_id: str) -> ControllerSpec: return ControllerSpec( zigbee_id=zigbee_id, name=f"RGB {zigbee_id}", modes={ "rgb": ControllerModeSpec( name="rgb", channels={ "r": ChannelSpec("r", Color.from_rgb((1.0, 0.0, 0.0), brightness=0.9)), "g": ChannelSpec("g", Color.from_rgb((0.0, 1.0, 0.0), brightness=1.2)), "b": ChannelSpec("b", Color.from_rgb((0.0, 0.0, 1.0), brightness=0.8)), }, ) }, ) def _ct_controller(zigbee_id: str) -> ControllerSpec: return ControllerSpec( zigbee_id=zigbee_id, name=f"CT {zigbee_id}", modes={ "color_temp": ControllerModeSpec( name="color_temp", channels={ "ww": ChannelSpec( "ww", Color.from_color_temp(500, brightness=1.0, temp_range=(153, 500)), ), "cw": ChannelSpec( "cw", Color.from_color_temp(153, brightness=1.0, temp_range=(153, 500)), ), }, ) }, ) @pytest.fixture def rgb_light_spec() -> VirtualLightSpec: return VirtualLightSpec( name="rgb_light", supported_color_modes=("rgb",), controllers={"1": _rgb_controller("1")}, ) @pytest.fixture def ct_light_spec() -> VirtualLightSpec: return VirtualLightSpec( name="ct_light", supported_color_modes=("color_temp",), controllers={"2": _ct_controller("2")}, ) @pytest.fixture def mixed_light_spec() -> VirtualLightSpec: shared = ControllerSpec( zigbee_id="3", name="Shared", modes={ "rgb": ControllerModeSpec( name="rgb", channels={ "r": ChannelSpec("r", Color.from_rgb((1.0, 0.0, 0.0), brightness=0.6)), "g": ChannelSpec("g", Color.from_rgb((0.0, 1.0, 0.0), brightness=0.6)), "b": ChannelSpec("b", Color.from_rgb((0.0, 0.0, 1.0), brightness=0.4)), }, ), "color_temp": ControllerModeSpec( name="color_temp", channels={ "ww": ChannelSpec( "ww", Color.from_color_temp(500, brightness=0.9, temp_range=(153, 500)), ), "cw": ChannelSpec( "cw", Color.from_color_temp(153, brightness=0.9, temp_range=(153, 500)), ), }, ), }, ) onoff = ControllerSpec( zigbee_id="4", name="Accent", modes={ "onoff": ControllerModeSpec( name="onoff", channels={"w": ChannelSpec("w", Color.from_rgb((1.0, 1.0, 1.0), brightness=0.3))}, ) }, ) return VirtualLightSpec( name="mixed_light", supported_color_modes=("rgb", "color_temp"), controllers={ "2": _ct_controller("2"), "3": shared, "4": onoff, }, ) @pytest.fixture def red_only_spec() -> VirtualLightSpec: return VirtualLightSpec( name="red_only", supported_color_modes=("rgb",), controllers={ "1": ControllerSpec( zigbee_id="1", name="Red only", modes={ "rgb": ControllerModeSpec( name="rgb", channels={ "r": ChannelSpec("r", Color.from_rgb((1.0, 0.0, 0.0), brightness=1.0)), }, ) }, ) }, )