From 48948d5854bf43cfabeae4a126f65ad8a4c0a01b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 14 Oct 2021 09:56:51 -0700 Subject: [PATCH] Initial support for entity category (#10266) --- gallery/src/demos/demo-integration-card.ts | 1 + src/data/entity_registry.ts | 1 + .../device-detail/ha-device-entities-card.ts | 8 ++-- .../config/devices/ha-config-device-page.ts | 37 ++++++++++++++++--- .../config/entities/ha-config-entities.ts | 1 + .../common/generate-lovelace-config.ts | 5 ++- src/translations/en.json | 3 ++ 7 files changed, 44 insertions(+), 12 deletions(-) diff --git a/gallery/src/demos/demo-integration-card.ts b/gallery/src/demos/demo-integration-card.ts index 0b08a0aa3e..ecfcd9671c 100644 --- a/gallery/src/demos/demo-integration-card.ts +++ b/gallery/src/demos/demo-integration-card.ts @@ -187,6 +187,7 @@ const createEntityRegistryEntries = ( device_id: "mock-device-id", area_id: null, disabled_by: null, + entity_category: null, entity_id: "binary_sensor.updater", name: null, icon: null, diff --git a/src/data/entity_registry.ts b/src/data/entity_registry.ts index 28f389922e..7072c44227 100644 --- a/src/data/entity_registry.ts +++ b/src/data/entity_registry.ts @@ -13,6 +13,7 @@ export interface EntityRegistryEntry { device_id: string | null; area_id: string | null; disabled_by: string | null; + entity_category: "config" | "diagnostic" | null; } export interface ExtEntityRegistryEntry extends EntityRegistryEntry { diff --git a/src/panels/config/devices/device-detail/ha-device-entities-card.ts b/src/panels/config/devices/device-detail/ha-device-entities-card.ts index 5bb169256b..1cd5ee4051 100644 --- a/src/panels/config/devices/device-detail/ha-device-entities-card.ts +++ b/src/panels/config/devices/device-detail/ha-device-entities-card.ts @@ -25,6 +25,8 @@ import { EntityRegistryStateEntry } from "../ha-config-device-page"; @customElement("ha-device-entities-card") export class HaDeviceEntitiesCard extends LitElement { + @property() public header!: string; + @property({ attribute: false }) public hass!: HomeAssistant; @property() public entities!: EntityRegistryStateEntry[]; @@ -47,11 +49,7 @@ export class HaDeviceEntitiesCard extends LitElement { const disabledEntities: EntityRegistryStateEntry[] = []; this._entityRows = []; return html` - + ${this.entities.length ? html`
diff --git a/src/panels/config/devices/ha-config-device-page.ts b/src/panels/config/devices/ha-config-device-page.ts index b130d34e91..ebca2ef39e 100644 --- a/src/panels/config/devices/ha-config-device-page.ts +++ b/src/panels/config/devices/ha-config-device-page.ts @@ -8,6 +8,7 @@ import { isComponentLoaded } from "../../../common/config/is_component_loaded"; import { computeStateDomain } from "../../../common/entity/compute_state_domain"; import { computeStateName } from "../../../common/entity/compute_state_name"; import { stringCompare } from "../../../common/string/compare"; +import { groupBy } from "../../../common/util/group-by"; import { slugify } from "../../../common/string/slugify"; import "../../../components/entity/ha-battery-icon"; import "../../../components/ha-icon-button"; @@ -112,6 +113,25 @@ export class HaConfigDevicePage extends LitElement { ) ); + private _entitiesByCategory = memoizeOne( + (entities: EntityRegistryEntry[]) => { + const result = groupBy( + entities, + (entry) => entry.entity_category || "state" + ) as Record< + "state" | NonNullable, + EntityRegistryStateEntry[] + >; + for (const key of ["state", "diagnostic", "config"]) { + if (!(key in result)) { + result[key] = []; + } + } + + return result; + } + ); + private _computeArea = memoizeOne( (areas, device): AreaRegistryEntry | undefined => { if (!areas || !device || !device.area_id) { @@ -159,6 +179,7 @@ export class HaConfigDevicePage extends LitElement { const integrations = this._integrations(device, this.entries); const entities = this._entities(this.deviceId, this.entities); + const entitiesByCategory = this._entitiesByCategory(entities); const batteryEntity = this._batteryEntity(entities); const batteryChargingEntity = this._batteryChargingEntity(entities); const batteryState = batteryEntity @@ -298,18 +319,22 @@ export class HaConfigDevicePage extends LitElement { ${this._renderIntegrationInfo(device, integrations)} - ${ - entities.length - ? html` + ${["state", "config", "diagnostic"].map((category) => + !entitiesByCategory[category].length + ? "" + : html` ` - : html`` - } + )} +
${ diff --git a/src/panels/config/entities/ha-config-entities.ts b/src/panels/config/entities/ha-config-entities.ts index 7dfe441b87..4b22362764 100644 --- a/src/panels/config/entities/ha-config-entities.ts +++ b/src/panels/config/entities/ha-config-entities.ts @@ -679,6 +679,7 @@ export class HaConfigEntities extends SubscribeMixin(LitElement) { icon: null, readonly: true, selectable: false, + entity_category: null, }); } if (changed) { diff --git a/src/panels/lovelace/common/generate-lovelace-config.ts b/src/panels/lovelace/common/generate-lovelace-config.ts index 7ed2709528..5edc9e313e 100644 --- a/src/panels/lovelace/common/generate-lovelace-config.ts +++ b/src/panels/lovelace/common/generate-lovelace-config.ts @@ -189,6 +189,7 @@ const adjustName = (name: string): string => hasUpperCase(name.substr(0, name.indexOf(" "))) ? name : name[0].toUpperCase() + name.slice(1); + const computeDefaultViewStates = ( entities: HassEntities, entityEntries: EntityRegistryEntry[] @@ -196,7 +197,9 @@ const computeDefaultViewStates = ( const states = {}; const hiddenEntities = new Set( entityEntries - .filter((entry) => HIDE_PLATFORM.has(entry.platform)) + .filter( + (entry) => entry.entity_category || HIDE_PLATFORM.has(entry.platform) + ) .map((entry) => entry.entity_id) ); diff --git a/src/translations/en.json b/src/translations/en.json index 7b0af74478..fddb6988d7 100755 --- a/src/translations/en.json +++ b/src/translations/en.json @@ -2170,6 +2170,9 @@ "device_not_found": "Device not found.", "entities": { "entities": "Entities", + "state": "State", + "diagnostic": "Diagnostic", + "config": "Config", "add_entities_lovelace": "Add to Lovelace", "none": "This device has no entities", "hide_disabled": "Hide disabled",