mirror of
https://github.com/home-assistant/core.git
synced 2025-07-15 01:07:10 +00:00
Remove legacy color_mode support for legacy mqtt json light (#136996)
This commit is contained in:
parent
64a40a3396
commit
efc515ff4e
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from collections.abc import Callable
|
|
||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
import logging
|
import logging
|
||||||
from typing import TYPE_CHECKING, Any, cast
|
from typing import TYPE_CHECKING, Any, cast
|
||||||
@ -24,7 +23,6 @@ from homeassistant.components.light import (
|
|||||||
ATTR_XY_COLOR,
|
ATTR_XY_COLOR,
|
||||||
DEFAULT_MAX_KELVIN,
|
DEFAULT_MAX_KELVIN,
|
||||||
DEFAULT_MIN_KELVIN,
|
DEFAULT_MIN_KELVIN,
|
||||||
DOMAIN as LIGHT_DOMAIN,
|
|
||||||
ENTITY_ID_FORMAT,
|
ENTITY_ID_FORMAT,
|
||||||
FLASH_LONG,
|
FLASH_LONG,
|
||||||
FLASH_SHORT,
|
FLASH_SHORT,
|
||||||
@ -34,7 +32,6 @@ from homeassistant.components.light import (
|
|||||||
LightEntityFeature,
|
LightEntityFeature,
|
||||||
brightness_supported,
|
brightness_supported,
|
||||||
color_supported,
|
color_supported,
|
||||||
filter_supported_color_modes,
|
|
||||||
valid_supported_color_modes,
|
valid_supported_color_modes,
|
||||||
)
|
)
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
@ -48,15 +45,13 @@ from homeassistant.const import (
|
|||||||
CONF_XY,
|
CONF_XY,
|
||||||
STATE_ON,
|
STATE_ON,
|
||||||
)
|
)
|
||||||
from homeassistant.core import async_get_hass, callback
|
from homeassistant.core import callback
|
||||||
from homeassistant.helpers import config_validation as cv
|
from homeassistant.helpers import config_validation as cv
|
||||||
from homeassistant.helpers.issue_registry import IssueSeverity, async_create_issue
|
|
||||||
from homeassistant.helpers.json import json_dumps
|
from homeassistant.helpers.json import json_dumps
|
||||||
from homeassistant.helpers.restore_state import RestoreEntity
|
from homeassistant.helpers.restore_state import RestoreEntity
|
||||||
from homeassistant.helpers.typing import ConfigType, VolSchemaType
|
from homeassistant.helpers.typing import ConfigType, VolSchemaType
|
||||||
from homeassistant.util import color as color_util
|
from homeassistant.util import color as color_util
|
||||||
from homeassistant.util.json import json_loads_object
|
from homeassistant.util.json import json_loads_object
|
||||||
from homeassistant.util.yaml import dump as yaml_dump
|
|
||||||
|
|
||||||
from .. import subscription
|
from .. import subscription
|
||||||
from ..config import DEFAULT_QOS, DEFAULT_RETAIN, MQTT_RW_SCHEMA
|
from ..config import DEFAULT_QOS, DEFAULT_RETAIN, MQTT_RW_SCHEMA
|
||||||
@ -68,7 +63,6 @@ from ..const import (
|
|||||||
CONF_QOS,
|
CONF_QOS,
|
||||||
CONF_RETAIN,
|
CONF_RETAIN,
|
||||||
CONF_STATE_TOPIC,
|
CONF_STATE_TOPIC,
|
||||||
DOMAIN as MQTT_DOMAIN,
|
|
||||||
)
|
)
|
||||||
from ..entity import MqttEntity
|
from ..entity import MqttEntity
|
||||||
from ..models import ReceiveMessage
|
from ..models import ReceiveMessage
|
||||||
@ -86,15 +80,10 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
DOMAIN = "mqtt_json"
|
DOMAIN = "mqtt_json"
|
||||||
|
|
||||||
DEFAULT_BRIGHTNESS = False
|
DEFAULT_BRIGHTNESS = False
|
||||||
DEFAULT_COLOR_MODE = False
|
|
||||||
DEFAULT_COLOR_TEMP = False
|
|
||||||
DEFAULT_EFFECT = False
|
DEFAULT_EFFECT = False
|
||||||
DEFAULT_FLASH_TIME_LONG = 10
|
DEFAULT_FLASH_TIME_LONG = 10
|
||||||
DEFAULT_FLASH_TIME_SHORT = 2
|
DEFAULT_FLASH_TIME_SHORT = 2
|
||||||
DEFAULT_NAME = "MQTT JSON Light"
|
DEFAULT_NAME = "MQTT JSON Light"
|
||||||
DEFAULT_RGB = False
|
|
||||||
DEFAULT_XY = False
|
|
||||||
DEFAULT_HS = False
|
|
||||||
DEFAULT_BRIGHTNESS_SCALE = 255
|
DEFAULT_BRIGHTNESS_SCALE = 255
|
||||||
DEFAULT_WHITE_SCALE = 255
|
DEFAULT_WHITE_SCALE = 255
|
||||||
|
|
||||||
@ -110,89 +99,6 @@ CONF_MAX_MIREDS = "max_mireds"
|
|||||||
CONF_MIN_MIREDS = "min_mireds"
|
CONF_MIN_MIREDS = "min_mireds"
|
||||||
|
|
||||||
|
|
||||||
def valid_color_configuration(
|
|
||||||
setup_from_yaml: bool,
|
|
||||||
) -> Callable[[dict[str, Any]], dict[str, Any]]:
|
|
||||||
"""Test color_mode is not combined with deprecated config."""
|
|
||||||
|
|
||||||
def _valid_color_configuration(config: ConfigType) -> ConfigType:
|
|
||||||
deprecated = {CONF_COLOR_TEMP, CONF_HS, CONF_RGB, CONF_XY}
|
|
||||||
deprecated_flags_used = any(config.get(key) for key in deprecated)
|
|
||||||
if config.get(CONF_SUPPORTED_COLOR_MODES):
|
|
||||||
if deprecated_flags_used:
|
|
||||||
raise vol.Invalid(
|
|
||||||
"supported_color_modes must not "
|
|
||||||
f"be combined with any of {deprecated}"
|
|
||||||
)
|
|
||||||
elif deprecated_flags_used:
|
|
||||||
deprecated_flags = ", ".join(key for key in deprecated if key in config)
|
|
||||||
_LOGGER.warning(
|
|
||||||
"Deprecated flags [%s] used in MQTT JSON light config "
|
|
||||||
"for handling color mode, please use `supported_color_modes` instead. "
|
|
||||||
"Got: %s. This will stop working in Home Assistant Core 2025.3",
|
|
||||||
deprecated_flags,
|
|
||||||
config,
|
|
||||||
)
|
|
||||||
if not setup_from_yaml:
|
|
||||||
return config
|
|
||||||
issue_id = hex(hash(frozenset(config)))
|
|
||||||
yaml_config_str = yaml_dump(config)
|
|
||||||
learn_more_url = (
|
|
||||||
"https://www.home-assistant.io/integrations/"
|
|
||||||
f"{LIGHT_DOMAIN}.mqtt/#json-schema"
|
|
||||||
)
|
|
||||||
hass = async_get_hass()
|
|
||||||
async_create_issue(
|
|
||||||
hass,
|
|
||||||
MQTT_DOMAIN,
|
|
||||||
issue_id,
|
|
||||||
issue_domain=LIGHT_DOMAIN,
|
|
||||||
is_fixable=False,
|
|
||||||
severity=IssueSeverity.WARNING,
|
|
||||||
learn_more_url=learn_more_url,
|
|
||||||
translation_placeholders={
|
|
||||||
"deprecated_flags": deprecated_flags,
|
|
||||||
"config": yaml_config_str,
|
|
||||||
},
|
|
||||||
translation_key="deprecated_color_handling",
|
|
||||||
)
|
|
||||||
|
|
||||||
if CONF_COLOR_MODE in config:
|
|
||||||
_LOGGER.warning(
|
|
||||||
"Deprecated flag `color_mode` used in MQTT JSON light config "
|
|
||||||
", the `color_mode` flag is not used anymore and should be removed. "
|
|
||||||
"Got: %s. This will stop working in Home Assistant Core 2025.3",
|
|
||||||
config,
|
|
||||||
)
|
|
||||||
if not setup_from_yaml:
|
|
||||||
return config
|
|
||||||
issue_id = hex(hash(frozenset(config)))
|
|
||||||
yaml_config_str = yaml_dump(config)
|
|
||||||
learn_more_url = (
|
|
||||||
"https://www.home-assistant.io/integrations/"
|
|
||||||
f"{LIGHT_DOMAIN}.mqtt/#json-schema"
|
|
||||||
)
|
|
||||||
hass = async_get_hass()
|
|
||||||
async_create_issue(
|
|
||||||
hass,
|
|
||||||
MQTT_DOMAIN,
|
|
||||||
issue_id,
|
|
||||||
breaks_in_ha_version="2025.3.0",
|
|
||||||
issue_domain=LIGHT_DOMAIN,
|
|
||||||
is_fixable=False,
|
|
||||||
severity=IssueSeverity.WARNING,
|
|
||||||
learn_more_url=learn_more_url,
|
|
||||||
translation_placeholders={
|
|
||||||
"config": yaml_config_str,
|
|
||||||
},
|
|
||||||
translation_key="deprecated_color_mode_flag",
|
|
||||||
)
|
|
||||||
|
|
||||||
return config
|
|
||||||
|
|
||||||
return _valid_color_configuration
|
|
||||||
|
|
||||||
|
|
||||||
_PLATFORM_SCHEMA_BASE = (
|
_PLATFORM_SCHEMA_BASE = (
|
||||||
MQTT_RW_SCHEMA.extend(
|
MQTT_RW_SCHEMA.extend(
|
||||||
{
|
{
|
||||||
@ -200,12 +106,6 @@ _PLATFORM_SCHEMA_BASE = (
|
|||||||
vol.Optional(
|
vol.Optional(
|
||||||
CONF_BRIGHTNESS_SCALE, default=DEFAULT_BRIGHTNESS_SCALE
|
CONF_BRIGHTNESS_SCALE, default=DEFAULT_BRIGHTNESS_SCALE
|
||||||
): vol.All(vol.Coerce(int), vol.Range(min=1)),
|
): vol.All(vol.Coerce(int), vol.Range(min=1)),
|
||||||
# CONF_COLOR_MODE was deprecated with HA Core 2024.4 and will be
|
|
||||||
# removed with HA Core 2025.3
|
|
||||||
vol.Optional(CONF_COLOR_MODE): cv.boolean,
|
|
||||||
# CONF_COLOR_TEMP was deprecated with HA Core 2024.4 and will be
|
|
||||||
# removed with HA Core 2025.3
|
|
||||||
vol.Optional(CONF_COLOR_TEMP, default=DEFAULT_COLOR_TEMP): cv.boolean,
|
|
||||||
vol.Optional(CONF_COLOR_TEMP_KELVIN, default=False): cv.boolean,
|
vol.Optional(CONF_COLOR_TEMP_KELVIN, default=False): cv.boolean,
|
||||||
vol.Optional(CONF_EFFECT, default=DEFAULT_EFFECT): cv.boolean,
|
vol.Optional(CONF_EFFECT, default=DEFAULT_EFFECT): cv.boolean,
|
||||||
vol.Optional(CONF_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]),
|
vol.Optional(CONF_EFFECT_LIST): vol.All(cv.ensure_list, [cv.string]),
|
||||||
@ -215,9 +115,6 @@ _PLATFORM_SCHEMA_BASE = (
|
|||||||
vol.Optional(
|
vol.Optional(
|
||||||
CONF_FLASH_TIME_SHORT, default=DEFAULT_FLASH_TIME_SHORT
|
CONF_FLASH_TIME_SHORT, default=DEFAULT_FLASH_TIME_SHORT
|
||||||
): cv.positive_int,
|
): cv.positive_int,
|
||||||
# CONF_HS was deprecated with HA Core 2024.4 and will be
|
|
||||||
# removed with HA Core 2025.3
|
|
||||||
vol.Optional(CONF_HS, default=DEFAULT_HS): cv.boolean,
|
|
||||||
vol.Optional(CONF_MAX_MIREDS): cv.positive_int,
|
vol.Optional(CONF_MAX_MIREDS): cv.positive_int,
|
||||||
vol.Optional(CONF_MIN_MIREDS): cv.positive_int,
|
vol.Optional(CONF_MIN_MIREDS): cv.positive_int,
|
||||||
vol.Optional(CONF_MAX_KELVIN): cv.positive_int,
|
vol.Optional(CONF_MAX_KELVIN): cv.positive_int,
|
||||||
@ -227,9 +124,6 @@ _PLATFORM_SCHEMA_BASE = (
|
|||||||
vol.Coerce(int), vol.In([0, 1, 2])
|
vol.Coerce(int), vol.In([0, 1, 2])
|
||||||
),
|
),
|
||||||
vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean,
|
vol.Optional(CONF_RETAIN, default=DEFAULT_RETAIN): cv.boolean,
|
||||||
# CONF_RGB was deprecated with HA Core 2024.4 and will be
|
|
||||||
# removed with HA Core 2025.3
|
|
||||||
vol.Optional(CONF_RGB, default=DEFAULT_RGB): cv.boolean,
|
|
||||||
vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic,
|
vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic,
|
||||||
vol.Optional(CONF_SUPPORTED_COLOR_MODES): vol.All(
|
vol.Optional(CONF_SUPPORTED_COLOR_MODES): vol.All(
|
||||||
cv.ensure_list,
|
cv.ensure_list,
|
||||||
@ -240,22 +134,29 @@ _PLATFORM_SCHEMA_BASE = (
|
|||||||
vol.Optional(CONF_WHITE_SCALE, default=DEFAULT_WHITE_SCALE): vol.All(
|
vol.Optional(CONF_WHITE_SCALE, default=DEFAULT_WHITE_SCALE): vol.All(
|
||||||
vol.Coerce(int), vol.Range(min=1)
|
vol.Coerce(int), vol.Range(min=1)
|
||||||
),
|
),
|
||||||
# CONF_XY was deprecated with HA Core 2024.4 and will be
|
|
||||||
# removed with HA Core 2025.3
|
|
||||||
vol.Optional(CONF_XY, default=DEFAULT_XY): cv.boolean,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
.extend(MQTT_ENTITY_COMMON_SCHEMA.schema)
|
.extend(MQTT_ENTITY_COMMON_SCHEMA.schema)
|
||||||
.extend(MQTT_LIGHT_SCHEMA_SCHEMA.schema)
|
.extend(MQTT_LIGHT_SCHEMA_SCHEMA.schema)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Support for legacy color_mode handling was removed with HA Core 2025.3
|
||||||
|
# The removed attributes can be removed from the schema's from HA Core 2026.3
|
||||||
DISCOVERY_SCHEMA_JSON = vol.All(
|
DISCOVERY_SCHEMA_JSON = vol.All(
|
||||||
valid_color_configuration(False),
|
cv.removed(CONF_COLOR_MODE, raise_if_present=False),
|
||||||
|
cv.removed(CONF_COLOR_TEMP, raise_if_present=False),
|
||||||
|
cv.removed(CONF_HS, raise_if_present=False),
|
||||||
|
cv.removed(CONF_RGB, raise_if_present=False),
|
||||||
|
cv.removed(CONF_XY, raise_if_present=False),
|
||||||
_PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA),
|
_PLATFORM_SCHEMA_BASE.extend({}, extra=vol.REMOVE_EXTRA),
|
||||||
)
|
)
|
||||||
|
|
||||||
PLATFORM_SCHEMA_MODERN_JSON = vol.All(
|
PLATFORM_SCHEMA_MODERN_JSON = vol.All(
|
||||||
valid_color_configuration(True),
|
cv.removed(CONF_COLOR_MODE),
|
||||||
|
cv.removed(CONF_COLOR_TEMP),
|
||||||
|
cv.removed(CONF_HS),
|
||||||
|
cv.removed(CONF_RGB),
|
||||||
|
cv.removed(CONF_XY),
|
||||||
_PLATFORM_SCHEMA_BASE,
|
_PLATFORM_SCHEMA_BASE,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -272,8 +173,6 @@ class MqttLightJson(MqttEntity, LightEntity, RestoreEntity):
|
|||||||
_topic: dict[str, str | None]
|
_topic: dict[str, str | None]
|
||||||
_optimistic: bool
|
_optimistic: bool
|
||||||
|
|
||||||
_deprecated_color_handling: bool = False
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def config_schema() -> VolSchemaType:
|
def config_schema() -> VolSchemaType:
|
||||||
"""Return the config schema."""
|
"""Return the config schema."""
|
||||||
@ -318,122 +217,65 @@ class MqttLightJson(MqttEntity, LightEntity, RestoreEntity):
|
|||||||
self._attr_color_mode = next(iter(self.supported_color_modes))
|
self._attr_color_mode = next(iter(self.supported_color_modes))
|
||||||
else:
|
else:
|
||||||
self._attr_color_mode = ColorMode.UNKNOWN
|
self._attr_color_mode = ColorMode.UNKNOWN
|
||||||
else:
|
|
||||||
self._deprecated_color_handling = True
|
|
||||||
color_modes = {ColorMode.ONOFF}
|
|
||||||
if config[CONF_BRIGHTNESS]:
|
|
||||||
color_modes.add(ColorMode.BRIGHTNESS)
|
|
||||||
if config[CONF_COLOR_TEMP]:
|
|
||||||
color_modes.add(ColorMode.COLOR_TEMP)
|
|
||||||
if config[CONF_HS] or config[CONF_RGB] or config[CONF_XY]:
|
|
||||||
color_modes.add(ColorMode.HS)
|
|
||||||
self._attr_supported_color_modes = filter_supported_color_modes(color_modes)
|
|
||||||
if self.supported_color_modes and len(self.supported_color_modes) == 1:
|
|
||||||
self._fixed_color_mode = next(iter(self.supported_color_modes))
|
|
||||||
|
|
||||||
def _update_color(self, values: dict[str, Any]) -> None:
|
def _update_color(self, values: dict[str, Any]) -> None:
|
||||||
if self._deprecated_color_handling:
|
color_mode: str = values["color_mode"]
|
||||||
# Deprecated color handling
|
if not self._supports_color_mode(color_mode):
|
||||||
try:
|
_LOGGER.warning(
|
||||||
red = int(values["color"]["r"])
|
"Invalid color mode '%s' received for entity %s",
|
||||||
green = int(values["color"]["g"])
|
color_mode,
|
||||||
blue = int(values["color"]["b"])
|
self.entity_id,
|
||||||
self._attr_hs_color = color_util.color_RGB_to_hs(red, green, blue)
|
)
|
||||||
except KeyError:
|
return
|
||||||
pass
|
try:
|
||||||
except ValueError:
|
if color_mode == ColorMode.COLOR_TEMP:
|
||||||
_LOGGER.warning(
|
self._attr_color_temp_kelvin = (
|
||||||
"Invalid RGB color value '%s' received for entity %s",
|
values["color_temp"]
|
||||||
values,
|
if self._color_temp_kelvin
|
||||||
self.entity_id,
|
else color_util.color_temperature_mired_to_kelvin(
|
||||||
|
values["color_temp"]
|
||||||
|
)
|
||||||
)
|
)
|
||||||
return
|
self._attr_color_mode = ColorMode.COLOR_TEMP
|
||||||
|
elif color_mode == ColorMode.HS:
|
||||||
try:
|
|
||||||
x_color = float(values["color"]["x"])
|
|
||||||
y_color = float(values["color"]["y"])
|
|
||||||
self._attr_hs_color = color_util.color_xy_to_hs(x_color, y_color)
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
except ValueError:
|
|
||||||
_LOGGER.warning(
|
|
||||||
"Invalid XY color value '%s' received for entity %s",
|
|
||||||
values,
|
|
||||||
self.entity_id,
|
|
||||||
)
|
|
||||||
return
|
|
||||||
|
|
||||||
try:
|
|
||||||
hue = float(values["color"]["h"])
|
hue = float(values["color"]["h"])
|
||||||
saturation = float(values["color"]["s"])
|
saturation = float(values["color"]["s"])
|
||||||
|
self._attr_color_mode = ColorMode.HS
|
||||||
self._attr_hs_color = (hue, saturation)
|
self._attr_hs_color = (hue, saturation)
|
||||||
except KeyError:
|
elif color_mode == ColorMode.RGB:
|
||||||
pass
|
r = int(values["color"]["r"])
|
||||||
except ValueError:
|
g = int(values["color"]["g"])
|
||||||
_LOGGER.warning(
|
b = int(values["color"]["b"])
|
||||||
"Invalid HS color value '%s' received for entity %s",
|
self._attr_color_mode = ColorMode.RGB
|
||||||
values,
|
self._attr_rgb_color = (r, g, b)
|
||||||
self.entity_id,
|
elif color_mode == ColorMode.RGBW:
|
||||||
)
|
r = int(values["color"]["r"])
|
||||||
return
|
g = int(values["color"]["g"])
|
||||||
else:
|
b = int(values["color"]["b"])
|
||||||
color_mode: str = values["color_mode"]
|
w = int(values["color"]["w"])
|
||||||
if not self._supports_color_mode(color_mode):
|
self._attr_color_mode = ColorMode.RGBW
|
||||||
_LOGGER.warning(
|
self._attr_rgbw_color = (r, g, b, w)
|
||||||
"Invalid color mode '%s' received for entity %s",
|
elif color_mode == ColorMode.RGBWW:
|
||||||
color_mode,
|
r = int(values["color"]["r"])
|
||||||
self.entity_id,
|
g = int(values["color"]["g"])
|
||||||
)
|
b = int(values["color"]["b"])
|
||||||
return
|
c = int(values["color"]["c"])
|
||||||
try:
|
w = int(values["color"]["w"])
|
||||||
if color_mode == ColorMode.COLOR_TEMP:
|
self._attr_color_mode = ColorMode.RGBWW
|
||||||
self._attr_color_temp_kelvin = (
|
self._attr_rgbww_color = (r, g, b, c, w)
|
||||||
values["color_temp"]
|
elif color_mode == ColorMode.WHITE:
|
||||||
if self._color_temp_kelvin
|
self._attr_color_mode = ColorMode.WHITE
|
||||||
else color_util.color_temperature_mired_to_kelvin(
|
elif color_mode == ColorMode.XY:
|
||||||
values["color_temp"]
|
x = float(values["color"]["x"])
|
||||||
)
|
y = float(values["color"]["y"])
|
||||||
)
|
self._attr_color_mode = ColorMode.XY
|
||||||
self._attr_color_mode = ColorMode.COLOR_TEMP
|
self._attr_xy_color = (x, y)
|
||||||
elif color_mode == ColorMode.HS:
|
except (KeyError, TypeError, ValueError):
|
||||||
hue = float(values["color"]["h"])
|
_LOGGER.warning(
|
||||||
saturation = float(values["color"]["s"])
|
"Invalid or incomplete color value '%s' received for entity %s",
|
||||||
self._attr_color_mode = ColorMode.HS
|
values,
|
||||||
self._attr_hs_color = (hue, saturation)
|
self.entity_id,
|
||||||
elif color_mode == ColorMode.RGB:
|
)
|
||||||
r = int(values["color"]["r"])
|
|
||||||
g = int(values["color"]["g"])
|
|
||||||
b = int(values["color"]["b"])
|
|
||||||
self._attr_color_mode = ColorMode.RGB
|
|
||||||
self._attr_rgb_color = (r, g, b)
|
|
||||||
elif color_mode == ColorMode.RGBW:
|
|
||||||
r = int(values["color"]["r"])
|
|
||||||
g = int(values["color"]["g"])
|
|
||||||
b = int(values["color"]["b"])
|
|
||||||
w = int(values["color"]["w"])
|
|
||||||
self._attr_color_mode = ColorMode.RGBW
|
|
||||||
self._attr_rgbw_color = (r, g, b, w)
|
|
||||||
elif color_mode == ColorMode.RGBWW:
|
|
||||||
r = int(values["color"]["r"])
|
|
||||||
g = int(values["color"]["g"])
|
|
||||||
b = int(values["color"]["b"])
|
|
||||||
c = int(values["color"]["c"])
|
|
||||||
w = int(values["color"]["w"])
|
|
||||||
self._attr_color_mode = ColorMode.RGBWW
|
|
||||||
self._attr_rgbww_color = (r, g, b, c, w)
|
|
||||||
elif color_mode == ColorMode.WHITE:
|
|
||||||
self._attr_color_mode = ColorMode.WHITE
|
|
||||||
elif color_mode == ColorMode.XY:
|
|
||||||
x = float(values["color"]["x"])
|
|
||||||
y = float(values["color"]["y"])
|
|
||||||
self._attr_color_mode = ColorMode.XY
|
|
||||||
self._attr_xy_color = (x, y)
|
|
||||||
except (KeyError, ValueError):
|
|
||||||
_LOGGER.warning(
|
|
||||||
"Invalid or incomplete color value '%s' received for entity %s",
|
|
||||||
values,
|
|
||||||
self.entity_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def _state_received(self, msg: ReceiveMessage) -> None:
|
def _state_received(self, msg: ReceiveMessage) -> None:
|
||||||
@ -447,18 +289,7 @@ class MqttLightJson(MqttEntity, LightEntity, RestoreEntity):
|
|||||||
elif values["state"] is None:
|
elif values["state"] is None:
|
||||||
self._attr_is_on = None
|
self._attr_is_on = None
|
||||||
|
|
||||||
if (
|
if color_supported(self.supported_color_modes) and "color_mode" in values:
|
||||||
self._deprecated_color_handling
|
|
||||||
and color_supported(self.supported_color_modes)
|
|
||||||
and "color" in values
|
|
||||||
):
|
|
||||||
# Deprecated color handling
|
|
||||||
if values["color"] is None:
|
|
||||||
self._attr_hs_color = None
|
|
||||||
else:
|
|
||||||
self._update_color(values)
|
|
||||||
|
|
||||||
if not self._deprecated_color_handling and "color_mode" in values:
|
|
||||||
self._update_color(values)
|
self._update_color(values)
|
||||||
|
|
||||||
if brightness_supported(self.supported_color_modes):
|
if brightness_supported(self.supported_color_modes):
|
||||||
@ -484,35 +315,6 @@ class MqttLightJson(MqttEntity, LightEntity, RestoreEntity):
|
|||||||
self.entity_id,
|
self.entity_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
if (
|
|
||||||
self._deprecated_color_handling
|
|
||||||
and self.supported_color_modes
|
|
||||||
and ColorMode.COLOR_TEMP in self.supported_color_modes
|
|
||||||
):
|
|
||||||
# Deprecated color handling
|
|
||||||
try:
|
|
||||||
if values["color_temp"] is None:
|
|
||||||
self._attr_color_temp_kelvin = None
|
|
||||||
else:
|
|
||||||
self._attr_color_temp_kelvin = (
|
|
||||||
values["color_temp"] # type: ignore[assignment]
|
|
||||||
if self._color_temp_kelvin
|
|
||||||
else color_util.color_temperature_mired_to_kelvin(
|
|
||||||
values["color_temp"] # type: ignore[arg-type]
|
|
||||||
)
|
|
||||||
)
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
except (TypeError, ValueError):
|
|
||||||
_LOGGER.warning(
|
|
||||||
"Invalid color temp value '%s' received for entity %s",
|
|
||||||
values["color_temp"],
|
|
||||||
self.entity_id,
|
|
||||||
)
|
|
||||||
# Allow to switch back to color_temp
|
|
||||||
if "color" not in values:
|
|
||||||
self._attr_hs_color = None
|
|
||||||
|
|
||||||
if self.supported_features and LightEntityFeature.EFFECT:
|
if self.supported_features and LightEntityFeature.EFFECT:
|
||||||
with suppress(KeyError):
|
with suppress(KeyError):
|
||||||
self._attr_effect = cast(str, values["effect"])
|
self._attr_effect = cast(str, values["effect"])
|
||||||
@ -565,19 +367,6 @@ class MqttLightJson(MqttEntity, LightEntity, RestoreEntity):
|
|||||||
)
|
)
|
||||||
self._attr_xy_color = last_attributes.get(ATTR_XY_COLOR, self.xy_color)
|
self._attr_xy_color = last_attributes.get(ATTR_XY_COLOR, self.xy_color)
|
||||||
|
|
||||||
@property
|
|
||||||
def color_mode(self) -> ColorMode | str | None:
|
|
||||||
"""Return current color mode."""
|
|
||||||
if not self._deprecated_color_handling:
|
|
||||||
return self._attr_color_mode
|
|
||||||
if self._fixed_color_mode:
|
|
||||||
# Legacy light with support for a single color mode
|
|
||||||
return self._fixed_color_mode
|
|
||||||
# Legacy light with support for ct + hs, prioritize hs
|
|
||||||
if self.hs_color is not None:
|
|
||||||
return ColorMode.HS
|
|
||||||
return ColorMode.COLOR_TEMP
|
|
||||||
|
|
||||||
def _set_flash_and_transition(self, message: dict[str, Any], **kwargs: Any) -> None:
|
def _set_flash_and_transition(self, message: dict[str, Any], **kwargs: Any) -> None:
|
||||||
if ATTR_TRANSITION in kwargs:
|
if ATTR_TRANSITION in kwargs:
|
||||||
message["transition"] = kwargs[ATTR_TRANSITION]
|
message["transition"] = kwargs[ATTR_TRANSITION]
|
||||||
@ -604,17 +393,15 @@ class MqttLightJson(MqttEntity, LightEntity, RestoreEntity):
|
|||||||
def _supports_color_mode(self, color_mode: ColorMode | str) -> bool:
|
def _supports_color_mode(self, color_mode: ColorMode | str) -> bool:
|
||||||
"""Return True if the light natively supports a color mode."""
|
"""Return True if the light natively supports a color mode."""
|
||||||
return (
|
return (
|
||||||
not self._deprecated_color_handling
|
self.supported_color_modes is not None
|
||||||
and self.supported_color_modes is not None
|
|
||||||
and color_mode in self.supported_color_modes
|
and color_mode in self.supported_color_modes
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_turn_on(self, **kwargs: Any) -> None: # noqa: C901
|
async def async_turn_on(self, **kwargs: Any) -> None:
|
||||||
"""Turn the device on.
|
"""Turn the device on.
|
||||||
|
|
||||||
This method is a coroutine.
|
This method is a coroutine.
|
||||||
"""
|
"""
|
||||||
brightness: int
|
|
||||||
should_update = False
|
should_update = False
|
||||||
hs_color: tuple[float, float]
|
hs_color: tuple[float, float]
|
||||||
message: dict[str, Any] = {"state": "ON"}
|
message: dict[str, Any] = {"state": "ON"}
|
||||||
@ -623,39 +410,6 @@ class MqttLightJson(MqttEntity, LightEntity, RestoreEntity):
|
|||||||
rgbcw: tuple[int, ...]
|
rgbcw: tuple[int, ...]
|
||||||
xy_color: tuple[float, float]
|
xy_color: tuple[float, float]
|
||||||
|
|
||||||
if ATTR_HS_COLOR in kwargs and (
|
|
||||||
self._config[CONF_HS] or self._config[CONF_RGB] or self._config[CONF_XY]
|
|
||||||
):
|
|
||||||
# Legacy color handling
|
|
||||||
hs_color = kwargs[ATTR_HS_COLOR]
|
|
||||||
message["color"] = {}
|
|
||||||
if self._config[CONF_RGB]:
|
|
||||||
# If brightness is supported, we don't want to scale the
|
|
||||||
# RGB values given using the brightness.
|
|
||||||
if self._config[CONF_BRIGHTNESS]:
|
|
||||||
brightness = 255
|
|
||||||
else:
|
|
||||||
# We pop the brightness, to omit it from the payload
|
|
||||||
brightness = kwargs.pop(ATTR_BRIGHTNESS, 255)
|
|
||||||
rgb = color_util.color_hsv_to_RGB(
|
|
||||||
hs_color[0], hs_color[1], brightness / 255 * 100
|
|
||||||
)
|
|
||||||
message["color"]["r"] = rgb[0]
|
|
||||||
message["color"]["g"] = rgb[1]
|
|
||||||
message["color"]["b"] = rgb[2]
|
|
||||||
if self._config[CONF_XY]:
|
|
||||||
xy_color = color_util.color_hs_to_xy(*kwargs[ATTR_HS_COLOR])
|
|
||||||
message["color"]["x"] = xy_color[0]
|
|
||||||
message["color"]["y"] = xy_color[1]
|
|
||||||
if self._config[CONF_HS]:
|
|
||||||
message["color"]["h"] = hs_color[0]
|
|
||||||
message["color"]["s"] = hs_color[1]
|
|
||||||
|
|
||||||
if self._optimistic:
|
|
||||||
self._attr_color_temp_kelvin = None
|
|
||||||
self._attr_hs_color = kwargs[ATTR_HS_COLOR]
|
|
||||||
should_update = True
|
|
||||||
|
|
||||||
if ATTR_HS_COLOR in kwargs and self._supports_color_mode(ColorMode.HS):
|
if ATTR_HS_COLOR in kwargs and self._supports_color_mode(ColorMode.HS):
|
||||||
hs_color = kwargs[ATTR_HS_COLOR]
|
hs_color = kwargs[ATTR_HS_COLOR]
|
||||||
message["color"] = {"h": hs_color[0], "s": hs_color[1]}
|
message["color"] = {"h": hs_color[0], "s": hs_color[1]}
|
||||||
|
@ -1,13 +1,5 @@
|
|||||||
{
|
{
|
||||||
"issues": {
|
"issues": {
|
||||||
"deprecated_color_handling": {
|
|
||||||
"title": "Deprecated color handling used for MQTT light",
|
|
||||||
"description": "An MQTT light config (with `json` schema) found in `configuration.yaml` uses deprecated color handling flags.\n\nConfiguration found:\n```yaml\n{config}\n```\nDeprecated flags: **{deprecated_flags}**.\n\nUse the `supported_color_modes` option instead and [reload](/developer-tools/yaml) the manually configured MQTT items or restart Home Assistant to fix this issue."
|
|
||||||
},
|
|
||||||
"deprecated_color_mode_flag": {
|
|
||||||
"title": "Deprecated color_mode option flag used for MQTT light",
|
|
||||||
"description": "An MQTT light config (with `json` schema) found in `configuration.yaml` uses a deprecated `color_mode` flag.\n\nConfiguration found:\n```yaml\n{config}\n```\n\nRemove the option from your config and [reload](/developer-tools/yaml) the manually configured MQTT items or restart Home Assistant to fix this issue."
|
|
||||||
},
|
|
||||||
"invalid_platform_config": {
|
"invalid_platform_config": {
|
||||||
"title": "Invalid config found for mqtt {domain} item",
|
"title": "Invalid config found for mqtt {domain} item",
|
||||||
"description": "Home Assistant detected an invalid config for a manually configured item.\n\nPlatform domain: **{domain}**\nConfiguration file: **{config_file}**\nNear line: **{line}**\nConfiguration found:\n```yaml\n{config}\n```\nError: **{error}**.\n\nMake sure the configuration is valid and [reload](/developer-tools/yaml) the manually configured MQTT items or restart Home Assistant to fix this issue."
|
"description": "Home Assistant detected an invalid config for a manually configured item.\n\nPlatform domain: **{domain}**\nConfiguration file: **{config_file}**\nNear line: **{line}**\nConfiguration found:\n```yaml\n{config}\n```\nError: **{error}**.\n\nMake sure the configuration is valid and [reload](/developer-tools/yaml) the manually configured MQTT items or restart Home Assistant to fix this issue."
|
||||||
|
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user