50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from copy import deepcopy
|
|
|
|
from ha_deconz_bridge.state import ControllerCommand, ControllerState
|
|
from ha_deconz_bridge.translate import controller_command_to_state
|
|
|
|
|
|
class FakeControllerBackend:
|
|
def __init__(self, resources: dict[str, dict[str, object]]) -> None:
|
|
self._resources = deepcopy(resources)
|
|
|
|
def fetch_controller_resource(self, controller_id: str) -> dict[str, object]:
|
|
return deepcopy(self._resources[controller_id])
|
|
|
|
def read_controller_state(self, controller_id: str) -> ControllerState:
|
|
resource = self._resources[controller_id]
|
|
state = resource.get("state", {})
|
|
return self.normalize_event(controller_id, state)
|
|
|
|
def write_controller_command(self, controller_id: str, command: ControllerCommand) -> None:
|
|
state = controller_command_to_state(command)
|
|
resource = self._resources[controller_id]
|
|
raw_state: dict[str, object] = {
|
|
"reachable": True,
|
|
"on": state.on,
|
|
}
|
|
if state.brightness is not None:
|
|
raw_state["bri"] = state.brightness
|
|
if state.mode == "rgb" and state.xy is not None:
|
|
raw_state["colormode"] = "xy"
|
|
raw_state["xy"] = list(state.xy)
|
|
elif state.mode == "color_temp" and state.color_temp is not None:
|
|
raw_state["colormode"] = "ct"
|
|
raw_state["ct"] = state.color_temp
|
|
resource["state"] = raw_state
|
|
|
|
def normalize_event(
|
|
self,
|
|
controller_id: str,
|
|
raw_state: dict[str, object],
|
|
) -> ControllerState:
|
|
from ha_deconz_bridge.backends.deconz import DeconzBackend
|
|
|
|
return DeconzBackend._normalize_state(raw_state)
|
|
|
|
def push_state(self, controller_id: str, raw_state: dict[str, object]) -> None:
|
|
self._resources[controller_id]["state"] = deepcopy(raw_state)
|
|
|