diff --git a/homeassistant/components/lifx/const.py b/homeassistant/components/lifx/const.py index e29bca60053f..48a05af2c9e7 100644 --- a/homeassistant/components/lifx/const.py +++ b/homeassistant/components/lifx/const.py @@ -80,6 +80,8 @@ SERVICE_EFFECT_PULSE = "effect_pulse" SERVICE_EFFECT_SKY = "effect_sky" SERVICE_EFFECT_STOP = "effect_stop" SERVICE_PAINT_THEME = "paint_theme" +SERVICE_SET_HEV_CYCLE_STATE = "set_hev_cycle_state" +SERVICE_SET_STATE = "set_state" HEV_CYCLE_STATE = "hev_cycle_state" INFRARED_BRIGHTNESS = "infrared_brightness" diff --git a/homeassistant/components/lifx/light.py b/homeassistant/components/lifx/light.py index 28e6a18ff7b8..6d91489e5297 100644 --- a/homeassistant/components/lifx/light.py +++ b/homeassistant/components/lifx/light.py @@ -5,7 +5,6 @@ from datetime import datetime, timedelta from typing import Any, override import aiolifx_effects as aiolifx_effects_module -import probatio from homeassistant.components.light import ( ATTR_BRIGHTNESS, @@ -13,7 +12,6 @@ from homeassistant.components.light import ( ATTR_BRIGHTNESS_STEP_PCT, ATTR_EFFECT, ATTR_TRANSITION, - LIGHT_TURN_ON_SCHEMA, ColorMode, LightEntity, LightEntityFeature, @@ -21,13 +19,10 @@ from homeassistant.components.light import ( from homeassistant.const import ATTR_ENTITY_ID, Platform from homeassistant.core import CALLBACK_TYPE, HomeAssistant from homeassistant.exceptions import HomeAssistantError -from homeassistant.helpers import config_validation as cv, entity_platform from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.event import async_call_later -from homeassistant.helpers.typing import VolDictType from .const import ( - ATTR_DURATION, ATTR_INFRARED, ATTR_POWER, ATTR_ZONES, @@ -51,25 +46,6 @@ from .util import convert_8_to_16, convert_16_to_8, find_hsbk, lifx_features, me LIFX_STATE_SETTLE_DELAY = 0.3 -SERVICE_LIFX_SET_STATE = "set_state" - -LIFX_SET_STATE_SCHEMA: VolDictType = { - **LIGHT_TURN_ON_SCHEMA, - ATTR_INFRARED: probatio.All(probatio.Coerce(int), probatio.Clamp(min=0, max=255)), - ATTR_ZONES: probatio.All(cv.ensure_list, [cv.positive_int]), - ATTR_POWER: cv.boolean, -} - - -SERVICE_LIFX_SET_HEV_CYCLE_STATE = "set_hev_cycle_state" - -LIFX_SET_HEV_CYCLE_STATE_SCHEMA: VolDictType = { - probatio.Required(ATTR_POWER): cv.boolean, - ATTR_DURATION: probatio.All( - probatio.Coerce(float), probatio.Clamp(min=0, max=86400) - ), -} - HSBK_HUE = 0 HSBK_SATURATION = 1 HSBK_BRIGHTNESS = 2 @@ -85,17 +61,6 @@ async def async_setup_entry( coordinator = entry.runtime_data manager = hass.data[DATA_LIFX_MANAGER] device = coordinator.device - platform = entity_platform.async_get_current_platform() - platform.async_register_entity_service( - SERVICE_LIFX_SET_STATE, - LIFX_SET_STATE_SCHEMA, - "set_state", - ) - platform.async_register_entity_service( - SERVICE_LIFX_SET_HEV_CYCLE_STATE, - LIFX_SET_HEV_CYCLE_STATE_SCHEMA, - "set_hev_cycle_state", - ) if lifx_features(device)["matrix"]: if device.product in LIFX_CEILING_PRODUCT_IDS: entity: LIFXLight = LIFXCeiling(coordinator, manager, entry) diff --git a/homeassistant/components/lifx/services.py b/homeassistant/components/lifx/services.py index a170dd54f89a..e0fe9c94f363 100644 --- a/homeassistant/components/lifx/services.py +++ b/homeassistant/components/lifx/services.py @@ -15,17 +15,20 @@ from homeassistant.components.light import ( ATTR_TRANSITION, ATTR_XY_COLOR, COLOR_GROUP, + LIGHT_TURN_ON_SCHEMA, VALID_BRIGHTNESS, VALID_BRIGHTNESS_PCT, ) -from homeassistant.const import ATTR_MODE +from homeassistant.const import ATTR_MODE, Platform from homeassistant.core import HomeAssistant, ServiceCall, callback from homeassistant.exceptions import ServiceValidationError from homeassistant.helpers import config_validation as cv +from homeassistant.helpers.service import async_register_platform_entity_service from homeassistant.helpers.target import ( TargetSelection, async_extract_referenced_entity_ids, ) +from homeassistant.helpers.typing import VolDictType from .const import ( ATTR_CHANGE, @@ -33,8 +36,11 @@ from .const import ( ATTR_CLOUD_SATURATION_MIN, ATTR_CYCLES, ATTR_DIRECTION, + ATTR_DURATION, + ATTR_INFRARED, ATTR_PALETTE, ATTR_PERIOD, + ATTR_POWER, ATTR_POWER_ON, ATTR_SATURATION_MAX, ATTR_SATURATION_MIN, @@ -42,6 +48,7 @@ from .const import ( ATTR_SPEED, ATTR_SPREAD, ATTR_THEME, + ATTR_ZONES, DATA_LIFX_MANAGER, DOMAIN, SERVICE_EFFECT_COLORLOOP, @@ -52,6 +59,8 @@ from .const import ( SERVICE_EFFECT_SKY, SERVICE_EFFECT_STOP, SERVICE_PAINT_THEME, + SERVICE_SET_HEV_CYCLE_STATE, + SERVICE_SET_STATE, ) from .util import async_entry_is_legacy @@ -225,6 +234,21 @@ SERVICES_SCHEMA = { } +LIFX_SET_STATE_SCHEMA: VolDictType = { + **LIGHT_TURN_ON_SCHEMA, + ATTR_INFRARED: probatio.All(probatio.Coerce(int), probatio.Clamp(min=0, max=255)), + ATTR_ZONES: probatio.All(cv.ensure_list, [cv.positive_int]), + ATTR_POWER: cv.boolean, +} + +LIFX_SET_HEV_CYCLE_STATE_SCHEMA: VolDictType = { + probatio.Required(ATTR_POWER): cv.boolean, + ATTR_DURATION: probatio.All( + probatio.Coerce(float), probatio.Clamp(min=0, max=86400) + ), +} + + def _get_manager(service: ServiceCall) -> LIFXManager: """Return the LIFX manager, raising a user-facing error if unavailable.""" hass = service.hass @@ -255,8 +279,25 @@ async def _async_start_effect(service: ServiceCall) -> None: @callback def async_setup_services(hass: HomeAssistant) -> None: - """Register the LIFX effect services.""" + """Register the LIFX services.""" for service, schema in SERVICES_SCHEMA.items(): hass.services.async_register( DOMAIN, service, _async_start_effect, schema=schema ) + + async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_SET_STATE, + entity_domain=Platform.LIGHT, + schema=LIFX_SET_STATE_SCHEMA, + func="set_state", + ) + async_register_platform_entity_service( + hass, + DOMAIN, + SERVICE_SET_HEV_CYCLE_STATE, + entity_domain=Platform.LIGHT, + schema=LIFX_SET_HEV_CYCLE_STATE_SCHEMA, + func="set_hev_cycle_state", + )