116 lines
3.9 KiB
Python
116 lines
3.9 KiB
Python
"""LED BLE integration light platform."""
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from led_ble import LEDBLE
|
|
|
|
from homeassistant.components.light import (
|
|
ATTR_BRIGHTNESS,
|
|
ATTR_EFFECT,
|
|
ATTR_RGB_COLOR,
|
|
ATTR_WHITE,
|
|
ColorMode,
|
|
LightEntity,
|
|
LightEntityFeature,
|
|
)
|
|
from homeassistant.config_entries import ConfigEntry
|
|
from homeassistant.core import HomeAssistant, callback
|
|
from homeassistant.helpers import device_registry as dr
|
|
from homeassistant.helpers.entity import DeviceInfo
|
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
|
from homeassistant.helpers.update_coordinator import (
|
|
CoordinatorEntity,
|
|
DataUpdateCoordinator,
|
|
)
|
|
|
|
from .const import DEFAULT_EFFECT_SPEED, DOMAIN
|
|
from .models import LEDBLEData
|
|
|
|
|
|
async def async_setup_entry(
|
|
hass: HomeAssistant,
|
|
entry: ConfigEntry,
|
|
async_add_entities: AddEntitiesCallback,
|
|
) -> None:
|
|
"""Set up the light platform for LEDBLE."""
|
|
data: LEDBLEData = hass.data[DOMAIN][entry.entry_id]
|
|
async_add_entities([LEDBLEEntity(data.coordinator, data.device, entry.title)])
|
|
|
|
|
|
class LEDBLEEntity(CoordinatorEntity, LightEntity):
|
|
"""Representation of LEDBLE device."""
|
|
|
|
_attr_supported_color_modes = {ColorMode.RGB, ColorMode.WHITE}
|
|
_attr_has_entity_name = True
|
|
_attr_supported_features = LightEntityFeature.EFFECT
|
|
|
|
def __init__(
|
|
self, coordinator: DataUpdateCoordinator, device: LEDBLE, name: str
|
|
) -> None:
|
|
"""Initialize an ledble light."""
|
|
super().__init__(coordinator)
|
|
self._device = device
|
|
self._attr_unique_id = device.address
|
|
self._attr_device_info = DeviceInfo(
|
|
name=name,
|
|
model=f"{device.model_data.description} {hex(device.model_num)}",
|
|
sw_version=hex(device.version_num),
|
|
connections={(dr.CONNECTION_BLUETOOTH, device.address)},
|
|
)
|
|
self._async_update_attrs()
|
|
|
|
@callback
|
|
def _async_update_attrs(self) -> None:
|
|
"""Handle updating _attr values."""
|
|
device = self._device
|
|
self._attr_color_mode = ColorMode.WHITE if device.w else ColorMode.RGB
|
|
self._attr_brightness = device.brightness
|
|
self._attr_rgb_color = device.rgb_unscaled
|
|
self._attr_is_on = device.on
|
|
self._attr_effect = device.effect
|
|
self._attr_effect_list = device.effect_list
|
|
|
|
async def _async_set_effect(self, effect: str, brightness: int) -> None:
|
|
"""Set an effect."""
|
|
await self._device.async_set_effect(
|
|
effect,
|
|
self._device.speed or DEFAULT_EFFECT_SPEED,
|
|
round(brightness / 255 * 100),
|
|
)
|
|
|
|
async def async_turn_on(self, **kwargs: Any) -> None:
|
|
"""Instruct the light to turn on."""
|
|
brightness = kwargs.get(ATTR_BRIGHTNESS, self.brightness)
|
|
if effect := kwargs.get(ATTR_EFFECT):
|
|
await self._async_set_effect(effect, brightness)
|
|
return
|
|
if ATTR_RGB_COLOR in kwargs:
|
|
rgb = kwargs[ATTR_RGB_COLOR]
|
|
await self._device.set_rgb(rgb, brightness)
|
|
return
|
|
if ATTR_BRIGHTNESS in kwargs:
|
|
await self._device.set_brightness(brightness)
|
|
return
|
|
if ATTR_WHITE in kwargs:
|
|
await self._device.set_white(kwargs[ATTR_WHITE])
|
|
return
|
|
await self._device.turn_on()
|
|
|
|
async def async_turn_off(self, **kwargs: Any) -> None:
|
|
"""Instruct the light to turn off."""
|
|
await self._device.turn_off()
|
|
|
|
@callback
|
|
def _handle_coordinator_update(self, *args: Any) -> None:
|
|
"""Handle data update."""
|
|
self._async_update_attrs()
|
|
self.async_write_ha_state()
|
|
|
|
async def async_added_to_hass(self) -> None:
|
|
"""Register callbacks."""
|
|
self.async_on_remove(
|
|
self._device.register_callback(self._handle_coordinator_update)
|
|
)
|
|
return await super().async_added_to_hass()
|