Add Entity.has_entity_name attribute (#73217)

This commit is contained in:
Erik Montnemery 2022-06-28 18:38:05 +02:00 committed by GitHub
parent c883aec711
commit 26a85c6644
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 186 additions and 18 deletions

View file

@ -38,7 +38,7 @@ from homeassistant.exceptions import HomeAssistantError, NoEntitySpecifiedError
from homeassistant.loader import bind_hass
from homeassistant.util import dt as dt_util, ensure_unique_string, slugify
from . import entity_registry as er
from . import device_registry as dr, entity_registry as er
from .device_registry import DeviceEntryType
from .entity_platform import EntityPlatform
from .event import async_track_entity_registry_updated_event
@ -221,6 +221,7 @@ class EntityDescription:
entity_registry_visible_default: bool = True
force_update: bool = False
icon: str | None = None
has_entity_name: bool = False
name: str | None = None
unit_of_measurement: str | None = None
@ -277,6 +278,7 @@ class Entity(ABC):
_attr_device_class: str | None
_attr_device_info: DeviceInfo | None = None
_attr_entity_category: EntityCategory | None
_attr_has_entity_name: bool
_attr_entity_picture: str | None = None
_attr_entity_registry_enabled_default: bool
_attr_entity_registry_visible_default: bool
@ -303,6 +305,15 @@ class Entity(ABC):
"""Return a unique ID."""
return self._attr_unique_id
@property
def has_entity_name(self) -> bool:
"""Return if the name of the entity is describing only the entity itself."""
if hasattr(self, "_attr_has_entity_name"):
return self._attr_has_entity_name
if hasattr(self, "entity_description"):
return self.entity_description.has_entity_name
return False
@property
def name(self) -> str | None:
"""Return the name of the entity."""
@ -583,7 +594,26 @@ class Entity(ABC):
if (icon := (entry and entry.icon) or self.icon) is not None:
attr[ATTR_ICON] = icon
if (name := (entry and entry.name) or self.name) is not None:
def friendly_name() -> str | None:
"""Return the friendly name.
If has_entity_name is False, this returns self.name
If has_entity_name is True, this returns device.name + self.name
"""
if not self.has_entity_name or not self.registry_entry:
return self.name
device_registry = dr.async_get(self.hass)
if not (device_id := self.registry_entry.device_id) or not (
device_entry := device_registry.async_get(device_id)
):
return self.name
if not self.name:
return device_entry.name_by_user or device_entry.name
return f"{device_entry.name_by_user or device_entry.name} {self.name}"
if (name := (entry and entry.name) or friendly_name()) is not None:
attr[ATTR_FRIENDLY_NAME] = name
if (supported_features := self.supported_features) is not None: