diff --git a/gallery/src/pages/more-info/light.ts b/gallery/src/pages/more-info/light.ts index 999a4908ad..336aeb8ca8 100644 --- a/gallery/src/pages/more-info/light.ts +++ b/gallery/src/pages/more-info/light.ts @@ -1,12 +1,7 @@ import { html, LitElement, PropertyValues, TemplateResult } from "lit"; import { customElement, property, query } from "lit/decorators"; import "../../../../src/components/ha-card"; -import { - LightColorModes, - SUPPORT_EFFECT, - SUPPORT_FLASH, - SUPPORT_TRANSITION, -} from "../../../../src/data/light"; +import { LightColorMode, LightEntityFeature } from "../../../../src/data/light"; import "../../../../src/dialogs/more-info/more-info-content"; import { getEntity } from "../../../../src/fake_data/entity"; import { @@ -22,8 +17,8 @@ const ENTITIES = [ getEntity("light", "kitchen_light", "on", { friendly_name: "Brightness Light", brightness: 200, - supported_color_modes: [LightColorModes.BRIGHTNESS], - color_mode: LightColorModes.BRIGHTNESS, + supported_color_modes: [LightColorMode.BRIGHTNESS], + color_mode: LightColorMode.BRIGHTNESS, }), getEntity("light", "color_temperature_light", "on", { friendly_name: "White Color Temperature Light", @@ -32,10 +27,10 @@ const ENTITIES = [ min_mireds: 30, max_mireds: 150, supported_color_modes: [ - LightColorModes.BRIGHTNESS, - LightColorModes.COLOR_TEMP, + LightColorMode.BRIGHTNESS, + LightColorMode.COLOR_TEMP, ], - color_mode: LightColorModes.COLOR_TEMP, + color_mode: LightColorMode.COLOR_TEMP, }), getEntity("light", "color_hs_light", "on", { friendly_name: "Color HS Light", @@ -44,13 +39,16 @@ const ENTITIES = [ rgb_color: [30, 100, 255], min_mireds: 30, max_mireds: 150, - supported_features: SUPPORT_EFFECT + SUPPORT_FLASH + SUPPORT_TRANSITION, + supported_features: + LightEntityFeature.EFFECT + + LightEntityFeature.FLASH + + LightEntityFeature.TRANSITION, supported_color_modes: [ - LightColorModes.BRIGHTNESS, - LightColorModes.COLOR_TEMP, - LightColorModes.HS, + LightColorMode.BRIGHTNESS, + LightColorMode.COLOR_TEMP, + LightColorMode.HS, ], - color_mode: LightColorModes.HS, + color_mode: LightColorMode.HS, effect_list: ["random", "colorloop"], }), getEntity("light", "color_rgb_ct_light", "on", { @@ -59,22 +57,28 @@ const ENTITIES = [ color_temp: 75, min_mireds: 30, max_mireds: 150, - supported_features: SUPPORT_EFFECT + SUPPORT_FLASH + SUPPORT_TRANSITION, + supported_features: + LightEntityFeature.EFFECT + + LightEntityFeature.FLASH + + LightEntityFeature.TRANSITION, supported_color_modes: [ - LightColorModes.BRIGHTNESS, - LightColorModes.COLOR_TEMP, - LightColorModes.RGB, + LightColorMode.BRIGHTNESS, + LightColorMode.COLOR_TEMP, + LightColorMode.RGB, ], - color_mode: LightColorModes.COLOR_TEMP, + color_mode: LightColorMode.COLOR_TEMP, effect_list: ["random", "colorloop"], }), getEntity("light", "color_RGB_light", "on", { friendly_name: "Color Effects Light", brightness: 255, rgb_color: [30, 100, 255], - supported_features: SUPPORT_EFFECT + SUPPORT_FLASH + SUPPORT_TRANSITION, - supported_color_modes: [LightColorModes.BRIGHTNESS, LightColorModes.RGB], - color_mode: LightColorModes.RGB, + supported_features: + LightEntityFeature.EFFECT + + LightEntityFeature.FLASH + + LightEntityFeature.TRANSITION, + supported_color_modes: [LightColorMode.BRIGHTNESS, LightColorMode.RGB], + color_mode: LightColorMode.RGB, effect_list: ["random", "colorloop"], }), getEntity("light", "color_rgbw_light", "on", { @@ -83,13 +87,16 @@ const ENTITIES = [ rgbw_color: [30, 100, 255, 125], min_mireds: 30, max_mireds: 150, - supported_features: SUPPORT_EFFECT + SUPPORT_FLASH + SUPPORT_TRANSITION, + supported_features: + LightEntityFeature.EFFECT + + LightEntityFeature.FLASH + + LightEntityFeature.TRANSITION, supported_color_modes: [ - LightColorModes.BRIGHTNESS, - LightColorModes.COLOR_TEMP, - LightColorModes.RGBW, + LightColorMode.BRIGHTNESS, + LightColorMode.COLOR_TEMP, + LightColorMode.RGBW, ], - color_mode: LightColorModes.RGBW, + color_mode: LightColorMode.RGBW, effect_list: ["random", "colorloop"], }), getEntity("light", "color_rgbww_light", "on", { @@ -98,13 +105,16 @@ const ENTITIES = [ rgbww_color: [30, 100, 255, 125, 10], min_mireds: 30, max_mireds: 150, - supported_features: SUPPORT_EFFECT + SUPPORT_FLASH + SUPPORT_TRANSITION, + supported_features: + LightEntityFeature.EFFECT + + LightEntityFeature.FLASH + + LightEntityFeature.TRANSITION, supported_color_modes: [ - LightColorModes.BRIGHTNESS, - LightColorModes.COLOR_TEMP, - LightColorModes.RGBWW, + LightColorMode.BRIGHTNESS, + LightColorMode.COLOR_TEMP, + LightColorMode.RGBWW, ], - color_mode: LightColorModes.RGBWW, + color_mode: LightColorMode.RGBWW, effect_list: ["random", "colorloop"], }), getEntity("light", "color_xy_light", "on", { @@ -114,13 +124,16 @@ const ENTITIES = [ rgb_color: [30, 100, 255], min_mireds: 30, max_mireds: 150, - supported_features: SUPPORT_EFFECT + SUPPORT_FLASH + SUPPORT_TRANSITION, + supported_features: + LightEntityFeature.EFFECT + + LightEntityFeature.FLASH + + LightEntityFeature.TRANSITION, supported_color_modes: [ - LightColorModes.BRIGHTNESS, - LightColorModes.COLOR_TEMP, - LightColorModes.XY, + LightColorMode.BRIGHTNESS, + LightColorMode.COLOR_TEMP, + LightColorMode.XY, ], - color_mode: LightColorModes.XY, + color_mode: LightColorMode.XY, effect_list: ["random", "colorloop"], }), ]; diff --git a/src/data/light.ts b/src/data/light.ts index 93ae0c1d75..a171568451 100644 --- a/src/data/light.ts +++ b/src/data/light.ts @@ -3,76 +3,83 @@ import { HassEntityBase, } from "home-assistant-js-websocket"; -export const enum LightColorModes { +export const enum LightEntityFeature { + EFFECT = 4, + FLASH = 8, + TRANSITION = 32, +} + +export const enum LightColorMode { UNKNOWN = "unknown", ONOFF = "onoff", BRIGHTNESS = "brightness", COLOR_TEMP = "color_temp", - WHITE = "white", HS = "hs", XY = "xy", RGB = "rgb", RGBW = "rgbw", RGBWW = "rgbww", + WHITE = "white", } const modesSupportingColor = [ - LightColorModes.HS, - LightColorModes.XY, - LightColorModes.RGB, - LightColorModes.RGBW, - LightColorModes.RGBWW, + LightColorMode.HS, + LightColorMode.XY, + LightColorMode.RGB, + LightColorMode.RGBW, + LightColorMode.RGBWW, ]; -const modesSupportingDimming = [ +const modesSupportingBrightness = [ ...modesSupportingColor, - LightColorModes.COLOR_TEMP, - LightColorModes.BRIGHTNESS, + LightColorMode.COLOR_TEMP, + LightColorMode.BRIGHTNESS, + LightColorMode.WHITE, ]; -export const SUPPORT_EFFECT = 4; -export const SUPPORT_FLASH = 8; -export const SUPPORT_TRANSITION = 32; - export const lightSupportsColorMode = ( entity: LightEntity, - mode: LightColorModes -) => entity.attributes.supported_color_modes?.includes(mode); + mode: LightColorMode +) => entity.attributes.supported_color_modes?.includes(mode) || false; export const lightIsInColorMode = (entity: LightEntity) => - modesSupportingColor.includes(entity.attributes.color_mode); + (entity.attributes.color_mode && + modesSupportingColor.includes(entity.attributes.color_mode)) || + false; export const lightSupportsColor = (entity: LightEntity) => entity.attributes.supported_color_modes?.some((mode) => modesSupportingColor.includes(mode) ); -export const lightSupportsDimming = (entity: LightEntity) => +export const lightSupportsBrightness = (entity: LightEntity) => entity.attributes.supported_color_modes?.some((mode) => - modesSupportingDimming.includes(mode) - ); + modesSupportingBrightness.includes(mode) + ) || false; -export const getLightCurrentModeRgbColor = (entity: LightEntity): number[] => - entity.attributes.color_mode === LightColorModes.RGBWW +export const getLightCurrentModeRgbColor = ( + entity: LightEntity +): number[] | undefined => + entity.attributes.color_mode === LightColorMode.RGBWW ? entity.attributes.rgbww_color - : entity.attributes.color_mode === LightColorModes.RGBW + : entity.attributes.color_mode === LightColorMode.RGBW ? entity.attributes.rgbw_color : entity.attributes.rgb_color; interface LightEntityAttributes extends HassEntityAttributeBase { - min_mireds: number; - max_mireds: number; - friendly_name: string; - brightness: number; - hs_color: [number, number]; - rgb_color: [number, number, number]; - rgbw_color: [number, number, number, number]; - rgbww_color: [number, number, number, number, number]; - color_temp: number; + min_mireds?: number; + max_mireds?: number; + brightness?: number; + xy_color?: [number, number]; + hs_color?: [number, number]; + color_temp?: number; + rgb_color?: [number, number, number]; + rgbw_color?: [number, number, number, number]; + rgbww_color?: [number, number, number, number, number]; effect?: string; - effect_list: string[] | null; - supported_color_modes: LightColorModes[]; - color_mode: LightColorModes; + effect_list?: string[] | null; + supported_color_modes?: LightColorMode[]; + color_mode?: LightColorMode; } export interface LightEntity extends HassEntityBase { diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts index 29fb2644d8..be85eb7921 100644 --- a/src/dialogs/more-info/controls/more-info-light.ts +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -20,13 +20,13 @@ import "../../../components/ha-labeled-slider"; import "../../../components/ha-select"; import { getLightCurrentModeRgbColor, - LightColorModes, + LightColorMode, LightEntity, + LightEntityFeature, lightIsInColorMode, lightSupportsColor, lightSupportsColorMode, - lightSupportsDimming, - SUPPORT_EFFECT, + lightSupportsBrightness, } from "../../../data/light"; import type { HomeAssistant } from "../../../types"; @@ -56,7 +56,7 @@ class MoreInfoLight extends LitElement { @state() private _colorPickerColor?: [number, number, number]; - @state() private _mode?: "color" | LightColorModes; + @state() private _mode?: "color" | LightColorMode; protected render(): TemplateResult { if (!this.hass || !this.stateObj) { @@ -65,29 +65,29 @@ class MoreInfoLight extends LitElement { const supportsTemp = lightSupportsColorMode( this.stateObj, - LightColorModes.COLOR_TEMP + LightColorMode.COLOR_TEMP ); const supportsWhite = lightSupportsColorMode( this.stateObj, - LightColorModes.WHITE + LightColorMode.WHITE ); const supportsRgbww = lightSupportsColorMode( this.stateObj, - LightColorModes.RGBWW + LightColorMode.RGBWW ); const supportsRgbw = !supportsRgbww && - lightSupportsColorMode(this.stateObj, LightColorModes.RGBW); + lightSupportsColorMode(this.stateObj, LightColorMode.RGBW); const supportsColor = supportsRgbww || supportsRgbw || lightSupportsColor(this.stateObj); return html`