mirror of
https://github.com/home-assistant/core.git
synced 2025-08-02 12:15:08 +02:00
Migrate the LIFX integration to use kelvin for color temp (#79775)
This commit is contained in:
@@ -3,7 +3,6 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import math
|
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
import aiolifx_effects as aiolifx_effects_module
|
import aiolifx_effects as aiolifx_effects_module
|
||||||
@@ -26,7 +25,6 @@ from homeassistant.helpers import entity_platform
|
|||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
from homeassistant.helpers.event import async_track_point_in_utc_time
|
from homeassistant.helpers.event import async_track_point_in_utc_time
|
||||||
import homeassistant.util.color as color_util
|
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
_LOGGER,
|
_LOGGER,
|
||||||
@@ -130,16 +128,13 @@ class LIFXLight(LIFXEntity, LightEntity):
|
|||||||
self.entry = entry
|
self.entry = entry
|
||||||
self._attr_unique_id = self.coordinator.serial_number
|
self._attr_unique_id = self.coordinator.serial_number
|
||||||
self._attr_name = self.bulb.label
|
self._attr_name = self.bulb.label
|
||||||
self._attr_min_mireds = math.floor(
|
self._attr_min_color_temp_kelvin = bulb_features["min_kelvin"]
|
||||||
color_util.color_temperature_kelvin_to_mired(bulb_features["max_kelvin"])
|
self._attr_max_color_temp_kelvin = bulb_features["max_kelvin"]
|
||||||
)
|
|
||||||
self._attr_max_mireds = math.ceil(
|
|
||||||
color_util.color_temperature_kelvin_to_mired(bulb_features["min_kelvin"])
|
|
||||||
)
|
|
||||||
if bulb_features["min_kelvin"] != bulb_features["max_kelvin"]:
|
if bulb_features["min_kelvin"] != bulb_features["max_kelvin"]:
|
||||||
color_mode = ColorMode.COLOR_TEMP
|
color_mode = ColorMode.COLOR_TEMP
|
||||||
else:
|
else:
|
||||||
color_mode = ColorMode.BRIGHTNESS
|
color_mode = ColorMode.BRIGHTNESS
|
||||||
|
|
||||||
self._attr_color_mode = color_mode
|
self._attr_color_mode = color_mode
|
||||||
self._attr_supported_color_modes = {color_mode}
|
self._attr_supported_color_modes = {color_mode}
|
||||||
self._attr_effect = None
|
self._attr_effect = None
|
||||||
@@ -151,11 +146,9 @@ class LIFXLight(LIFXEntity, LightEntity):
|
|||||||
return convert_16_to_8(int(fade * self.bulb.color[HSBK_BRIGHTNESS]))
|
return convert_16_to_8(int(fade * self.bulb.color[HSBK_BRIGHTNESS]))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def color_temp(self) -> int | None:
|
def color_temp_kelvin(self) -> int | None:
|
||||||
"""Return the color temperature."""
|
"""Return the color temperature of this light in kelvin."""
|
||||||
return color_util.color_temperature_kelvin_to_mired(
|
return int(self.bulb.color[HSBK_KELVIN])
|
||||||
self.bulb.color[HSBK_KELVIN]
|
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_on(self) -> bool:
|
def is_on(self) -> bool:
|
||||||
|
@@ -14,15 +14,14 @@ from homeassistant.components.light import (
|
|||||||
ATTR_BRIGHTNESS_PCT,
|
ATTR_BRIGHTNESS_PCT,
|
||||||
ATTR_COLOR_NAME,
|
ATTR_COLOR_NAME,
|
||||||
ATTR_COLOR_TEMP,
|
ATTR_COLOR_TEMP,
|
||||||
|
ATTR_COLOR_TEMP_KELVIN,
|
||||||
ATTR_HS_COLOR,
|
ATTR_HS_COLOR,
|
||||||
ATTR_KELVIN,
|
|
||||||
ATTR_RGB_COLOR,
|
ATTR_RGB_COLOR,
|
||||||
ATTR_TRANSITION,
|
ATTR_TRANSITION,
|
||||||
ATTR_XY_COLOR,
|
ATTR_XY_COLOR,
|
||||||
COLOR_GROUP,
|
COLOR_GROUP,
|
||||||
VALID_BRIGHTNESS,
|
VALID_BRIGHTNESS,
|
||||||
VALID_BRIGHTNESS_PCT,
|
VALID_BRIGHTNESS_PCT,
|
||||||
preprocess_turn_on_alternatives,
|
|
||||||
)
|
)
|
||||||
from homeassistant.const import ATTR_MODE
|
from homeassistant.const import ATTR_MODE
|
||||||
from homeassistant.core import HomeAssistant, ServiceCall, callback
|
from homeassistant.core import HomeAssistant, ServiceCall, callback
|
||||||
@@ -98,10 +97,10 @@ LIFX_EFFECT_PULSE_SCHEMA = cv.make_entity_service_schema(
|
|||||||
)
|
)
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
vol.Exclusive(ATTR_COLOR_TEMP, COLOR_GROUP): vol.All(
|
vol.Exclusive(ATTR_COLOR_TEMP_KELVIN, COLOR_GROUP): vol.All(
|
||||||
vol.Coerce(int), vol.Range(min=1)
|
vol.Coerce(int), vol.Range(min=1500, max=9000)
|
||||||
),
|
),
|
||||||
vol.Exclusive(ATTR_KELVIN, COLOR_GROUP): cv.positive_int,
|
vol.Exclusive(ATTR_COLOR_TEMP, COLOR_GROUP): cv.positive_int,
|
||||||
ATTR_PERIOD: vol.All(vol.Coerce(float), vol.Range(min=0.05)),
|
ATTR_PERIOD: vol.All(vol.Coerce(float), vol.Range(min=0.05)),
|
||||||
ATTR_CYCLES: vol.All(vol.Coerce(float), vol.Range(min=1)),
|
ATTR_CYCLES: vol.All(vol.Coerce(float), vol.Range(min=1)),
|
||||||
ATTR_MODE: vol.In(PULSE_MODES),
|
ATTR_MODE: vol.In(PULSE_MODES),
|
||||||
@@ -250,7 +249,6 @@ class LIFXManager:
|
|||||||
await self.effects_conductor.start(effect, bulbs)
|
await self.effects_conductor.start(effect, bulbs)
|
||||||
|
|
||||||
elif service == SERVICE_EFFECT_COLORLOOP:
|
elif service == SERVICE_EFFECT_COLORLOOP:
|
||||||
preprocess_turn_on_alternatives(self.hass, kwargs)
|
|
||||||
|
|
||||||
brightness = None
|
brightness = None
|
||||||
if ATTR_BRIGHTNESS in kwargs:
|
if ATTR_BRIGHTNESS in kwargs:
|
||||||
|
@@ -14,11 +14,10 @@ from awesomeversion import AwesomeVersion
|
|||||||
|
|
||||||
from homeassistant.components.light import (
|
from homeassistant.components.light import (
|
||||||
ATTR_BRIGHTNESS,
|
ATTR_BRIGHTNESS,
|
||||||
ATTR_COLOR_TEMP,
|
ATTR_COLOR_TEMP_KELVIN,
|
||||||
ATTR_HS_COLOR,
|
ATTR_HS_COLOR,
|
||||||
ATTR_RGB_COLOR,
|
ATTR_RGB_COLOR,
|
||||||
ATTR_XY_COLOR,
|
ATTR_XY_COLOR,
|
||||||
preprocess_turn_on_alternatives,
|
|
||||||
)
|
)
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.core import HomeAssistant, callback
|
from homeassistant.core import HomeAssistant, callback
|
||||||
@@ -81,8 +80,6 @@ def find_hsbk(hass: HomeAssistant, **kwargs: Any) -> list[float | int | None] |
|
|||||||
"""
|
"""
|
||||||
hue, saturation, brightness, kelvin = [None] * 4
|
hue, saturation, brightness, kelvin = [None] * 4
|
||||||
|
|
||||||
preprocess_turn_on_alternatives(hass, kwargs)
|
|
||||||
|
|
||||||
if ATTR_HS_COLOR in kwargs:
|
if ATTR_HS_COLOR in kwargs:
|
||||||
hue, saturation = kwargs[ATTR_HS_COLOR]
|
hue, saturation = kwargs[ATTR_HS_COLOR]
|
||||||
elif ATTR_RGB_COLOR in kwargs:
|
elif ATTR_RGB_COLOR in kwargs:
|
||||||
@@ -96,10 +93,8 @@ def find_hsbk(hass: HomeAssistant, **kwargs: Any) -> list[float | int | None] |
|
|||||||
saturation = int(saturation / 100 * 65535)
|
saturation = int(saturation / 100 * 65535)
|
||||||
kelvin = 3500
|
kelvin = 3500
|
||||||
|
|
||||||
if ATTR_COLOR_TEMP in kwargs:
|
if ATTR_COLOR_TEMP_KELVIN in kwargs:
|
||||||
kelvin = int(
|
kelvin = kwargs.pop(ATTR_COLOR_TEMP_KELVIN)
|
||||||
color_util.color_temperature_mired_to_kelvin(kwargs[ATTR_COLOR_TEMP])
|
|
||||||
)
|
|
||||||
saturation = 0
|
saturation = 0
|
||||||
|
|
||||||
if ATTR_BRIGHTNESS in kwargs:
|
if ATTR_BRIGHTNESS in kwargs:
|
||||||
|
@@ -20,6 +20,7 @@ from homeassistant.components.light import (
|
|||||||
ATTR_BRIGHTNESS,
|
ATTR_BRIGHTNESS,
|
||||||
ATTR_COLOR_MODE,
|
ATTR_COLOR_MODE,
|
||||||
ATTR_COLOR_TEMP,
|
ATTR_COLOR_TEMP,
|
||||||
|
ATTR_COLOR_TEMP_KELVIN,
|
||||||
ATTR_EFFECT,
|
ATTR_EFFECT,
|
||||||
ATTR_HS_COLOR,
|
ATTR_HS_COLOR,
|
||||||
ATTR_RGB_COLOR,
|
ATTR_RGB_COLOR,
|
||||||
@@ -784,9 +785,9 @@ async def test_color_light_with_temp(
|
|||||||
ColorMode.COLOR_TEMP,
|
ColorMode.COLOR_TEMP,
|
||||||
ColorMode.HS,
|
ColorMode.HS,
|
||||||
]
|
]
|
||||||
assert attributes[ATTR_HS_COLOR] == (31.007, 6.862)
|
assert attributes[ATTR_HS_COLOR] == (30.754, 7.122)
|
||||||
assert attributes[ATTR_RGB_COLOR] == (255, 246, 237)
|
assert attributes[ATTR_RGB_COLOR] == (255, 246, 236)
|
||||||
assert attributes[ATTR_XY_COLOR] == (0.339, 0.338)
|
assert attributes[ATTR_XY_COLOR] == (0.34, 0.339)
|
||||||
bulb.color = [65535, 65535, 65535, 65535]
|
bulb.color = [65535, 65535, 65535, 65535]
|
||||||
|
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
@@ -911,7 +912,7 @@ async def test_white_bulb(hass: HomeAssistant) -> None:
|
|||||||
assert attributes[ATTR_SUPPORTED_COLOR_MODES] == [
|
assert attributes[ATTR_SUPPORTED_COLOR_MODES] == [
|
||||||
ColorMode.COLOR_TEMP,
|
ColorMode.COLOR_TEMP,
|
||||||
]
|
]
|
||||||
assert attributes[ATTR_COLOR_TEMP] == 166
|
assert attributes[ATTR_COLOR_TEMP_KELVIN] == 6000
|
||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LIGHT_DOMAIN, "turn_off", {ATTR_ENTITY_ID: entity_id}, blocking=True
|
LIGHT_DOMAIN, "turn_off", {ATTR_ENTITY_ID: entity_id}, blocking=True
|
||||||
)
|
)
|
||||||
@@ -1012,10 +1013,10 @@ async def test_white_light_fails(hass):
|
|||||||
await hass.services.async_call(
|
await hass.services.async_call(
|
||||||
LIGHT_DOMAIN,
|
LIGHT_DOMAIN,
|
||||||
"turn_on",
|
"turn_on",
|
||||||
{ATTR_ENTITY_ID: entity_id, ATTR_COLOR_TEMP: 153},
|
{ATTR_ENTITY_ID: entity_id, ATTR_COLOR_TEMP_KELVIN: 6000},
|
||||||
blocking=True,
|
blocking=True,
|
||||||
)
|
)
|
||||||
assert bulb.set_color.calls[0][0][0] == [1, 0, 3, 6535]
|
assert bulb.set_color.calls[0][0][0] == [1, 0, 3, 6000]
|
||||||
bulb.set_color.reset_mock()
|
bulb.set_color.reset_mock()
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user