From b4975344a13633e480a923892fe73d3a94f2cec1 Mon Sep 17 00:00:00 2001 From: Simon Lamon <32477463+silamon@users.noreply.github.com> Date: Thu, 24 Aug 2023 11:56:03 +0200 Subject: [PATCH] Don't show a battery if the entity domain is Number (#17631) --- src/data/entity_attributes.ts | 2 +- src/data/entity_registry.ts | 27 ++++++++++++++---- .../more-info/controls/more-info-vacuum.ts | 13 +++++---- .../config/devices/ha-config-device-page.ts | 23 ++++++++------- .../devices/ha-config-devices-dashboard.ts | 28 +++++++++++-------- 5 files changed, 58 insertions(+), 35 deletions(-) diff --git a/src/data/entity_attributes.ts b/src/data/entity_attributes.ts index 14e1c6ce27..523d8d2d61 100644 --- a/src/data/entity_attributes.ts +++ b/src/data/entity_attributes.ts @@ -67,7 +67,7 @@ export const DOMAIN_ATTRIBUTES_UNITS: Record> = { sun: { elevation: "°", }, - vaccum: { + vacuum: { battery_level: "%", }, }; diff --git a/src/data/entity_registry.ts b/src/data/entity_registry.ts index 70b0b30209..c55a09aaa3 100644 --- a/src/data/entity_registry.ts +++ b/src/data/entity_registry.ts @@ -6,6 +6,7 @@ import { caseInsensitiveStringCompare } from "../common/string/compare"; import { debounce } from "../common/util/debounce"; import { HomeAssistant } from "../types"; import { LightColor } from "./light"; +import { computeDomain } from "../common/entity/compute_domain"; type entityCategory = "config" | "diagnostic"; @@ -129,15 +130,29 @@ export interface EntityRegistryEntryUpdateParams { aliases?: string[]; } +const batteryPriorities = ["sensor", "binary_sensor"]; export const findBatteryEntity = ( hass: HomeAssistant, entities: T[] -): T | undefined => - entities.find( - (entity) => - hass.states[entity.entity_id] && - hass.states[entity.entity_id].attributes.device_class === "battery" - ); +): T | undefined => { + const batteryEntities = entities + .filter( + (entity) => + hass.states[entity.entity_id] && + hass.states[entity.entity_id].attributes.device_class === "battery" && + batteryPriorities.includes(computeDomain(entity.entity_id)) + ) + .sort( + (a, b) => + batteryPriorities.indexOf(computeDomain(a.entity_id)) - + batteryPriorities.indexOf(computeDomain(b.entity_id)) + ); + if (batteryEntities.length > 0) { + return batteryEntities[0]; + } + + return undefined; +}; export const findBatteryChargingEntity = ( hass: HomeAssistant, diff --git a/src/dialogs/more-info/controls/more-info-vacuum.ts b/src/dialogs/more-info/controls/more-info-vacuum.ts index df8b02bef7..f68d823a96 100644 --- a/src/dialogs/more-info/controls/more-info-vacuum.ts +++ b/src/dialogs/more-info/controls/more-info-vacuum.ts @@ -262,12 +262,13 @@ class MoreInfoVacuum extends LitElement { const battery = batteryEntity ? this.hass.states[batteryEntity.entity_id] : undefined; - - const batteryIsBinary = - battery && computeStateDomain(battery) === "binary_sensor"; + const batteryDomain = battery ? computeStateDomain(battery) : undefined; // Use device battery entity - if (battery && (batteryIsBinary || !isNaN(battery.state as any))) { + if ( + battery && + (batteryDomain === "binary_sensor" || !isNaN(battery.state as any)) + ) { const batteryChargingEntity = findBatteryChargingEntity( this.hass, entities @@ -279,7 +280,9 @@ class MoreInfoVacuum extends LitElement { return html`
- ${batteryIsBinary ? "" : this.hass.formatEntityState(battery)} + ${batteryDomain === "sensor" + ? this.hass.formatEntityState(battery) + : nothing} ${ - batteryState + battery && + (batteryDomain === "binary_sensor" || + !isNaN(battery.state as any)) ? html`
- ${batteryIsBinary - ? "" - : batteryState.state + - blankBeforePercent(this.hass.locale) + - "%"} + ${batteryDomain === "sensor" + ? this.hass.formatEntityState(battery) + : nothing}
diff --git a/src/panels/config/devices/ha-config-devices-dashboard.ts b/src/panels/config/devices/ha-config-devices-dashboard.ts index 576aa4413f..6697123192 100644 --- a/src/panels/config/devices/ha-config-devices-dashboard.ts +++ b/src/panels/config/devices/ha-config-devices-dashboard.ts @@ -1,7 +1,14 @@ import "@lrnwebcomponents/simple-tooltip/simple-tooltip"; import type { RequestSelectedDetail } from "@material/mwc-list/mwc-list-item"; import { mdiCancel, mdiFilterVariant, mdiPlus } from "@mdi/js"; -import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit"; +import { + css, + CSSResultGroup, + html, + LitElement, + nothing, + TemplateResult, +} from "lit"; import { customElement, property, state } from "lit/decorators"; import memoizeOne from "memoize-one"; import { HASSDomEvent } from "../../../common/dom/fire_event"; @@ -11,7 +18,6 @@ import { PROTOCOL_INTEGRATIONS, } from "../../../common/integrations/protocolIntegrationPicked"; import { navigate } from "../../../common/navigate"; -import { blankBeforePercent } from "../../../common/translations/blank_before_percent"; import { LocalizeFunc } from "../../../common/translations/localize"; import { computeRTL } from "../../../common/util/compute_rtl"; import { @@ -374,22 +380,22 @@ export class HaConfigDeviceDashboard extends LitElement { batteryEntityPair && batteryEntityPair[0] ? this.hass.states[batteryEntityPair[0]] : undefined; + const batteryDomain = battery + ? computeStateDomain(battery) + : undefined; const batteryCharging = batteryEntityPair && batteryEntityPair[1] ? this.hass.states[batteryEntityPair[1]] : undefined; - const batteryIsBinary = - battery && computeStateDomain(battery) === "binary_sensor"; - return battery && (batteryIsBinary || !isNaN(battery.state as any)) + return battery && + (batteryDomain === "binary_sensor" || !isNaN(battery.state as any)) ? html` - ${batteryIsBinary - ? "" - : Number(battery.state).toFixed() + - blankBeforePercent(this.hass.locale) + - "%"} + ${batteryDomain === "sensor" + ? this.hass.formatEntityState(battery) + : nothing}