Initial Commit
This commit is contained in:
@@ -0,0 +1,190 @@
|
||||
"""AsusRouter light module."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
from typing import Any
|
||||
|
||||
from asusrouter.modules.aura import AsusAura
|
||||
from asusrouter.modules.color import ColorRGB, scale_value_int
|
||||
from asusrouter.modules.led import AsusLED
|
||||
from homeassistant.components.light import (
|
||||
ColorMode,
|
||||
LightEntity,
|
||||
LightEntityFeature,
|
||||
)
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.core import HomeAssistant
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator
|
||||
|
||||
from .const import ASUSROUTER, DOMAIN, STATIC_AURA, STATIC_LIGHTS
|
||||
from .dataclass import ARLightDescription
|
||||
from .entity import ARBinaryEntity, async_setup_ar_entry
|
||||
from .modules.aura import AURA_EFFECTS, AURA_NO_EFFECT, per_zone_light
|
||||
from .router import ARDevice
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
EFFECT = "effect"
|
||||
RGB_COLOR = "rgb_color"
|
||||
BRIGHTNESS = "brightness"
|
||||
COLOR_MODE = "color_mode"
|
||||
ZONE_ID = "zone_id"
|
||||
|
||||
|
||||
async def async_setup_entry(
|
||||
hass: HomeAssistant,
|
||||
config_entry: ConfigEntry,
|
||||
async_add_entities: AddEntitiesCallback,
|
||||
) -> None:
|
||||
"""Set up AsusRouter lights."""
|
||||
|
||||
leds = STATIC_LIGHTS.copy()
|
||||
if (
|
||||
hass.data[DOMAIN][config_entry.entry_id][
|
||||
ASUSROUTER
|
||||
].bridge.identity.led
|
||||
is True
|
||||
):
|
||||
await async_setup_ar_entry(
|
||||
hass, config_entry, async_add_entities, leds, ARLightLED
|
||||
)
|
||||
|
||||
auras = STATIC_AURA.copy()
|
||||
if (
|
||||
hass.data[DOMAIN][config_entry.entry_id][
|
||||
ASUSROUTER
|
||||
].bridge.identity.aura
|
||||
is True
|
||||
):
|
||||
# Create per-zone lights
|
||||
auras.extend(
|
||||
per_zone_light(
|
||||
hass.data[DOMAIN][config_entry.entry_id][
|
||||
ASUSROUTER
|
||||
].bridge.identity.aura_zone
|
||||
)
|
||||
)
|
||||
|
||||
await async_setup_ar_entry(
|
||||
hass, config_entry, async_add_entities, auras, ARLightAura
|
||||
)
|
||||
|
||||
|
||||
class ARLightLED(ARBinaryEntity, LightEntity):
|
||||
"""AsusRouter LED light."""
|
||||
|
||||
_attr_color_mode = ColorMode.ONOFF
|
||||
_attr_supported_color_modes = {ColorMode.ONOFF}
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
coordinator: DataUpdateCoordinator,
|
||||
router: ARDevice,
|
||||
description: ARLightDescription,
|
||||
) -> None:
|
||||
"""Initialize AsusRouter LED light."""
|
||||
|
||||
super().__init__(coordinator, router, description)
|
||||
self.entity_description: ARLightDescription = description
|
||||
|
||||
async def async_turn_on(
|
||||
self,
|
||||
**kwargs: Any,
|
||||
) -> None:
|
||||
"""Turn on LED."""
|
||||
|
||||
await self._set_state(AsusLED.ON)
|
||||
|
||||
async def async_turn_off(
|
||||
self,
|
||||
**kwargs: Any,
|
||||
) -> None:
|
||||
"""Turn off LED."""
|
||||
|
||||
await self._set_state(AsusLED.OFF)
|
||||
|
||||
|
||||
class ARLightAura(ARBinaryEntity, LightEntity):
|
||||
"""AsusRouter Aura light."""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
coordinator: DataUpdateCoordinator,
|
||||
router: ARDevice,
|
||||
description: ARLightDescription,
|
||||
) -> None:
|
||||
"""Initialize AsusRouter Aura light."""
|
||||
|
||||
self._attr_supported_features = LightEntityFeature.EFFECT
|
||||
self._attr_effect_list = AURA_EFFECTS
|
||||
|
||||
super().__init__(coordinator, router, description)
|
||||
self.entity_description: ARLightDescription = description
|
||||
|
||||
async def async_turn_on(
|
||||
self,
|
||||
**kwargs: Any,
|
||||
) -> None:
|
||||
"""Turn on Aura."""
|
||||
|
||||
effect = AsusAura.ON
|
||||
if "effect" in kwargs:
|
||||
effect = AsusAura.__members__.get(
|
||||
kwargs["effect"].upper(), AsusAura.ON
|
||||
)
|
||||
|
||||
color = None
|
||||
if "rgb_color" in kwargs:
|
||||
rgb = kwargs["rgb_color"]
|
||||
color = ColorRGB(rgb[0], rgb[1], rgb[2], scale=255)
|
||||
|
||||
brightness = None
|
||||
if "brightness" in kwargs:
|
||||
brightness = scale_value_int(kwargs["brightness"], 128, 255)
|
||||
|
||||
zone_id = (
|
||||
self.entity_description.capabilities.get("zone_id", None)
|
||||
if self.entity_description.capabilities
|
||||
else None
|
||||
)
|
||||
|
||||
await self._set_state(
|
||||
effect,
|
||||
color=color,
|
||||
brightness=brightness,
|
||||
zone=zone_id,
|
||||
)
|
||||
|
||||
async def async_turn_off(
|
||||
self,
|
||||
**kwargs: Any,
|
||||
) -> None:
|
||||
"""Turn off Aura."""
|
||||
|
||||
await self._set_state(AsusAura.OFF)
|
||||
|
||||
@property
|
||||
def effect(self) -> str | None:
|
||||
"""Return the current effect."""
|
||||
|
||||
return self.coordinator.data.get("effect", AURA_NO_EFFECT)
|
||||
|
||||
@property
|
||||
def supported_color_modes(self) -> set[str] | None:
|
||||
"""Return the supported color modes."""
|
||||
|
||||
# This is a workaround to avoid a bug in HA
|
||||
# which does not hide the color picker and brightness slider
|
||||
# even when the current color mode is set to ONOFF only
|
||||
_supported_color_modes = self.coordinator.data.get(
|
||||
"color_mode", ColorMode.RGB
|
||||
)
|
||||
return {_supported_color_modes}
|
||||
|
||||
@property
|
||||
def color_mode(self) -> ColorMode | str | None:
|
||||
"""Return the color mode."""
|
||||
|
||||
return self.coordinator.data.get("color_mode", ColorMode.RGB)
|
||||
Reference in New Issue
Block a user