${this.hass.localize(
@@ -54,53 +53,31 @@ export class HaMoreInfoSettings extends LitElement {
}
return html`
-
- ${dynamicElement(this._settingsElementTag, {
- hass: this.hass,
- entry: this._entry,
- entityId: this.entityId,
- })}
-
+ ${dynamicElement(this._settingsElementTag, {
+ hass: this.hass,
+ entry: this.entry,
+ entityId: this.entityId,
+ })}
`;
}
- protected willUpdate(changedProps: PropertyValues) {
- super.willUpdate(changedProps);
- if (changedProps.has("entityId")) {
- this._entry = undefined;
- if (this.entityId) {
- this._getEntityReg();
- }
- }
- }
-
- private async _getEntityReg() {
- try {
- this._entry = await getExtendedEntityRegistryEntry(
- this.hass,
- this.entityId
- );
+ public willUpdate(changedProps: PropertyValues) {
+ if (changedProps.has("entry")) {
this._loadPlatformSettingTabs();
- } catch {
- this._entry = null;
}
}
- private _entryUpdated(ev: CustomEvent
) {
- this._entry = ev.detail;
- }
-
private async _loadPlatformSettingTabs(): Promise {
- if (!this._entry) {
+ if (!this.entry) {
return;
}
if (
- !Object.keys(PLATFORMS_WITH_SETTINGS_TAB).includes(this._entry.platform)
+ !Object.keys(PLATFORMS_WITH_SETTINGS_TAB).includes(this.entry.platform)
) {
this._settingsElementTag = "entity-registry-settings";
return;
}
- const tag = PLATFORMS_WITH_SETTINGS_TAB[this._entry.platform];
+ const tag = PLATFORMS_WITH_SETTINGS_TAB[this.entry.platform];
await import(`../../panels/config/entities/editor-tabs/settings/${tag}`);
this._settingsElementTag = tag;
}
diff --git a/src/panels/config/automation/action/ha-automation-action-row.ts b/src/panels/config/automation/action/ha-automation-action-row.ts
index 71593afff5..b6474dc2ac 100644
--- a/src/panels/config/automation/action/ha-automation-action-row.ts
+++ b/src/panels/config/automation/action/ha-automation-action-row.ts
@@ -11,6 +11,7 @@ import {
mdiStopCircleOutline,
mdiSort,
} from "@mdi/js";
+import { UnsubscribeFunc } from "home-assistant-js-websocket";
import { css, CSSResultGroup, html, LitElement, PropertyValues } from "lit";
import { customElement, property, query, state } from "lit/decorators";
import { classMap } from "lit/directives/class-map";
@@ -26,6 +27,10 @@ import "../../../../components/ha-icon-button";
import type { HaYamlEditor } from "../../../../components/ha-yaml-editor";
import { ACTION_TYPES } from "../../../../data/action";
import { validateConfig } from "../../../../data/config";
+import {
+ EntityRegistryEntry,
+ subscribeEntityRegistry,
+} from "../../../../data/entity_registry";
import { Action, getActionType } from "../../../../data/script";
import { describeAction } from "../../../../data/script_i18n";
import { callExecuteScript } from "../../../../data/service";
@@ -107,6 +112,8 @@ export default class HaAutomationActionRow extends LitElement {
@property({ type: Boolean }) public reOrderMode = false;
+ @state() private _entityReg: EntityRegistryEntry[] = [];
+
@state() private _warnings?: string[];
@state() private _uiModeAvailable = true;
@@ -115,6 +122,14 @@ export default class HaAutomationActionRow extends LitElement {
@query("ha-yaml-editor") private _yamlEditor?: HaYamlEditor;
+ public hassSubscribe(): UnsubscribeFunc[] {
+ return [
+ subscribeEntityRegistry(this.hass.connection!, (entities) => {
+ this._entityReg = entities;
+ }),
+ ];
+ }
+
protected willUpdate(changedProperties: PropertyValues) {
if (!changedProperties.has("action")) {
return;
@@ -156,7 +171,9 @@ export default class HaAutomationActionRow extends LitElement {
class="action-icon"
.path=${ACTION_TYPES[type!]}
>
- ${capitalizeFirstLetter(describeAction(this.hass, this.action))}
+ ${capitalizeFirstLetter(
+ describeAction(this.hass, this._entityReg, this.action)
+ )}
@@ -465,7 +482,7 @@ export default class HaAutomationActionRow extends LitElement {
),
inputType: "string",
placeholder: capitalizeFirstLetter(
- describeAction(this.hass, this.action, undefined, true)
+ describeAction(this.hass, this._entityReg, this.action, undefined, true)
),
defaultValue: this.action.alias,
confirmText: this.hass.localize("ui.common.submit"),
diff --git a/src/panels/config/automation/ha-automation-editor.ts b/src/panels/config/automation/ha-automation-editor.ts
index c32dbdfb94..3000c3ba91 100644
--- a/src/panels/config/automation/ha-automation-editor.ts
+++ b/src/panels/config/automation/ha-automation-editor.ts
@@ -49,6 +49,7 @@ import {
showAutomationEditor,
triggerAutomationActions,
} from "../../../data/automation";
+import { fetchEntityRegistry } from "../../../data/entity_registry";
import {
showAlertDialog,
showConfirmationDialog,
@@ -479,7 +480,8 @@ export class HaAutomationEditor extends KeyboardShortcutMixin(LitElement) {
this._readOnly = false;
this._config = this._normalizeConfig(config);
} catch (err: any) {
- const entity = Object.values(this.hass.entities).find(
+ const entityRegistry = await fetchEntityRegistry(this.hass.connection);
+ const entity = entityRegistry.find(
(ent) =>
ent.platform === "automation" && ent.unique_id === this.automationId
);
diff --git a/src/panels/config/script/ha-config-script.ts b/src/panels/config/script/ha-config-script.ts
index 386b798506..5584075dea 100644
--- a/src/panels/config/script/ha-config-script.ts
+++ b/src/panels/config/script/ha-config-script.ts
@@ -1,14 +1,19 @@
-import { HassEntities } from "home-assistant-js-websocket";
+import { HassEntities, UnsubscribeFunc } from "home-assistant-js-websocket";
import { PropertyValues } from "lit";
-import { customElement, property } from "lit/decorators";
+import { customElement, property, state } from "lit/decorators";
import memoizeOne from "memoize-one";
import { computeStateDomain } from "../../../common/entity/compute_state_domain";
import { debounce } from "../../../common/util/debounce";
+import {
+ EntityRegistryEntry,
+ subscribeEntityRegistry,
+} from "../../../data/entity_registry";
import { ScriptEntity } from "../../../data/script";
import {
HassRouterPage,
RouterOptions,
} from "../../../layouts/hass-router-page";
+import { SubscribeMixin } from "../../../mixins/subscribe-mixin";
import { HomeAssistant } from "../../../types";
import "./ha-script-editor";
import "./ha-script-picker";
@@ -21,7 +26,7 @@ const equal = (a: ScriptEntity[], b: ScriptEntity[]): boolean => {
};
@customElement("ha-config-script")
-class HaConfigScript extends HassRouterPage {
+class HaConfigScript extends SubscribeMixin(HassRouterPage) {
@property({ attribute: false }) public hass!: HomeAssistant;
@property() public narrow!: boolean;
@@ -32,6 +37,16 @@ class HaConfigScript extends HassRouterPage {
@property() public scripts: ScriptEntity[] = [];
+ @state() private _entityReg: EntityRegistryEntry[] = [];
+
+ public hassSubscribe(): UnsubscribeFunc[] {
+ return [
+ subscribeEntityRegistry(this.hass.connection!, (entities) => {
+ this._entityReg = entities;
+ }),
+ ];
+ }
+
protected routerOptions: RouterOptions = {
defaultPage: "dashboard",
routes: {
@@ -78,6 +93,7 @@ class HaConfigScript extends HassRouterPage {
pageEl.isWide = this.isWide;
pageEl.route = this.routeTail;
pageEl.showAdvanced = this.showAdvanced;
+ pageEl.entityRegistry = this._entityReg;
if (this.hass) {
if (!pageEl.scripts || !changedProps) {
diff --git a/src/panels/config/script/ha-script-editor.ts b/src/panels/config/script/ha-script-editor.ts
index 40def1a659..9329a88aa6 100644
--- a/src/panels/config/script/ha-script-editor.ts
+++ b/src/panels/config/script/ha-script-editor.ts
@@ -39,6 +39,7 @@ import "../../../components/ha-icon-button";
import "../../../components/ha-svg-icon";
import "../../../components/ha-yaml-editor";
import type { HaYamlEditor } from "../../../components/ha-yaml-editor";
+import { EntityRegistryEntry } from "../../../data/entity_registry";
import {
deleteScript,
getScriptStateConfig,
@@ -75,6 +76,8 @@ export class HaScriptEditor extends KeyboardShortcutMixin(LitElement) {
@property({ type: Boolean }) public narrow!: boolean;
+ @property({ attribute: false }) public entityRegistry!: EntityRegistryEntry[];
+
@state() private _config?: ScriptConfig;
@state() private _entityId?: string;
@@ -431,7 +434,7 @@ export class HaScriptEditor extends KeyboardShortcutMixin(LitElement) {
this._config = this._normalizeConfig(config);
},
(resp) => {
- const entity = Object.values(this.hass.entities).find(
+ const entity = this.entityRegistry.find(
(ent) =>
ent.platform === "script" && ent.unique_id === this.scriptId
);
@@ -477,7 +480,9 @@ export class HaScriptEditor extends KeyboardShortcutMixin(LitElement) {
getScriptStateConfig(this.hass, this.entityId).then((c) => {
this._config = this._normalizeConfig(c.config);
});
- const regEntry = this.hass.entities[this.entityId];
+ const regEntry = this.entityRegistry.find(
+ (ent) => ent.entity_id === this.entityId
+ );
if (regEntry?.unique_id) {
this.scriptId = regEntry.unique_id;
}
@@ -544,7 +549,7 @@ export class HaScriptEditor extends KeyboardShortcutMixin(LitElement) {
if (!this.scriptId) {
return;
}
- const entity = Object.values(this.hass.entities).find(
+ const entity = this.entityRegistry.find(
(entry) => entry.unique_id === this.scriptId
);
if (!entity) {
diff --git a/src/panels/config/script/ha-script-picker.ts b/src/panels/config/script/ha-script-picker.ts
index 98ee9f9d70..7b8ee39922 100644
--- a/src/panels/config/script/ha-script-picker.ts
+++ b/src/panels/config/script/ha-script-picker.ts
@@ -44,6 +44,7 @@ import { HomeAssistant, Route } from "../../../types";
import { documentationUrl } from "../../../util/documentation-url";
import { showToast } from "../../../util/toast";
import { configSections } from "../ha-panel-config";
+import { EntityRegistryEntry } from "../../../data/entity_registry";
@customElement("ha-script-picker")
class HaScriptPicker extends LitElement {
@@ -57,7 +58,9 @@ class HaScriptPicker extends LitElement {
@property() public route!: Route;
- @property() private _activeFilters?: string[];
+ @property({ attribute: false }) public entityRegistry!: EntityRegistryEntry[];
+
+ @state() private _activeFilters?: string[];
@state() private _filteredScripts?: string[] | null;
@@ -266,7 +269,7 @@ class HaScriptPicker extends LitElement {
}
private _handleRowClicked(ev: HASSDomEvent) {
- const entry = this.hass.entities[ev.detail.id];
+ const entry = this.entityRegistry.find((e) => e.entity_id === ev.detail.id);
if (entry) {
navigate(`/config/script/edit/${entry.unique_id}`);
} else {
@@ -275,7 +278,12 @@ class HaScriptPicker extends LitElement {
}
private _runScript = async (script: any) => {
- const entry = this.hass.entities[script.entity_id];
+ const entry = this.entityRegistry.find(
+ (e) => e.entity_id === script.entity_id
+ );
+ if (!entry) {
+ return;
+ }
await triggerScript(this.hass, entry.unique_id);
showToast(this, {
message: this.hass.localize(
@@ -291,7 +299,9 @@ class HaScriptPicker extends LitElement {
}
private _showTrace(script: any) {
- const entry = this.hass.entities[script.entity_id];
+ const entry = this.entityRegistry.find(
+ (e) => e.entity_id === script.entity_id
+ );
if (entry) {
navigate(`/config/script/trace/${entry.unique_id}`);
}
@@ -317,7 +327,12 @@ class HaScriptPicker extends LitElement {
private async _duplicate(script: any) {
try {
- const entry = this.hass.entities[script.entity_id];
+ const entry = this.entityRegistry.find(
+ (e) => e.entity_id === script.entity_id
+ );
+ if (!entry) {
+ return;
+ }
const config = await fetchScriptFileConfig(this.hass, entry.unique_id);
showScriptEditor({
...config,
@@ -362,8 +377,12 @@ class HaScriptPicker extends LitElement {
private async _delete(script: any) {
try {
- const entry = this.hass.entities[script.entity_id];
- await deleteScript(this.hass, entry.unique_id);
+ const entry = this.entityRegistry.find(
+ (e) => e.entity_id === script.entity_id
+ );
+ if (entry) {
+ await deleteScript(this.hass, entry.unique_id);
+ }
} catch (err: any) {
await showAlertDialog(this, {
text:
diff --git a/src/panels/config/script/ha-script-trace.ts b/src/panels/config/script/ha-script-trace.ts
index a8addf7bd8..c8082dace5 100644
--- a/src/panels/config/script/ha-script-trace.ts
+++ b/src/panels/config/script/ha-script-trace.ts
@@ -39,6 +39,7 @@ import { HomeAssistant, Route } from "../../../types";
import "../../../layouts/hass-subpage";
import "../../../components/ha-button-menu";
import { fireEvent } from "../../../common/dom/fire_event";
+import { EntityRegistryEntry } from "../../../data/entity_registry";
@customElement("ha-script-trace")
export class HaScriptTrace extends LitElement {
@@ -54,6 +55,8 @@ export class HaScriptTrace extends LitElement {
@property({ attribute: false }) public route!: Route;
+ @property({ attribute: false }) public entityRegistry!: EntityRegistryEntry[];
+
@state() private _entityId?: string;
@state() private _traces?: ScriptTrace[];
@@ -318,7 +321,7 @@ export class HaScriptTrace extends LitElement {
const params = new URLSearchParams(location.search);
this._loadTraces(params.get("run_id") || undefined);
- this._entityId = Object.values(this.hass.entities).find(
+ this._entityId = this.entityRegistry.find(
(entry) => entry.unique_id === this.scriptId
)?.entity_id;
}
@@ -335,7 +338,7 @@ export class HaScriptTrace extends LitElement {
if (this.scriptId) {
this._loadTraces();
- this._entityId = Object.values(this.hass.entities).find(
+ this._entityId = this.entityRegistry.find(
(entry) => entry.unique_id === this.scriptId
)?.entity_id;
}
diff --git a/src/panels/lovelace/cards/hui-gauge-card.ts b/src/panels/lovelace/cards/hui-gauge-card.ts
index ec243f8846..975cea74d3 100644
--- a/src/panels/lovelace/cards/hui-gauge-card.ts
+++ b/src/panels/lovelace/cards/hui-gauge-card.ts
@@ -130,7 +130,10 @@ class HuiGaugeCard extends LitElement implements LovelaceCard {
.min=${this._config.min!}
.max=${this._config.max!}
.value=${stateObj.state}
- .formatOptions=${getNumberFormatOptions(stateObj)}
+ .formatOptions=${getNumberFormatOptions(
+ stateObj,
+ this.hass.entities[stateObj.entity_id]
+ )}
.locale=${this.hass!.locale}
.label=${this._config!.unit ||
this.hass?.states[this._config!.entity].attributes
diff --git a/src/panels/lovelace/common/generate-lovelace-config.ts b/src/panels/lovelace/common/generate-lovelace-config.ts
index f1343842c0..759e63ae92 100644
--- a/src/panels/lovelace/common/generate-lovelace-config.ts
+++ b/src/panels/lovelace/common/generate-lovelace-config.ts
@@ -278,8 +278,8 @@ const computeDefaultViewStates = (
.filter(
(entry) =>
entry.entity_category ||
- HIDE_PLATFORM.has(entry.platform) ||
- entry.hidden_by
+ (entry.platform && HIDE_PLATFORM.has(entry.platform)) ||
+ entry.hidden
)
.map((entry) => entry.entity_id)
);
diff --git a/src/state/connection-mixin.ts b/src/state/connection-mixin.ts
index ca44abf7d5..f490f4b3e2 100644
--- a/src/state/connection-mixin.ts
+++ b/src/state/connection-mixin.ts
@@ -14,7 +14,7 @@ import { polyfillsLoaded } from "../common/translations/localize";
import { subscribeAreaRegistry } from "../data/area_registry";
import { broadcastConnectionStatus } from "../data/connection-status";
import { subscribeDeviceRegistry } from "../data/device_registry";
-import { subscribeEntityRegistry } from "../data/entity_registry";
+import { subscribeEntityRegistryDisplay } from "../data/entity_registry";
import { subscribeFrontendUserData } from "../data/frontend";
import { forwardHaptic } from "../data/haptics";
import { DEFAULT_PANEL } from "../data/panel";
@@ -188,10 +188,22 @@ export const connectionMixin = >(
});
subscribeEntities(conn, (states) => this._updateHass({ states }));
- subscribeEntityRegistry(conn, (entityReg) => {
+ subscribeEntityRegistryDisplay(conn, (entityReg) => {
const entities: HomeAssistant["entities"] = {};
- for (const entity of entityReg) {
- entities[entity.entity_id] = entity;
+ for (const entity of entityReg.entities) {
+ entities[entity.ei] = {
+ entity_id: entity.ei,
+ device_id: entity.di,
+ area_id: entity.ai,
+ translation_key: entity.tk,
+ platform: entity.pl,
+ entity_category: entity.ec
+ ? entityReg.entity_categories[entity.ec]
+ : undefined,
+ name: entity.en,
+ hidden: entity.hb,
+ display_precision: entity.dp,
+ };
}
this._updateHass({ entities });
});
diff --git a/src/types.ts b/src/types.ts
index 30f9139310..c0f0823baf 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -10,7 +10,7 @@ import {
import { LocalizeFunc } from "./common/translations/localize";
import { AreaRegistryEntry } from "./data/area_registry";
import { DeviceRegistryEntry } from "./data/device_registry";
-import { EntityRegistryEntry } from "./data/entity_registry";
+import { EntityRegistryDisplayEntry } from "./data/entity_registry";
import { CoreFrontendUserData } from "./data/frontend";
import { FrontendLocaleData, getHassTranslations } from "./data/translation";
import { Themes } from "./data/ws-themes";
@@ -189,7 +189,7 @@ export interface HomeAssistant {
connection: Connection;
connected: boolean;
states: HassEntities;
- entities: { [id: string]: EntityRegistryEntry };
+ entities: { [id: string]: EntityRegistryDisplayEntry };
devices: { [id: string]: DeviceRegistryEntry };
areas: { [id: string]: AreaRegistryEntry };
services: HassServices;