From 567a179084e0226a45d1db01ffb5d4e2e37f3d8c Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 9 Feb 2024 20:43:46 -0600 Subject: [PATCH] Simplify emulated_hue exposed entities cache (#109890) Also avoids holding stale States in memory which can prevent garbage collection of linked contexts --- .../components/emulated_hue/config.py | 18 +++++++++--------- .../components/emulated_hue/hue_api.py | 17 +++++------------ 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/homeassistant/components/emulated_hue/config.py b/homeassistant/components/emulated_hue/config.py index 069fc3177d6..2be89e7214c 100644 --- a/homeassistant/components/emulated_hue/config.py +++ b/homeassistant/components/emulated_hue/config.py @@ -207,25 +207,25 @@ class Config: return state.attributes.get(ATTR_EMULATED_HUE_NAME, state.name) # type: ignore[no-any-return] @cache # pylint: disable=method-cache-max-size-none - def get_exposed_states(self) -> list[State]: + def get_exposed_entity_ids(self) -> list[str]: """Return a list of exposed states.""" state_machine = self.hass.states if self.expose_by_default: return [ - state + state.entity_id for state in state_machine.async_all() if self.is_state_exposed(state) ] - states: list[State] = [] - for entity_id in self.entities: - if (state := state_machine.get(entity_id)) and self.is_state_exposed(state): - states.append(state) - return states + return [ + entity_id + for entity_id in self.entities + if (state := state_machine.get(entity_id)) and self.is_state_exposed(state) + ] @callback def _clear_exposed_cache(self, event: EventType[EventStateChangedData]) -> None: - """Clear the cache of exposed states.""" - self.get_exposed_states.cache_clear() + """Clear the cache of exposed entity ids.""" + self.get_exposed_entity_ids.cache_clear() def is_state_exposed(self, state: State) -> bool: """Cache determine if an entity should be exposed on the emulated bridge.""" diff --git a/homeassistant/components/emulated_hue/hue_api.py b/homeassistant/components/emulated_hue/hue_api.py index 5da2fcab967..5e2937cae40 100644 --- a/homeassistant/components/emulated_hue/hue_api.py +++ b/homeassistant/components/emulated_hue/hue_api.py @@ -890,18 +890,11 @@ def create_config_model(config: Config, request: web.Request) -> dict[str, Any]: def create_list_of_entities(config: Config, request: web.Request) -> dict[str, Any]: """Create a list of all entities.""" hass: core.HomeAssistant = request.app["hass"] - - json_response: dict[str, Any] = {} - for cached_state in config.get_exposed_states(): - entity_id = cached_state.entity_id - state = hass.states.get(entity_id) - assert state is not None - - json_response[config.entity_id_to_number(entity_id)] = state_to_json( - config, state - ) - - return json_response + return { + config.entity_id_to_number(entity_id): state_to_json(config, state) + for entity_id in config.get_exposed_entity_ids() + if (state := hass.states.get(entity_id)) + } def hue_brightness_to_hass(value: int) -> int: