diff --git a/homeassistant/helpers/entity.py b/homeassistant/helpers/entity.py index 2b5604832d5..21a704f63be 100644 --- a/homeassistant/helpers/entity.py +++ b/homeassistant/helpers/entity.py @@ -230,6 +230,7 @@ class EntityDescription: device_class: str | None = None entity_category: EntityCategory | None = None entity_registry_enabled_default: bool = True + entity_registry_visible_default: bool = False force_update: bool = False icon: str | None = None name: str | None = None @@ -293,6 +294,7 @@ class Entity(ABC): _attr_entity_category: EntityCategory | None _attr_entity_picture: str | None = None _attr_entity_registry_enabled_default: bool + _attr_entity_registry_visible_default: bool _attr_extra_state_attributes: MutableMapping[str, Any] _attr_force_update: bool _attr_icon: str | None @@ -452,6 +454,15 @@ class Entity(ABC): return self.entity_description.entity_registry_enabled_default return True + @property + def entity_registry_visible_default(self) -> bool: + """Return if the entity should be visible when first added to the entity registry.""" + if hasattr(self, "_attr_entity_registry_visible_default"): + return self._attr_entity_registry_visible_default + if hasattr(self, "entity_description"): + return self.entity_description.entity_registry_visible_default + return True + @property def attribution(self) -> str | None: """Return the attribution.""" diff --git a/homeassistant/helpers/entity_platform.py b/homeassistant/helpers/entity_platform.py index eaf0ae6d6bb..65cfe706f14 100644 --- a/homeassistant/helpers/entity_platform.py +++ b/homeassistant/helpers/entity_platform.py @@ -42,7 +42,7 @@ from . import ( service, ) from .device_registry import DeviceRegistry -from .entity_registry import EntityRegistry, RegistryEntryDisabler +from .entity_registry import EntityRegistry, RegistryEntryDisabler, RegistryEntryHider from .event import async_call_later, async_track_time_interval from .typing import ConfigType, DiscoveryInfoType @@ -507,6 +507,10 @@ class EntityPlatform: if not entity.entity_registry_enabled_default: disabled_by = RegistryEntryDisabler.INTEGRATION + hidden_by: RegistryEntryHider | None = None + if not entity.entity_registry_visible_default: + hidden_by = RegistryEntryHider.INTEGRATION + entry = entity_registry.async_get_or_create( self.domain, self.platform_name, @@ -515,6 +519,7 @@ class EntityPlatform: config_entry=self.config_entry, device_id=device_id, disabled_by=disabled_by, + hidden_by=hidden_by, entity_category=entity.entity_category, known_object_ids=self.entities.keys(), original_device_class=entity.device_class, diff --git a/tests/common.py b/tests/common.py index baa8f1c2341..6a3bf3bb89a 100644 --- a/tests/common.py +++ b/tests/common.py @@ -1028,6 +1028,11 @@ class MockEntity(entity.Entity): """Return if the entity should be enabled when first added to the entity registry.""" return self._handle("entity_registry_enabled_default") + @property + def entity_registry_visible_default(self): + """Return if the entity should be visible when first added to the entity registry.""" + return self._handle("entity_registry_visible_default") + @property def icon(self): """Return the suggested icon.""" diff --git a/tests/helpers/test_entity_platform.py b/tests/helpers/test_entity_platform.py index ff29897bb12..3f18d565e83 100644 --- a/tests/helpers/test_entity_platform.py +++ b/tests/helpers/test_entity_platform.py @@ -1148,6 +1148,25 @@ async def test_entity_disabled_by_device(hass: HomeAssistant): assert entry_disabled.disabled_by is er.RegistryEntryDisabler.DEVICE +async def test_entity_hidden_by_integration(hass): + """Test entity hidden by integration.""" + component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20)) + + entity_default = MockEntity(unique_id="default") + entity_hidden = MockEntity( + unique_id="hidden", entity_registry_visible_default=False + ) + + await component.async_add_entities([entity_default, entity_hidden]) + + registry = er.async_get(hass) + + entry_default = registry.async_get_or_create(DOMAIN, DOMAIN, "default") + assert entry_default.hidden_by is None + entry_hidden = registry.async_get_or_create(DOMAIN, DOMAIN, "hidden") + assert entry_hidden.hidden_by is er.RegistryEntryHider.INTEGRATION + + async def test_entity_info_added_to_entity_registry(hass): """Test entity info is written to entity registry.""" component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20))