From 7b2aa3a369d18139c357c4606e2e8153a2e949b8 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 14 Oct 2023 08:40:16 -1000 Subject: [PATCH] Improve performance of config/entity_registry/get* calls (#101984) --- .../components/config/entity_registry.py | 18 +++--------------- homeassistant/helpers/entity_registry.py | 14 +++++++++++++- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/config/entity_registry.py b/homeassistant/components/config/entity_registry.py index 20e00ec11ed..a0e0d1877fa 100644 --- a/homeassistant/components/config/entity_registry.py +++ b/homeassistant/components/config/entity_registry.py @@ -112,7 +112,7 @@ def websocket_get_entity( return connection.send_message( - websocket_api.result_message(msg["id"], _entry_ext_dict(entry)) + websocket_api.result_message(msg["id"], entry.extended_dict) ) @@ -138,7 +138,7 @@ def websocket_get_entities( entries: dict[str, dict[str, Any] | None] = {} for entity_id in entity_ids: entry = registry.entities.get(entity_id) - entries[entity_id] = _entry_ext_dict(entry) if entry else None + entries[entity_id] = entry.extended_dict if entry else None connection.send_message(websocket_api.result_message(msg["id"], entries)) @@ -248,7 +248,7 @@ def websocket_update_entity( ) return - result: dict[str, Any] = {"entity_entry": _entry_ext_dict(entity_entry)} + result: dict[str, Any] = {"entity_entry": entity_entry.extended_dict} if "disabled_by" in changes and changes["disabled_by"] is None: # Enabling an entity requires a config entry reload, or HA restart if ( @@ -289,15 +289,3 @@ def websocket_remove_entity( registry.async_remove(msg["entity_id"]) connection.send_message(websocket_api.result_message(msg["id"])) - - -@callback -def _entry_ext_dict(entry: er.RegistryEntry) -> dict[str, Any]: - """Convert entry to API format.""" - data = entry.as_partial_dict - data["aliases"] = entry.aliases - data["capabilities"] = entry.capabilities - data["device_class"] = entry.device_class - data["original_device_class"] = entry.original_device_class - data["original_icon"] = entry.original_icon - return data diff --git a/homeassistant/helpers/entity_registry.py b/homeassistant/helpers/entity_registry.py index bd3077c1d59..a5e27280a5b 100644 --- a/homeassistant/helpers/entity_registry.py +++ b/homeassistant/helpers/entity_registry.py @@ -246,7 +246,7 @@ class RegistryEntry: return None - @property + @cached_property def as_partial_dict(self) -> dict[str, Any]: """Return a partial dict representation of the entry.""" return { @@ -268,6 +268,18 @@ class RegistryEntry: "unique_id": self.unique_id, } + @cached_property + def extended_dict(self) -> dict[str, Any]: + """Return a extended dict representation of the entry.""" + return { + **self.as_partial_dict, + "aliases": self.aliases, + "capabilities": self.capabilities, + "device_class": self.device_class, + "original_device_class": self.original_device_class, + "original_icon": self.original_icon, + } + @cached_property def partial_json_repr(self) -> str | None: """Return a cached partial JSON representation of the entry."""