diff --git a/src/data/light.ts b/src/data/light.ts index 9ef41c284f..d9c68e5d44 100644 --- a/src/data/light.ts +++ b/src/data/light.ts @@ -8,6 +8,7 @@ export enum LightColorModes { ONOFF = "onoff", BRIGHTNESS = "brightness", COLOR_TEMP = "color_temp", + WHITE = "white", HS = "hs", XY = "xy", RGB = "rgb", diff --git a/src/dialogs/more-info/controls/more-info-light.ts b/src/dialogs/more-info/controls/more-info-light.ts index 3ac4d2e143..b232bc7c3c 100644 --- a/src/dialogs/more-info/controls/more-info-light.ts +++ b/src/dialogs/more-info/controls/more-info-light.ts @@ -9,6 +9,7 @@ import { TemplateResult, } from "lit"; import { customElement, property, state } from "lit/decorators"; +import memoizeOne from "memoize-one"; import { supportsFeature } from "../../../common/entity/supports-feature"; import "../../../components/ha-attributes"; import "../../../components/ha-button-toggle-group"; @@ -28,11 +29,6 @@ import { } from "../../../data/light"; import type { HomeAssistant } from "../../../types"; -const toggleButtons = [ - { label: "Color", value: "color" }, - { label: "Temperature", value: LightColorModes.COLOR_TEMP }, -]; - @customElement("more-info-light") class MoreInfoLight extends LitElement { @property({ attribute: false }) public hass!: HomeAssistant; @@ -59,7 +55,7 @@ class MoreInfoLight extends LitElement { @state() private _colorPickerColor?: [number, number, number]; - @state() private _mode?: "color" | LightColorModes.COLOR_TEMP; + @state() private _mode?: "color" | LightColorModes; protected render(): TemplateResult { if (!this.hass || !this.stateObj) { @@ -71,6 +67,11 @@ class MoreInfoLight extends LitElement { LightColorModes.COLOR_TEMP ); + const supportsWhite = lightSupportsColorMode( + this.stateObj, + LightColorModes.WHITE + ); + const supportsRgbww = lightSupportsColorMode( this.stateObj, LightColorModes.RGBWW @@ -101,16 +102,17 @@ class MoreInfoLight extends LitElement { ${this.stateObj.state === "on" ? html` ${supportsTemp || supportsColor ? html`
` : ""} - ${supportsTemp && supportsColor + ${supportsColor && (supportsTemp || supportsWhite) ? html`` : ""} ${supportsTemp && - (!supportsColor || this._mode === LightColorModes.COLOR_TEMP) + ((!supportsColor && !supportsWhite) || + this._mode === LightColorModes.COLOR_TEMP) ? html` ` : ""} - ${supportsColor && (!supportsTemp || this._mode === "color") + ${supportsColor && + ((!supportsTemp && !supportsWhite) || this._mode === "color") ? html`
{ + const modes = [{ label: "Color", value: "color" }]; + if (supportsTemp) { + modes.push({ label: "Temperature", value: LightColorModes.COLOR_TEMP }); + } + if (supportsWhite) { + modes.push({ label: "White", value: LightColorModes.WHITE }); + } + return modes; + } + ); + private _modeChanged(ev: CustomEvent) { this._mode = ev.detail.value; } @@ -326,6 +342,14 @@ class MoreInfoLight extends LitElement { this._brightnessSliderValue = bri; + if (this._mode === LightColorModes.WHITE) { + this.hass.callService("light", "turn_on", { + entity_id: this.stateObj!.entity_id, + white: Math.min(255, Math.round((bri * 255) / 100)), + }); + return; + } + if (this._brightnessAdjusted) { const rgb = this.stateObj!.attributes.rgb_color ||