From 023f13cd1265b55bb5c03dbf61921ab8416442e9 Mon Sep 17 00:00:00 2001 From: Paul Bottein Date: Thu, 10 Aug 2023 09:57:03 +0200 Subject: [PATCH] Redesign mode buttons for climate more-info (#17535) --- src/data/climate.ts | 99 ++++++ src/data/humidifier.ts | 4 +- .../ha-more-info-climate-temperature.ts | 11 +- .../more-info/controls/more-info-climate.ts | 318 ++++++++++-------- .../controls/more-info-humidifier.ts | 10 +- 5 files changed, 294 insertions(+), 148 deletions(-) diff --git a/src/data/climate.ts b/src/data/climate.ts index ede93a6933..bf72c04582 100644 --- a/src/data/climate.ts +++ b/src/data/climate.ts @@ -1,18 +1,38 @@ import { + mdiAccountArrowRight, + mdiArrowAll, + mdiArrowLeftRight, + mdiArrowUpDown, + mdiBed, + mdiCircleMedium, mdiClockOutline, mdiFan, + mdiFanAuto, + mdiFanOff, mdiFire, mdiHeatWave, + mdiHome, + mdiLeaf, + mdiMotionSensor, mdiPower, + mdiRocketLaunch, mdiSnowflake, + mdiSofa, + mdiSpeedometer, + mdiSpeedometerMedium, + mdiSpeedometerSlow, mdiSunSnowflakeVariant, + mdiTarget, mdiThermostatAuto, mdiWaterPercent, + mdiWeatherWindy, } from "@mdi/js"; import { HassEntityAttributeBase, HassEntityBase, } from "home-assistant-js-websocket"; +import { haOscillatingOff } from "./icons/haOscillatingOff"; +import { haOscillating } from "./icons/haOscillating"; export type HvacMode = | "off" @@ -114,3 +134,82 @@ export const CLIMATE_HVAC_MODE_ICONS: Record = { off: mdiPower, heat_cool: mdiSunSnowflakeVariant, }; + +export const computeHvacModeIcon = (mode: HvacMode) => + CLIMATE_HVAC_MODE_ICONS[mode]; + +type ClimateBuiltInPresetMode = + | "eco" + | "away" + | "boost" + | "comfort" + | "home" + | "sleep" + | "activity"; + +export const CLIMATE_PRESET_MODE_ICONS: Record< + ClimateBuiltInPresetMode, + string +> = { + away: mdiAccountArrowRight, + boost: mdiRocketLaunch, + comfort: mdiSofa, + eco: mdiLeaf, + home: mdiHome, + sleep: mdiBed, + activity: mdiMotionSensor, +}; + +export const computePresetModeIcon = (mode: string) => + mode in CLIMATE_PRESET_MODE_ICONS + ? CLIMATE_PRESET_MODE_ICONS[mode] + : mdiCircleMedium; + +type ClimateBuiltInFanMode = + | "on" + | "off" + | "auto" + | "low" + | "medium" + | "high" + | "middle" + | "focus" + | "diffuse"; + +export const CLIMATE_FAN_MODE_ICONS: Record = { + on: mdiFan, + off: mdiFanOff, + auto: mdiFanAuto, + low: mdiSpeedometerSlow, + medium: mdiSpeedometerMedium, + high: mdiSpeedometer, + middle: mdiSpeedometerMedium, + focus: mdiTarget, + diffuse: mdiWeatherWindy, +}; + +export const computeFanModeIcon = (mode: string) => + mode in CLIMATE_FAN_MODE_ICONS + ? CLIMATE_FAN_MODE_ICONS[mode] + : mdiCircleMedium; + +type ClimateBuiltInSwingMode = + | "off" + | "on" + | "vertical" + | "horizontal" + | "both"; + +export const CLIMATE_SWING_MODE_ICONS: Record = + { + on: haOscillating, + off: haOscillatingOff, + vertical: mdiArrowUpDown, + horizontal: mdiArrowLeftRight, + both: mdiArrowAll, + }; + +export const computeSwingModeIcon = (mode: string) => + mode in CLIMATE_SWING_MODE_ICONS + ? CLIMATE_SWING_MODE_ICONS[mode] + : mdiCircleMedium; diff --git a/src/data/humidifier.ts b/src/data/humidifier.ts index 4fa99ac248..bd94bf59d0 100644 --- a/src/data/humidifier.ts +++ b/src/data/humidifier.ts @@ -1,9 +1,9 @@ import { mdiAccountArrowRight, - mdiAirHumidifier, mdiArrowDownBold, mdiArrowUpBold, mdiBabyCarriage, + mdiCircleMedium, mdiClockOutline, mdiHome, mdiLeaf, @@ -68,7 +68,7 @@ export const HUMIDIFIER_MODE_ICONS: Record = { }; export const computeHumidiferModeIcon = (mode?: string) => - HUMIDIFIER_MODE_ICONS[mode as HumidifierBuiltInMode] ?? mdiAirHumidifier; + HUMIDIFIER_MODE_ICONS[mode as HumidifierBuiltInMode] ?? mdiCircleMedium; export const HUMIDIFIER_ACTION_ICONS: Record = { drying: mdiArrowDownBold, diff --git a/src/dialogs/more-info/components/climate/ha-more-info-climate-temperature.ts b/src/dialogs/more-info/components/climate/ha-more-info-climate-temperature.ts index be43b3b796..9f33ba5e34 100644 --- a/src/dialogs/more-info/components/climate/ha-more-info-climate-temperature.ts +++ b/src/dialogs/more-info/components/climate/ha-more-info-climate-temperature.ts @@ -167,11 +167,12 @@ export class HaMoreInfoClimateTemperature extends LitElement { const lowColor = stateColorCss(this.stateObj, "heat"); const highColor = stateColorCss(this.stateObj, "cool"); - const color = colored - ? target === "high" - ? highColor - : lowColor - : undefined; + const color = + colored && stateActive(this.stateObj) + ? target === "high" + ? highColor + : lowColor + : undefined; return html`
diff --git a/src/dialogs/more-info/controls/more-info-climate.ts b/src/dialogs/more-info/controls/more-info-climate.ts index 4382a3a6ea..fd5769fba0 100644 --- a/src/dialogs/more-info/controls/more-info-climate.ts +++ b/src/dialogs/more-info/controls/more-info-climate.ts @@ -1,5 +1,11 @@ import "@material/mwc-list/mwc-list-item"; -import { mdiThermometer, mdiWaterPercent } from "@mdi/js"; +import { + mdiFan, + mdiThermometer, + mdiThermostat, + mdiTuneVariant, + mdiWaterPercent, +} from "@mdi/js"; import { CSSResultGroup, LitElement, @@ -20,20 +26,28 @@ import { computeStateDisplay } from "../../../common/entity/compute_state_displa import { supportsFeature } from "../../../common/entity/supports-feature"; import { formatNumber } from "../../../common/number/format_number"; import { blankBeforePercent } from "../../../common/translations/blank_before_percent"; +import "../../../components/ha-control-select-menu"; import "../../../components/ha-icon-button-group"; import "../../../components/ha-icon-button-toggle"; +import "../../../components/ha-list-item"; import "../../../components/ha-select"; import "../../../components/ha-switch"; import { ClimateEntity, ClimateEntityFeature, + HvacMode, compareClimateHvacModes, + computeFanModeIcon, + computeHvacModeIcon, + computePresetModeIcon, + computeSwingModeIcon, } from "../../../data/climate"; import { UNAVAILABLE } from "../../../data/entity"; import { HomeAssistant } from "../../../types"; import "../components/climate/ha-more-info-climate-humidity"; import "../components/climate/ha-more-info-climate-temperature"; import { moreInfoControlStyle } from "../components/ha-more-info-control-style"; +import { haOscillating } from "../../../data/icons/haOscillating"; type MainControl = "temperature" | "humidity"; @@ -173,6 +187,174 @@ class MoreInfoClimate extends LitElement { ` : nothing}
+
+
+ + + ${stateObj.attributes.hvac_modes + .concat() + .sort(compareClimateHvacModes) + .map( + (mode) => html` + + + ${computeStateDisplay( + hass.localize, + stateObj, + hass.locale, + this.hass.config, + hass.entities, + mode + )} + + ` + )} + + ${supportPresetMode && stateObj.attributes.preset_modes + ? html` + + + ${stateObj.attributes.preset_modes!.map( + (mode) => html` + + + ${computeAttributeValueDisplay( + hass.localize, + stateObj, + hass.locale, + hass.config, + hass.entities, + "preset_mode", + mode + )} + + ` + )} + + ` + : nothing} + ${supportFanMode && stateObj.attributes.fan_modes + ? html` + + + ${stateObj.attributes.fan_modes!.map( + (mode) => html` + + + ${computeAttributeValueDisplay( + hass.localize, + stateObj, + hass.locale, + this.hass.config, + hass.entities, + "fan_mode", + mode + )} + + ` + )} + + ` + : nothing} + ${supportSwingMode && stateObj.attributes.swing_modes + ? html` + + + ${stateObj.attributes.swing_modes!.map( + (mode) => html` + + + ${computeAttributeValueDisplay( + hass.localize, + stateObj, + hass.locale, + this.hass.config, + hass.entities, + "swing_mode", + mode + )} + + ` + )} + + ` + : nothing} +
+
-
- - ${stateObj.attributes.hvac_modes - .concat() - .sort(compareClimateHvacModes) - .map( - (mode) => html` - - ${computeStateDisplay( - hass.localize, - stateObj, - hass.locale, - this.hass.config, - hass.entities, - mode - )} - - ` - )} - -
- - ${supportPresetMode && stateObj.attributes.preset_modes - ? html` -
- - ${stateObj.attributes.preset_modes!.map( - (mode) => html` - - ${computeAttributeValueDisplay( - hass.localize, - stateObj, - hass.locale, - hass.config, - hass.entities, - "preset_mode", - mode - )} - - ` - )} - -
- ` - : ""} - ${supportFanMode && stateObj.attributes.fan_modes - ? html` -
- - ${stateObj.attributes.fan_modes!.map( - (mode) => html` - - ${computeAttributeValueDisplay( - hass.localize, - stateObj, - hass.locale, - this.hass.config, - hass.entities, - "fan_mode", - mode - )} - - ` - )} - -
- ` - : ""} - ${supportSwingMode && stateObj.attributes.swing_modes - ? html` -
- - ${stateObj.attributes.swing_modes!.map( - (mode) => html` - - ${computeAttributeValueDisplay( - hass.localize, - stateObj, - hass.locale, - this.hass.config, - hass.entities, - "swing_mode", - mode - )} - - ` - )} - -
- ` - : ""} ${supportAuxHeat ? html`
diff --git a/src/dialogs/more-info/controls/more-info-humidifier.ts b/src/dialogs/more-info/controls/more-info-humidifier.ts index cfea49e2b4..72b7728b92 100644 --- a/src/dialogs/more-info/controls/more-info-humidifier.ts +++ b/src/dialogs/more-info/controls/more-info-humidifier.ts @@ -1,4 +1,4 @@ -import { mdiCircleMedium, mdiPower, mdiTuneVariant } from "@mdi/js"; +import { mdiPower, mdiTuneVariant } from "@mdi/js"; import { CSSResultGroup, LitElement, @@ -20,9 +20,9 @@ import { formatNumber } from "../../../common/number/format_number"; import { blankBeforePercent } from "../../../common/translations/blank_before_percent"; import "../../../components/ha-control-select-menu"; import { - HUMIDIFIER_MODE_ICONS, HumidifierEntity, HumidifierEntityFeature, + computeHumidiferModeIcon, } from "../../../data/humidifier"; import { HomeAssistant } from "../../../types"; import { moreInfoControlStyle } from "../components/ha-more-info-control-style"; @@ -137,8 +137,7 @@ class MoreInfoHumidifier extends LitElement { ${stateObj.attributes.available_modes!.map( @@ -146,8 +145,7 @@ class MoreInfoHumidifier extends LitElement { ${computeAttributeValueDisplay( hass.localize,