189 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
"""Support for Bond lights."""
 | 
						|
from __future__ import annotations
 | 
						|
 | 
						|
import logging
 | 
						|
from typing import Any
 | 
						|
 | 
						|
from bond_api import Action, BPUPSubscriptions, DeviceType
 | 
						|
 | 
						|
from homeassistant.components.light import (
 | 
						|
    ATTR_BRIGHTNESS,
 | 
						|
    SUPPORT_BRIGHTNESS,
 | 
						|
    LightEntity,
 | 
						|
)
 | 
						|
from homeassistant.config_entries import ConfigEntry
 | 
						|
from homeassistant.core import HomeAssistant
 | 
						|
from homeassistant.helpers.entity import Entity
 | 
						|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
 | 
						|
 | 
						|
from . import BondHub
 | 
						|
from .const import BPUP_SUBS, DOMAIN, HUB
 | 
						|
from .entity import BondEntity
 | 
						|
from .utils import BondDevice
 | 
						|
 | 
						|
_LOGGER = logging.getLogger(__name__)
 | 
						|
 | 
						|
 | 
						|
async def async_setup_entry(
 | 
						|
    hass: HomeAssistant,
 | 
						|
    entry: ConfigEntry,
 | 
						|
    async_add_entities: AddEntitiesCallback,
 | 
						|
) -> None:
 | 
						|
    """Set up Bond light devices."""
 | 
						|
    data = hass.data[DOMAIN][entry.entry_id]
 | 
						|
    hub: BondHub = data[HUB]
 | 
						|
    bpup_subs: BPUPSubscriptions = data[BPUP_SUBS]
 | 
						|
 | 
						|
    fan_lights: list[Entity] = [
 | 
						|
        BondLight(hub, device, bpup_subs)
 | 
						|
        for device in hub.devices
 | 
						|
        if DeviceType.is_fan(device.type)
 | 
						|
        and device.supports_light()
 | 
						|
        and not (device.supports_up_light() and device.supports_down_light())
 | 
						|
    ]
 | 
						|
 | 
						|
    fan_up_lights: list[Entity] = [
 | 
						|
        BondUpLight(hub, device, bpup_subs, "up_light")
 | 
						|
        for device in hub.devices
 | 
						|
        if DeviceType.is_fan(device.type) and device.supports_up_light()
 | 
						|
    ]
 | 
						|
 | 
						|
    fan_down_lights: list[Entity] = [
 | 
						|
        BondDownLight(hub, device, bpup_subs, "down_light")
 | 
						|
        for device in hub.devices
 | 
						|
        if DeviceType.is_fan(device.type) and device.supports_down_light()
 | 
						|
    ]
 | 
						|
 | 
						|
    fireplaces: list[Entity] = [
 | 
						|
        BondFireplace(hub, device, bpup_subs)
 | 
						|
        for device in hub.devices
 | 
						|
        if DeviceType.is_fireplace(device.type)
 | 
						|
    ]
 | 
						|
 | 
						|
    fp_lights: list[Entity] = [
 | 
						|
        BondLight(hub, device, bpup_subs, "light")
 | 
						|
        for device in hub.devices
 | 
						|
        if DeviceType.is_fireplace(device.type) and device.supports_light()
 | 
						|
    ]
 | 
						|
 | 
						|
    lights: list[Entity] = [
 | 
						|
        BondLight(hub, device, bpup_subs)
 | 
						|
        for device in hub.devices
 | 
						|
        if DeviceType.is_light(device.type)
 | 
						|
    ]
 | 
						|
 | 
						|
    async_add_entities(
 | 
						|
        fan_lights + fan_up_lights + fan_down_lights + fireplaces + fp_lights + lights,
 | 
						|
        True,
 | 
						|
    )
 | 
						|
 | 
						|
 | 
						|
class BondBaseLight(BondEntity, LightEntity):
 | 
						|
    """Representation of a Bond light."""
 | 
						|
 | 
						|
    _attr_supported_features = 0
 | 
						|
 | 
						|
 | 
						|
