diff --git a/homeassistant/components/text/__init__.py b/homeassistant/components/text/__init__.py index 8e20fdd33afd92..89fad759f8b536 100644 --- a/homeassistant/components/text/__init__.py +++ b/homeassistant/components/text/__init__.py @@ -6,7 +6,7 @@ from enum import StrEnum import logging import re -from typing import Any, final +from typing import TYPE_CHECKING, Any, final import voluptuous as vol @@ -33,6 +33,11 @@ SERVICE_SET_VALUE, ) +if TYPE_CHECKING: + from functools import cached_property +else: + from homeassistant.backports.functools import cached_property + SCAN_INTERVAL = timedelta(seconds=30) ENTITY_ID_FORMAT = DOMAIN + ".{}" @@ -107,7 +112,16 @@ class TextEntityDescription(EntityDescription, frozen_or_thawed=True): pattern: str | None = None -class TextEntity(Entity): +CACHED_PROPERTIES_WITH_ATTR_ = { + "mode", + "native_value", + "native_min", + "native_max", + "pattern", +} + + +class TextEntity(Entity, cached_properties=CACHED_PROPERTIES_WITH_ATTR_): """Representation of a Text entity.""" _entity_component_unrecorded_attributes = frozenset( @@ -156,7 +170,7 @@ def state(self) -> str | None: ) return self.native_value - @property + @cached_property def mode(self) -> TextMode: """Return the mode of the entity.""" if hasattr(self, "_attr_mode"): @@ -165,7 +179,7 @@ def mode(self) -> TextMode: return self.entity_description.mode return TextMode.TEXT - @property + @cached_property def native_min(self) -> int: """Return the minimum length of the value.""" if hasattr(self, "_attr_native_min"): @@ -180,7 +194,7 @@ def min(self) -> int: """Return the minimum length of the value.""" return max(self.native_min, 0) - @property + @cached_property def native_max(self) -> int: """Return the maximum length of the value.""" if hasattr(self, "_attr_native_max"): @@ -206,7 +220,7 @@ def pattern_cmp(self) -> re.Pattern | None: self.__pattern_cmp = re.compile(self.pattern) return self.__pattern_cmp - @property + @cached_property def pattern(self) -> str | None: """Return the regex pattern that the value must match.""" if hasattr(self, "_attr_pattern"): @@ -215,7 +229,7 @@ def pattern(self) -> str | None: return self.entity_description.pattern return None - @property + @cached_property def native_value(self) -> str | None: """Return the value reported by the text.""" return self._attr_native_value