mirror of
https://github.com/home-assistant/core.git
synced 2025-04-23 16:57:53 +00:00
Use supported_color_modes in emulated_hue (#49175)
This commit is contained in:
parent
1016d4ea28
commit
a9065f381d
@ -45,9 +45,6 @@ from homeassistant.components.light import (
|
||||
ATTR_HS_COLOR,
|
||||
ATTR_TRANSITION,
|
||||
ATTR_XY_COLOR,
|
||||
SUPPORT_BRIGHTNESS,
|
||||
SUPPORT_COLOR,
|
||||
SUPPORT_COLOR_TEMP,
|
||||
SUPPORT_TRANSITION,
|
||||
)
|
||||
from homeassistant.components.media_player.const import (
|
||||
@ -356,6 +353,8 @@ class HueOneLightChangeView(HomeAssistantView):
|
||||
|
||||
# Get the entity's supported features
|
||||
entity_features = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
|
||||
if entity.domain == light.DOMAIN:
|
||||
color_modes = entity.attributes.get(light.ATTR_SUPPORTED_COLOR_MODES, [])
|
||||
|
||||
# Parse the request
|
||||
parsed = {
|
||||
@ -401,7 +400,7 @@ class HueOneLightChangeView(HomeAssistantView):
|
||||
|
||||
if HUE_API_STATE_BRI in request_json:
|
||||
if entity.domain == light.DOMAIN:
|
||||
if entity_features & SUPPORT_BRIGHTNESS:
|
||||
if light.brightness_supported(color_modes):
|
||||
parsed[STATE_ON] = parsed[STATE_BRIGHTNESS] > 0
|
||||
else:
|
||||
parsed[STATE_BRIGHTNESS] = None
|
||||
@ -440,14 +439,14 @@ class HueOneLightChangeView(HomeAssistantView):
|
||||
if entity.domain == light.DOMAIN:
|
||||
if parsed[STATE_ON]:
|
||||
if (
|
||||
entity_features & SUPPORT_BRIGHTNESS
|
||||
light.brightness_supported(color_modes)
|
||||
and parsed[STATE_BRIGHTNESS] is not None
|
||||
):
|
||||
data[ATTR_BRIGHTNESS] = hue_brightness_to_hass(
|
||||
parsed[STATE_BRIGHTNESS]
|
||||
)
|
||||
|
||||
if entity_features & SUPPORT_COLOR:
|
||||
if light.color_supported(color_modes):
|
||||
if any((parsed[STATE_HUE], parsed[STATE_SATURATION])):
|
||||
if parsed[STATE_HUE] is not None:
|
||||
hue = parsed[STATE_HUE]
|
||||
@ -469,7 +468,7 @@ class HueOneLightChangeView(HomeAssistantView):
|
||||
data[ATTR_XY_COLOR] = parsed[STATE_XY]
|
||||
|
||||
if (
|
||||
entity_features & SUPPORT_COLOR_TEMP
|
||||
light.color_temp_supported(color_modes)
|
||||
and parsed[STATE_COLOR_TEMP] is not None
|
||||
):
|
||||
data[ATTR_COLOR_TEMP] = parsed[STATE_COLOR_TEMP]
|
||||
@ -671,13 +670,7 @@ def get_entity_state(config, entity):
|
||||
data[STATE_SATURATION] = 0
|
||||
data[STATE_COLOR_TEMP] = 0
|
||||
|
||||
# Get the entity's supported features
|
||||
entity_features = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
|
||||
|
||||
if entity.domain == light.DOMAIN:
|
||||
if entity_features & SUPPORT_BRIGHTNESS:
|
||||
pass
|
||||
elif entity.domain == climate.DOMAIN:
|
||||
if entity.domain == climate.DOMAIN:
|
||||
temperature = entity.attributes.get(ATTR_TEMPERATURE, 0)
|
||||
# Convert 0-100 to 0-254
|
||||
data[STATE_BRIGHTNESS] = round(temperature * HUE_API_STATE_BRI_MAX / 100)
|
||||
@ -736,6 +729,7 @@ def get_entity_state(config, entity):
|
||||
def entity_to_json(config, entity):
|
||||
"""Convert an entity to its Hue bridge JSON representation."""
|
||||
entity_features = entity.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
|
||||
color_modes = entity.attributes.get(light.ATTR_SUPPORTED_COLOR_MODES, [])
|
||||
unique_id = hashlib.md5(entity.entity_id.encode()).hexdigest()
|
||||
unique_id = f"00:{unique_id[0:2]}:{unique_id[2:4]}:{unique_id[4:6]}:{unique_id[6:8]}:{unique_id[8:10]}:{unique_id[10:12]}:{unique_id[12:14]}-{unique_id[14:16]}"
|
||||
|
||||
@ -753,11 +747,7 @@ def entity_to_json(config, entity):
|
||||
"swversion": "123",
|
||||
}
|
||||
|
||||
if (
|
||||
(entity_features & SUPPORT_BRIGHTNESS)
|
||||
and (entity_features & SUPPORT_COLOR)
|
||||
and (entity_features & SUPPORT_COLOR_TEMP)
|
||||
):
|
||||
if light.color_supported(color_modes) and light.color_temp_supported(color_modes):
|
||||
# Extended Color light (Zigbee Device ID: 0x0210)
|
||||
# Same as Color light, but which supports additional setting of color temperature
|
||||
retval["type"] = "Extended color light"
|
||||
@ -775,7 +765,7 @@ def entity_to_json(config, entity):
|
||||
retval["state"][HUE_API_STATE_COLORMODE] = "hs"
|
||||
else:
|
||||
retval["state"][HUE_API_STATE_COLORMODE] = "ct"
|
||||
elif (entity_features & SUPPORT_BRIGHTNESS) and (entity_features & SUPPORT_COLOR):
|
||||
elif light.color_supported(color_modes):
|
||||
# Color light (Zigbee Device ID: 0x0200)
|
||||
# Supports on/off, dimming and color control (hue/saturation, enhanced hue, color loop and XY)
|
||||
retval["type"] = "Color light"
|
||||
@ -789,9 +779,7 @@ def entity_to_json(config, entity):
|
||||
HUE_API_STATE_EFFECT: "none",
|
||||
}
|
||||
)
|
||||
elif (entity_features & SUPPORT_BRIGHTNESS) and (
|
||||
entity_features & SUPPORT_COLOR_TEMP
|
||||
):
|
||||
elif light.color_temp_supported(color_modes):
|
||||
# Color temperature light (Zigbee Device ID: 0x0220)
|
||||
# Supports groups, scenes, on/off, dimming, and setting of a color temperature
|
||||
retval["type"] = "Color temperature light"
|
||||
@ -804,12 +792,11 @@ def entity_to_json(config, entity):
|
||||
}
|
||||
)
|
||||
elif entity_features & (
|
||||
SUPPORT_BRIGHTNESS
|
||||
| SUPPORT_SET_POSITION
|
||||
SUPPORT_SET_POSITION
|
||||
| SUPPORT_SET_SPEED
|
||||
| SUPPORT_VOLUME_SET
|
||||
| SUPPORT_TARGET_TEMPERATURE
|
||||
):
|
||||
) or light.brightness_supported(color_modes):
|
||||
# Dimmable light (Zigbee Device ID: 0x0100)
|
||||
# Supports groups, scenes, on/off and dimming
|
||||
retval["type"] = "Dimmable light"
|
||||
|
@ -742,9 +742,10 @@ async def test_put_light_state(hass, hass_hue, hue_client):
|
||||
)
|
||||
|
||||
# mock light.turn_on call
|
||||
hass.states.async_set(
|
||||
"light.ceiling_lights", STATE_ON, {ATTR_SUPPORTED_FEATURES: 55}
|
||||
)
|
||||
attributes = hass.states.get("light.ceiling_lights").attributes
|
||||
supported_features = attributes[ATTR_SUPPORTED_FEATURES] | light.SUPPORT_TRANSITION
|
||||
attributes = {**attributes, ATTR_SUPPORTED_FEATURES: supported_features}
|
||||
hass.states.async_set("light.ceiling_lights", STATE_ON, attributes)
|
||||
call_turn_on = async_mock_service(hass, "light", "turn_on")
|
||||
|
||||
# update light state through api
|
||||
|
Loading…
x
Reference in New Issue
Block a user