From 17fadbcf4a11e10747182146aa33e8d90dffd764 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 29 May 2023 13:39:34 -0500 Subject: [PATCH] Reduce overhead to update unifiprotect entity (#93725) --- .../components/unifiprotect/entity.py | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/homeassistant/components/unifiprotect/entity.py b/homeassistant/components/unifiprotect/entity.py index 134b55c4b0d..e123a4bf1bc 100644 --- a/homeassistant/components/unifiprotect/entity.py +++ b/homeassistant/components/unifiprotect/entity.py @@ -1,7 +1,7 @@ """Shared Entity definition for UniFi Protect Integration.""" from __future__ import annotations -from collections.abc import Sequence +from collections.abc import Callable, Sequence import logging from typing import Any @@ -191,6 +191,9 @@ class ProtectDeviceEntity(Entity): super().__init__() self.data: ProtectData = data self.device = device + self._async_get_ufp_enabled: Callable[ + [ProtectAdoptableDeviceModel], bool + ] | None = None if description is None: self._attr_unique_id = f"{self.device.mac}" @@ -200,6 +203,8 @@ class ProtectDeviceEntity(Entity): self._attr_unique_id = f"{self.device.mac}_{description.key}" name = description.name or "" self._attr_name = f"{self.device.display_name} {name.title()}" + if isinstance(description, ProtectRequiredKeysMixin): + self._async_get_ufp_enabled = description.get_ufp_enabled self._attr_attribution = DEFAULT_ATTRIBUTION self._async_set_device_info() @@ -227,24 +232,20 @@ class ProtectDeviceEntity(Entity): @callback def _async_update_device_from_protect(self, device: ProtectModelWithId) -> None: """Update Entity object from Protect device.""" - if self.data.last_update_success: - assert isinstance(device, ProtectAdoptableDeviceModel) + assert isinstance(device, ProtectAdoptableDeviceModel) + + if last_update_success := self.data.last_update_success: self.device = device - is_connected = self.data.last_update_success and ( - self.device.state == StateType.CONNECTED - or (not self.device.is_adopted_by_us and self.device.can_adopt) - ) - if ( - hasattr(self, "entity_description") - and self.entity_description is not None - and hasattr(self.entity_description, "get_ufp_enabled") - ): - assert isinstance(self.entity_description, ProtectRequiredKeysMixin) - is_connected = is_connected and self.entity_description.get_ufp_enabled( - self.device + async_get_ufp_enabled = self._async_get_ufp_enabled + self._attr_available = ( + last_update_success + and ( + device.state == StateType.CONNECTED + or (not device.is_adopted_by_us and device.can_adopt) ) - self._attr_available = is_connected + and (not async_get_ufp_enabled or async_get_ufp_enabled(device)) + ) @callback def _async_updated_event(self, device: ProtectModelWithId) -> None: