diff --git a/homeassistant/components/emulated_hue/__init__.py b/homeassistant/components/emulated_hue/__init__.py index 5dbd52d09b1632e93cf504ace7913e7570a1826d..9b4da5cfb21a727b582a68e2cb10997bde90d7bc 100644 --- a/homeassistant/components/emulated_hue/__init__.py +++ b/homeassistant/components/emulated_hue/__init__.py @@ -174,6 +174,7 @@ class Config: self.type = conf.get(CONF_TYPE) self.numbers = None self.cached_states = {} + self._exposed_cache = {} if self.type == TYPE_ALEXA: _LOGGER.warning( @@ -279,6 +280,24 @@ class Config: return entity.attributes.get(ATTR_EMULATED_HUE_NAME, entity.name) def is_entity_exposed(self, entity): + """Cache determine if an entity should be exposed on the emulated bridge.""" + entity_id = entity.entity_id + if entity_id not in self._exposed_cache: + self._exposed_cache[entity_id] = self._is_entity_exposed(entity) + return self._exposed_cache[entity_id] + + def filter_exposed_entities(self, states): + """Filter a list of all states down to exposed entities.""" + exposed = [] + for entity in states: + entity_id = entity.entity_id + if entity_id not in self._exposed_cache: + self._exposed_cache[entity_id] = self._is_entity_exposed(entity) + if self._exposed_cache[entity_id]: + exposed.append(entity) + return exposed + + def _is_entity_exposed(self, entity): """Determine if an entity should be exposed on the emulated bridge. Async friendly. diff --git a/homeassistant/components/emulated_hue/hue_api.py b/homeassistant/components/emulated_hue/hue_api.py index 15d3f323092e4f9ff2b85fd53ec7d8a83b860e45..c30af5e1cc70d5ff5afea6937bdea0780f896551 100644 --- a/homeassistant/components/emulated_hue/hue_api.py +++ b/homeassistant/components/emulated_hue/hue_api.py @@ -759,10 +759,9 @@ def create_list_of_entities(config, request): hass = request.app["hass"] json_response = {} - for entity in hass.states.async_all(): - if config.is_entity_exposed(entity): - number = config.entity_id_to_number(entity.entity_id) - json_response[number] = entity_to_json(config, entity) + for entity in config.filter_exposed_entities(hass.states.async_all()): + number = config.entity_id_to_number(entity.entity_id) + json_response[number] = entity_to_json(config, entity) return json_response diff --git a/tests/components/emulated_hue/test_hue_api.py b/tests/components/emulated_hue/test_hue_api.py index fa97cd2f417d9d9d04dfd0090a007dad6f20d385..efda09d54cea8c77d0b7b928757fed652e4d5309 100644 --- a/tests/components/emulated_hue/test_hue_api.py +++ b/tests/components/emulated_hue/test_hue_api.py @@ -181,6 +181,8 @@ def hue_client(loop, hass_hue, aiohttp_client): "climate.hvac": {emulated_hue.CONF_ENTITY_HIDDEN: False}, # Expose HeatPump "climate.heatpump": {emulated_hue.CONF_ENTITY_HIDDEN: False}, + # No expose setting (use default of not exposed) + "climate.nosetting": {}, }, }, )