From d51fc5814ae5dc5fd8096691ae258a6c27ed4980 Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Wed, 2 Jun 2021 08:53:55 +0200 Subject: [PATCH] Define ToggleEntity entity attributes as class variables (#51231) * Define ToggleEntity entity attributes as class variables * Fix upcloud overriding state property * Implement available state for upcloud, to compensate removed state --- homeassistant/components/upcloud/__init__.py | 20 +++++++++++--------- homeassistant/helpers/entity.py | 8 ++++++-- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/upcloud/__init__.py b/homeassistant/components/upcloud/__init__.py index 925d41a3252..636fa7a2b8a 100644 --- a/homeassistant/components/upcloud/__init__.py +++ b/homeassistant/components/upcloud/__init__.py @@ -273,18 +273,20 @@ class UpCloudServerEntity(CoordinatorEntity): """Return the icon of this server.""" return "mdi:server" if self.is_on else "mdi:server-off" - @property - def state(self) -> str | None: - """Return state of the server.""" - try: - return STATE_MAP.get(self._server.state, self._server.state) - except AttributeError: - return None - @property def is_on(self) -> bool: """Return true if the server is on.""" - return self.state == STATE_ON + try: + return STATE_MAP.get(self._server.state, self._server.state) == STATE_ON + except AttributeError: + return False + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return super().available and STATE_MAP.get( + self._server.state, self._server.state + ) in [STATE_ON, STATE_OFF] @property def extra_state_attributes(self) -> dict[str, Any]: diff --git a/homeassistant/helpers/entity.py b/homeassistant/helpers/entity.py index 724280b19c9..4afab38fabf 100644 --- a/homeassistant/helpers/entity.py +++ b/homeassistant/helpers/entity.py @@ -10,7 +10,7 @@ import logging import math import sys from timeit import default_timer as timer -from typing import Any, TypedDict +from typing import Any, TypedDict, final from homeassistant.config import DATA_CUSTOMIZE from homeassistant.const import ( @@ -766,7 +766,11 @@ class Entity(ABC): class ToggleEntity(Entity): """An abstract class for entities that can be turned on and off.""" + _attr_is_on: bool + _attr_state: None = None + @property + @final def state(self) -> str | None: """Return the state.""" return STATE_ON if self.is_on else STATE_OFF @@ -774,7 +778,7 @@ class ToggleEntity(Entity): @property def is_on(self) -> bool: """Return True if entity is on.""" - raise NotImplementedError() + return self._attr_is_on def turn_on(self, **kwargs: Any) -> None: """Turn the entity on."""