core/homeassistant/components/hue/switch.py

95 lines
3.2 KiB
Python

"""Support for switch platform for Hue resources (V2 only)."""
from __future__ import annotations
from typing import Any, Union
from aiohue.v2 import HueBridgeV2
from aiohue.v2.controllers.events import EventType
from aiohue.v2.controllers.sensors import LightLevelController, MotionController
from aiohue.v2.models.resource import SensingService
from homeassistant.components.switch import SwitchDeviceClass, SwitchEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity import EntityCategory
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .bridge import HueBridge
from .const import DOMAIN
from .v2.entity import HueBaseEntity
ControllerType = Union[LightLevelController, MotionController]
async def async_setup_entry(
hass: HomeAssistant,
config_entry: ConfigEntry,
async_add_entities: AddEntitiesCallback,
) -> None:
"""Set up Hue switch platform from Hue resources."""
bridge: HueBridge = hass.data[DOMAIN][config_entry.entry_id]
api: HueBridgeV2 = bridge.api
if bridge.api_version == 1:
# should not happen, but just in case
raise NotImplementedError("Switch support is only available for V2 bridges")
@callback
def register_items(controller: ControllerType):
@callback
def async_add_entity(event_type: EventType, resource: SensingService) -> None:
"""Add entity from Hue resource."""
async_add_entities(
[HueSensingServiceEnabledEntity(bridge, controller, resource)]
)
# add all current items in controller
for item in controller:
async_add_entity(EventType.RESOURCE_ADDED, item)
# register listener for new items only
config_entry.async_on_unload(
controller.subscribe(
async_add_entity, event_filter=EventType.RESOURCE_ADDED
)
)
# setup for each switch-type hue resource
register_items(api.sensors.motion)
register_items(api.sensors.light_level)
class HueSensingServiceEnabledEntity(HueBaseEntity, SwitchEntity):
"""Representation of a Switch entity from Hue SensingService."""
_attr_entity_category = EntityCategory.CONFIG
_attr_device_class = SwitchDeviceClass.SWITCH
def __init__(
self,
bridge: HueBridge,
controller: LightLevelController | MotionController,
resource: SensingService,
) -> None:
"""Initialize the entity."""
super().__init__(bridge, controller, resource)
self.resource = resource
self.controller = controller
@property
def is_on(self) -> bool:
"""Return true if the switch is on."""
return self.resource.enabled
async def async_turn_on(self, **kwargs: Any) -> None:
"""Turn the entity on."""
await self.bridge.async_request_call(
self.controller.set_enabled, self.resource.id, enabled=True
)
async def async_turn_off(self, **kwargs: Any) -> None:
"""Turn the entity on."""
await self.bridge.async_request_call(
self.controller.set_enabled, self.resource.id, enabled=False
)