灯光实体
灯光实体控制光源的亮度、色调和饱和度颜色值、白色值、色温和效果。从 homeassistant.components.light.LightEntity 派生平台实体。
属性
| 名称 | 类型 | 默认 | 描述 |
|---|---|---|---|
| brightness | int | None | None | 此灯光的亮度,范围在 1..255 之间 |
| color_mode | ColorMode | None | None | 灯光的颜色模式。返回的颜色模式必须存在于 supported_color_modes 属性中,除非灯光正在渲染效果。 |
| color_temp_kelvin | int | None | None | CT 颜色值,以开尔文为单位。此属性将会在灯光的颜色模式设置为 ColorMode.COLOR_TEMP 时复制到灯光的状态属性中,否则将被忽略。 |
| effect | str | None | None | 当前效果。如果灯光支持效果且当前没有渲染效果,则应为 EFFECT_OFF。 |
| effect_list | list[str] | None | None | 支持的效果列表。 |
| hs_color | tuple[float, float] | None | None | 色调和饱和度颜色值 (float, float)。此属性将在灯光的颜色模式设置为 ColorMode.HS 时复制到灯光的状态属性中,否则将被忽略。 |
| is_on | bool | None | None | 灯光实体是否打开。 |
| max_color_temp_kelvin | int | None | None | 此灯光支持的最低色温(开尔文)。 |
| min_color_temp_kelvin | int | None | None | 此灯光支持的最高色温(开尔文)。 |
| rgb_color | tuple[int, int, int] | None | None | RGB 颜色值 (int, int, int)。此属性将在灯光的颜色模式设置为 ColorMode.RGB 时复制到灯光的状态属性中,否则将被忽略。 |
| rgbw_color | tuple[int, int, int, int] | None | None | RGBW 颜色值 (int, int, int, int)。此属性将在灯光的颜色模式设置为 ColorMode.RGBW 时复制到灯光的状态属性中,否则将被忽略。 |
| rgbww_color | tuple[int, int, int, int, int] | None | None | RGBWW 颜色值 (int, int, int, int, int)。此属性将在灯光的颜色模式设置为 ColorMode.RGBWW 时复制到灯光的状态属性中,否则将被忽略。 |
| supported_color_modes | set[ColorMode] | None | None | 标志支持的颜色模式。 |
| xy_color | tuple[float, float] | None | None | XY 颜色值 (float, float)。此属性将在灯光的颜色模式设置为 ColorMode.XY 时复制到灯光的状态属性中,否则将被忽略。 |
颜色模式
新的集成必须实现 color_mode 和 supported_color_modes。如果一个集成升级以支持颜色模式,则应实现 color_mode 和 supported_color_modes。
支持的颜色模式通过使用 ColorMode 枚举中的值来定义。
如果灯光没有实现 supported_color_modes,LightEntity 将根据 supported_features 属性中的过时标志尝试推测:
- 从一个空集开始
- 如果设置了
SUPPORT_COLOR_TEMP,则添加ColorMode.COLOR_TEMP - 如果设置了
SUPPORT_COLOR,则添加ColorMode.HS - 如果设置了
SUPPORT_WHITE_VALUE,则添加ColorMode.RGBW - 如果设置了
SUPPORT_BRIGHTNESS并且尚未添加任何颜色模式,则添加ColorMode.BRIGHTNESS - 如果尚未添加任何颜色模式,则添加
ColorMode.ONOFF
如果灯光没有实现 color_mode,LightEntity 将根据哪些属性被设置和哪些是 None 来尝试推测:
- 如果
supported_color_modes包含ColorMode.RGBW并且white_value和hs_color都不为 None:ColorMode.RGBW - 否则如果
supported_color_modes包含ColorMode.HS并且hs_color不为 None:ColorMode.HS - 否则如果
supported_color_modes包含ColorMode.COLOR_TEMP并且color_temp不为 None:ColorMode.COLOR_TEMP - 否则如果
supported_color_modes包含ColorMode.BRIGHTNESS并且brightness不为 None:ColorMode.BRIGHTNESS - 否则如果
supported_color_modes包含ColorMode.ONOFF:ColorMode.ONOFF - 否则:ColorMode.UNKNOWN
| 值 | 描述 |
|---|---|
ColorMode.UNKNOWN | 灯光的颜色模式未知。 |
ColorMode.ONOFF | 灯光可以开或关。如果灯光支持此模式,则此模式必须是唯一的支持模式。 |
ColorMode.BRIGHTNESS | 灯光可以调光。如果灯光支持此模式,则此模式必须是唯一的支持模式。 |
ColorMode.COLOR_TEMP | 灯光可以调光,其色温存在于状态中。 |
ColorMode.HS | 灯光可以调光且其颜色可以调整。灯光的亮度可以通过 brightness 参数设置,并通过 brightness 属性读取。灯光的颜色可以通过 hs_color 参数设置,并通过 hs_color 属性读取。hs_color 是一个 (h, s) 元组(没有亮度)。 |
ColorMode.RGB | 灯光可以调光且其颜色可以调整。灯光的亮度可以通过 brightness 参数设置,并通过 brightness 属性读取。灯光的颜色可以通过 rgb_color 参数设置,并通过 rgb_color 属性读取。rgb_color 是一个 (r, g, b) 元组(未根据亮度进行归一化)。 |
ColorMode.RGBW | 灯光可以调光且其颜色可以调整。灯光的亮度可以通过 brightness 参数设置,并通过 brightness 属性读取。灯光的颜色可以通过 rgbw_color 参数设置,并通过 rgbw_color 属性读取。rgbw_color 是一个 (r, g, b, w) 元组(未根据亮度进行归一化)。 |
ColorMode.RGBWW | 灯光可以调光且其颜色可以调整。灯光的亮度可以通过 brightness 参数设置,并通过 brightness 属性读取。灯光的颜色可以通过 rgbww_color 参数设置,并通过 rgbww_color 属性读取。rgbww_color 是一个 (r, g, b, cw, ww) 元组(未根据亮度进行归一化)。 |
ColorMode.WHITE | 灯光可以调光且其颜色可以调整。此外,灯光可以设置为白色模式。灯光的亮度可以通过 brightness 参数设置,并通过 brightness 属性读取。灯光可以通过使用带有所需亮度作为值的 white 参数设置为白色模式。请注意,没有 white 属性。如果在服务动作调用中同时存在 brightness 和 white,则 white 参数将被更新为 brightness 的值。如果此模式被支持,灯光 必须 还支持至少一个 ColorMode.HS、ColorMode.RGB、ColorMode.RGBW、ColorMode.RGBWW 或 ColorMode.XY,并且 不能 支持 ColorMode.COLOR_TEMP。 |
ColorMode.XY | 灯光可以调光且其颜色可以调整。灯光的亮度可以通过 brightness 参数设置,并通过 brightness 属性读取。灯光的颜色可以通过 xy_color 参数设置,并通过 xy_color 属性读取。xy_color 是一个 (x, y) 元组。 |
请注意,在颜色模式 ColorMode.RGB、ColorMode.RGBW 和 ColorMode.RGBWW 中,灯光的 brightness 属性和颜色中都有亮度信息。例如,如果灯光的亮度为 128,灯光的颜色为 (192, 64, 32),那么灯光的整体亮度为:128/255 * max(192, 64, 32)/255 = 38%。
如果灯光处于 ColorMode.HS、ColorMode.RGB 或 ColorMode.XY 模式,灯光的状态属性将包含灯光的颜色,表示为 hs、rgb 和 xy 颜色格式。请注意,当灯光处于 ColorMode.RGB 模式时,hs 和 xy 状态属性仅保留 rgb 颜色的色度,因为 hs 和 xy 对不包含亮度信息。
如果灯光处于 ColorMode.RGBW 或 ColorMode.RGBWW 模式,灯光的状态属性将包含灯光的颜色,表示为 hs、rgb 和 xy 颜色格式。颜色转换是通过将白色通道添加到颜色中来进行近似。
白色颜色模式
有两种白色颜色模式,ColorMode.COLOR_TEMP 和 ColorMode.WHITE。这两种模式之间的区别在于 ColorMode.WHITE 不允许调节色温,而 ColorMode.COLOR_TEMP 允许调节色温。
可调色温的灯通常由至少两组 LED 组成,具有不同的色温,通常一组是暖白色 LED,另一组是冷白色 LED。 不可调节色温的灯通常只有一组白色 LED。
渲染效果时的颜色模式
在渲染效果时,color_mode 应根据效果支持的调整进行设置。如果效果不支持任何调整,则 color_mode 应设置为 ColorMode.ONOFF。
如果效果允许调节亮度,则 color_mode 应设置为 ColorMode.BRIGHTNESS。
在渲染效果时,可以将 color_mode 设置为比 supported_color_mode 属性指示的颜色模式更具限制性的模式:
- 支持颜色的灯在受效果控制时可以将
color_mode设置为ColorMode.ONOFF或ColorMode.BRIGHTNESS - 支持亮度的灯在受效果控制时可以将
color_mode设置为ColorMode.ONOFF
支持的功能
支持的功能通过使用 LightEntityFeature 枚举中的值定义,并使用按位 或 (|) 操作符组合。
| 值 | 描述 |
|---|---|
EFFECT | 控制光源显示的效果 |
FLASH | 控制光源显示闪烁的持续时间 |
TRANSITION | 控制颜色和效果之间的过渡持续时间 |
方法
打开灯设备
class MyLightEntity(LightEntity):
def turn_on(self, **kwargs):
"""打开设备。"""
async def async_turn_on(self, **kwargs):
"""打开设备。"""
请注意,async_turn_on 方法没有传递 color_mode,而是只允许单个颜色属性。
保证集成在 turn_on 调用中只接收单个颜色属性,这由根据灯光的 supported_color_modes 属性确定。如果灯光不支持相应的颜色模式,则在调用实体的 async_turn_on 方法之前,服务动作调用中的颜色将被转换:
| 颜色类型 | 转换 |
|---|---|
| color_temp | 如果不被支持将从服务动作调用中删除,并转换为 hs_color、rgb_color、rgbw_color、rgbww_color 或 xy_color(如果灯光支持)。 |
| hs_color | 如果不被支持将从服务动作调用中删除,并转换为 rgb_color、rgbw_color、rgbww_color 或 xy_color(如果灯光支持)。 |
| rgb_color | 如果不被支持将从服务动作调用中删除,并转换为 rgbw_color、rgbww_color、hs_color 或 xy_color(如果灯光支持)。 |
| rgbw_color | 如果不被支持将从服务动作调用中删除。 |
| rgbww_color | 如果不被支持将从服务动作调用中删除。 |
| xy_color | 如果不被支持将从服务动作调用中删除,并转换为 hs_color、rgb_color、rgbw_color 或 rgbww_color(如果灯光支持)。 |
Home Assistant 包含一个缩放亮度的工具。
如果灯光支持亮度,有时需要缩放亮度值:
from homeassistant.util.color import value_to_brightness
BRIGHTNESS_SCALE = (1, 1023)
...
@property
def brightness(self) -> Optional[int]:
"""返回当前亮度。"""
return value_to_brightness(BRIGHTNESS_SCALE, self._device.brightness)
要将亮度缩放到设备范围:
from homeassistant.util.percentage import percentage_to_ranged_value
BRIGHTNESS_SCALE = (1, 1023)
...
class MyLightEntity(LightEntity):
async def async_turn_on(self, **kwargs) -> None:
"""打开设备。"""
...
value_in_range = math.ceil(percentage_to_ranged_value(BRIGHTNESS_SCALE, kwargs[ATTR_BRIGHTNESS]))
关闭灯设备
class MyLightEntity(LightEntity):
def turn_off(self, **kwargs):
"""关闭设备。"""
async def async_turn_off(self, **kwargs):
"""关闭设备。"""