class BondLight(BondBaseLight, BondEntity, LightEntity):
 | 
						|
    """Representation of a Bond light."""
 | 
						|
 | 
						|
    def __init__(
 | 
						|
        self,
 | 
						|
        hub: BondHub,
 | 
						|
        device: BondDevice,
 | 
						|
        bpup_subs: BPUPSubscriptions,
 | 
						|
        sub_device: str | None = None,
 | 
						|
    ) -> None:
 | 
						|
        """Create HA entity representing Bond light."""
 | 
						|
        super().__init__(hub, device, bpup_subs, sub_device)
 | 
						|
        if device.supports_set_brightness():
 | 
						|
            self._attr_supported_features = SUPPORT_BRIGHTNESS
 | 
						|
 | 
						|
    def _apply_state(self, state: dict) -> None:
 | 
						|
        self._attr_is_on = state.get("light") == 1
 | 
						|
        brightness = state.get("brightness")
 | 
						|
        self._attr_brightness = round(brightness * 255 / 100) if brightness else None
 | 
						|
 | 
						|
    async def async_turn_on(self, **kwargs: Any) -> None:
 | 
						|
        """Turn on the light."""
 | 
						|
        brightness = kwargs.get(ATTR_BRIGHTNESS)
 | 
						|
        if brightness:
 | 
						|
            await self._hub.bond.action(
 | 
						|
                self._device.device_id,
 | 
						|
                Action.set_brightness(round((brightness * 100) / 255)),
 | 
						|
            )
 | 
						|
        else:
 | 
						|
            await self._hub.bond.action(self._device.device_id, Action.turn_light_on())
 | 
						|
 | 
						|
    async def async_turn_off(self, **kwargs: Any) -> None:
 | 
						|
        """Turn off the light."""
 | 
						|
        await self._hub.bond.action(self._device.device_id, Action.turn_light_off())
 | 
						|
 | 
						|
 | 
						|
class BondDownLight(BondBaseLight, BondEntity, LightEntity):
 | 
						|
    """Representation of a Bond light."""
 | 
						|
 | 
						|
    def _apply_state(self, state: dict) -> None:
 | 
						|
        self._attr_is_on = bool(state.get("down_light") and state.get("light"))
 | 
						|
 | 
						|
    async def async_turn_on(self, **kwargs: Any) -> None:
 | 
						|
        """Turn on the light."""
 | 
						|
        await self._hub.bond.action(
 | 
						|
            self._device.device_id, Action(Action.TURN_DOWN_LIGHT_ON)
 | 
						|
        )
 | 
						|
 | 
						|
    async def async_turn_off(self, **kwargs: Any) -> None:
 | 
						|
        """Turn off the light."""
 | 
						|
        await self._hub.bond.action(
 | 
						|
            self._device.device_id, Action(Action.TURN_DOWN_LIGHT_OFF)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
class BondUpLight(BondBaseLight, BondEntity, LightEntity):
 | 
						|
    """Representation of a Bond light."""
 | 
						|
 | 
						|
    def _apply_state(self, state: dict) -> None:
 | 
						|
        self._attr_is_on = bool(state.get("up_light") and state.get("light"))
 | 
						|
 | 
						|
    async def async_turn_on(self, **kwargs: Any) -> None:
 | 
						|
        """Turn on the light."""
 | 
						|
        await self._hub.bond.action(
 | 
						|
            self._device.device_id, Action(Action.TURN_UP_LIGHT_ON)
 | 
						|
        )
 | 
						|
 | 
						|
    async def async_turn_off(self, **kwargs: Any) -> None:
 | 
						|
        """Turn off the light."""
 | 
						|
        await self._hub.bond.action(
 | 
						|
            self._device.device_id, Action(Action.TURN_UP_LIGHT_OFF)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
class BondFireplace(BondEntity, LightEntity):
 | 
						|
    """Representation of a Bond-controlled fireplace."""
 | 
						|
 | 
						|
    _attr_supported_features = SUPPORT_BRIGHTNESS
 | 
						|
 | 
						|
    def _apply_state(self, state: dict) -> None:
 | 
						|
        power = state.get("power")
 | 
						|
        flame = state.get("flame")
 | 
						|
        self._attr_is_on = power == 1
 | 
						|
        self._attr_brightness = round(flame * 255 / 100) if flame else None
 | 
						|
        self._attr_icon = "mdi:fireplace" if power == 1 else "mdi:fireplace-off"
 | 
						|
 | 
						|
    async def async_turn_on(self, **kwargs: Any) -> None:
 | 
						|
        """Turn the fireplace on."""
 | 
						|
        _LOGGER.debug("Fireplace async_turn_on called with: %s", kwargs)
 | 
						|
 | 
						|
        brightness = kwargs.get(ATTR_BRIGHTNESS)
 | 
						|
        if brightness:
 | 
						|
            flame = round((brightness * 100) / 255)
 | 
						|
            await self._hub.bond.action(self._device.device_id, Action.set_flame(flame))
 | 
						|
        else:
 | 
						|
            await self._hub.bond.action(self._device.device_id, Action.turn_on())
 | 
						|
 | 
						|
    async def async_turn_off(self, **kwargs: Any) -> None:
 | 
						|
        """Turn the fireplace off."""
 | 
						|
        _LOGGER.debug("Fireplace async_turn_off called with: %s", kwargs)
 | 
						|
 | 
						|
        await self._hub.bond.action(self._device.device_id, Action.turn_off())
 |