132 lines
3.4 KiB
Python
132 lines
3.4 KiB
Python
"""Aura RGB module for AsusRouter integration.
|
|
|
|
This module allows converting AsusRouter Aura data to the
|
|
Home Assistant format. This is required due to the complex
|
|
data structure and effect handling by Home Assistant.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from asusrouter.modules.color import ColorRGBB
|
|
from asusrouter.tools.converters import scale_value_int
|
|
from homeassistant.components.light import ColorMode
|
|
from homeassistant.const import EntityCategory
|
|
|
|
from ..const import ICON_LIGHT_OFF, ICON_LIGHT_ON
|
|
from ..dataclass import AREntityDescription, ARLightDescription
|
|
|
|
AURA_NO_EFFECT = "EFFECT_OFF"
|
|
AURA_FALLBACK_BRIGHTNESS = 128
|
|
AURA_FALLBACK_COLOR = ColorRGBB(
|
|
(128, 128, 128),
|
|
AURA_FALLBACK_BRIGHTNESS,
|
|
scale=128,
|
|
)
|
|
|
|
AURA_EFFECTS = [
|
|
"Gradient",
|
|
"Static",
|
|
"Breathing",
|
|
"Evolution",
|
|
"Rainbow",
|
|
"Wave",
|
|
"Marquee",
|
|
]
|
|
|
|
AURA_EFFECTS_MAP = {
|
|
0: AURA_NO_EFFECT,
|
|
1: "Gradient",
|
|
2: "Static",
|
|
3: "Breathing",
|
|
4: "Evolution",
|
|
5: "Rainbow",
|
|
6: "Wave",
|
|
7: "Marquee",
|
|
}
|
|
|
|
SUPPORTED_COLOR_MODES = {
|
|
0: ColorMode.ONOFF,
|
|
1: ColorMode.RGB,
|
|
2: ColorMode.RGB,
|
|
3: ColorMode.RGB,
|
|
4: ColorMode.ONOFF,
|
|
5: ColorMode.ONOFF,
|
|
6: ColorMode.ONOFF,
|
|
7: ColorMode.RGB,
|
|
}
|
|
|
|
ACTIVE_BRIGHTNESS = "active_brightness"
|
|
ACTIVE_COLOR = "active_color"
|
|
BRIGHTNESS = "brightness"
|
|
RGB_COLOR = "rgb_color"
|
|
SCHEME = "scheme"
|
|
STATE = "state"
|
|
ZONES = "zones"
|
|
|
|
|
|
def aura_to_ha(data: dict[str, Any]) -> dict[str, Any]:
|
|
"""Convert AsusRouter Aura data to Home Assistant format."""
|
|
|
|
result = {
|
|
STATE: data.get(STATE, False),
|
|
ZONES: data.get(ZONES, 0),
|
|
}
|
|
|
|
# Current active effect
|
|
_effect = data.get(SCHEME, 0)
|
|
result["effect"] = AURA_EFFECTS_MAP.get(_effect, AURA_NO_EFFECT)
|
|
|
|
# Colors
|
|
if ACTIVE_COLOR in data:
|
|
result[RGB_COLOR] = ColorRGBB(data[ACTIVE_COLOR], scale=255).as_tuple()
|
|
if ACTIVE_BRIGHTNESS in data:
|
|
result[BRIGHTNESS] = scale_value_int(
|
|
data.get(ACTIVE_BRIGHTNESS, AURA_FALLBACK_BRIGHTNESS),
|
|
255,
|
|
128,
|
|
)
|
|
|
|
for i in range(result["zones"]):
|
|
color_key = f"active_{i}_color"
|
|
brightness_key = f"active_{i}_brightness"
|
|
if color_key in data:
|
|
result[f"{RGB_COLOR}_{i}"] = ColorRGBB(
|
|
data.get(color_key, AURA_FALLBACK_COLOR),
|
|
scale=255,
|
|
).as_tuple()
|
|
if brightness_key in data:
|
|
result[f"{BRIGHTNESS}_{i}"] = scale_value_int(
|
|
data.get(brightness_key, AURA_FALLBACK_BRIGHTNESS),
|
|
255,
|
|
128,
|
|
)
|
|
|
|
# Color mode support
|
|
result["color_mode"] = SUPPORTED_COLOR_MODES.get(_effect, ColorMode.ONOFF)
|
|
|
|
return result
|
|
|
|
|
|
def per_zone_light(zones: int = 3) -> list[AREntityDescription]:
|
|
"""Create a per-zone light entity descriptions."""
|
|
|
|
return [
|
|
ARLightDescription(
|
|
key=STATE,
|
|
key_group="aura",
|
|
name=f"AURA Zone {i + 1}",
|
|
icon_on=ICON_LIGHT_ON,
|
|
icon_off=ICON_LIGHT_OFF,
|
|
capabilities={"zone_id": i},
|
|
entity_category=EntityCategory.CONFIG,
|
|
entity_registry_enabled_default=False,
|
|
extra_state_attributes={
|
|
f"{BRIGHTNESS}_{i}": BRIGHTNESS,
|
|
f"{RGB_COLOR}_{i}": RGB_COLOR,
|
|
},
|
|
)
|
|
for i in range(zones)
|
|
]
|