From 4c65c92fb0e25a7877fa73ba7010623b1e54d597 Mon Sep 17 00:00:00 2001
From: Jan Bouwhuis <jbouwh@users.noreply.github.com>
Date: Fri, 22 Sep 2023 13:41:31 +0200
Subject: [PATCH] Use shorthand attrs for MQTT cover (#100710)

* User shorthand attrs for MQTT cover

* Cleanup constructor

* Cleanup constructor
---
 homeassistant/components/mqtt/cover.py | 118 ++++++++-----------------
 1 file changed, 38 insertions(+), 80 deletions(-)

diff --git a/homeassistant/components/mqtt/cover.py b/homeassistant/components/mqtt/cover.py
index 3044e2d6396..7423094d209 100644
--- a/homeassistant/components/mqtt/cover.py
+++ b/homeassistant/components/mqtt/cover.py
@@ -235,26 +235,12 @@ async def _async_setup_entity(
 class MqttCover(MqttEntity, CoverEntity):
     """Representation of a cover that can be controlled using MQTT."""
 
+    _attr_is_closed: bool | None = None
+    _attributes_extra_blocked: frozenset[str] = MQTT_COVER_ATTRIBUTES_BLOCKED
     _default_name = DEFAULT_NAME
     _entity_id_format: str = cover.ENTITY_ID_FORMAT
-    _attributes_extra_blocked: frozenset[str] = MQTT_COVER_ATTRIBUTES_BLOCKED
-
-    def __init__(
-        self,
-        hass: HomeAssistant,
-        config: ConfigType,
-        config_entry: ConfigEntry,
-        discovery_data: DiscoveryInfoType | None,
-    ) -> None:
-        """Initialize the cover."""
-        self._position: int | None = None
-        self._state: str | None = None
-
-        self._optimistic: bool | None = None
-        self._tilt_value: int | None = None
-        self._tilt_optimistic: bool | None = None
-
-        MqttEntity.__init__(self, hass, config, config_entry, discovery_data)
+    _optimistic: bool
+    _tilt_optimistic: bool
 
     @staticmethod
     def config_schema() -> vol.Schema:
@@ -287,21 +273,17 @@ class MqttCover(MqttEntity, CoverEntity):
             and config.get(CONF_TILT_STATUS_TOPIC) is None
         )
 
-        if config[CONF_OPTIMISTIC] or (
+        self._optimistic = config[CONF_OPTIMISTIC] or (
             (no_position or optimistic_position)
             and (no_state or optimistic_state)
             and (no_tilt or optimistic_tilt)
-        ):
-            # Force into optimistic mode.
-            self._optimistic = True
-        self._attr_assumed_state = bool(self._optimistic)
+        )
+        self._attr_assumed_state = self._optimistic
 
-        if (
+        self._tilt_optimistic = (
             config[CONF_TILT_STATE_OPTIMISTIC]
             or config.get(CONF_TILT_STATUS_TOPIC) is None
-        ):
-            # Force into optimistic tilt mode.
-            self._tilt_optimistic = True
+        )
 
         template_config_attributes = {
             "position_open": self._config[CONF_POSITION_OPEN],
@@ -354,6 +336,13 @@ class MqttCover(MqttEntity, CoverEntity):
 
         self._attr_supported_features = supported_features
 
+    @callback
+    def _update_state(self, state: str) -> None:
+        """Update the cover state."""
+        self._attr_is_closed = state == STATE_CLOSED
+        self._attr_is_opening = state == STATE_OPENING
+        self._attr_is_closing = state == STATE_CLOSING
+
     def _prepare_subscribe_topics(self) -> None:
         """(Re)Subscribe to topics."""
         topics = {}
@@ -380,25 +369,24 @@ class MqttCover(MqttEntity, CoverEntity):
                 _LOGGER.debug("Ignoring empty state message from '%s'", msg.topic)
                 return
 
+            state: str
             if payload == self._config[CONF_STATE_STOPPED]:
                 if self._config.get(CONF_GET_POSITION_TOPIC) is not None:
-                    self._state = (
+                    state = (
                         STATE_CLOSED
-                        if self._position == DEFAULT_POSITION_CLOSED
+                        if self._attr_current_cover_position == DEFAULT_POSITION_CLOSED
                         else STATE_OPEN
                     )
                 else:
-                    self._state = (
-                        STATE_CLOSED if self._state == STATE_CLOSING else STATE_OPEN
-                    )
+                    state = STATE_CLOSED if self.state == STATE_CLOSING else STATE_OPEN
             elif payload == self._config[CONF_STATE_OPENING]:
-                self._state = STATE_OPENING
+                state = STATE_OPENING
             elif payload == self._config[CONF_STATE_CLOSING]:
-                self._state = STATE_CLOSING
+                state = STATE_CLOSING
             elif payload == self._config[CONF_STATE_OPEN]:
-                self._state = STATE_OPEN
+                state = STATE_OPEN
             elif payload == self._config[CONF_STATE_CLOSED]:
-                self._state = STATE_CLOSED
+                state = STATE_CLOSED
             else:
                 _LOGGER.warning(
                     (
@@ -408,6 +396,7 @@ class MqttCover(MqttEntity, CoverEntity):
                     payload,
                 )
                 return
+            self._update_state(state)
 
             get_mqtt_data(self.hass).state_write_requests.write_state_request(self)
 
@@ -447,9 +436,9 @@ class MqttCover(MqttEntity, CoverEntity):
                 _LOGGER.warning("Payload '%s' is not numeric", payload)
                 return
 
-            self._position = percentage_payload
+            self._attr_current_cover_position = percentage_payload
             if self._config.get(CONF_STATE_TOPIC) is None:
-                self._state = (
+                self._update_state(
                     STATE_CLOSED
                     if percentage_payload == DEFAULT_POSITION_CLOSED
                     else STATE_OPEN
@@ -489,37 +478,6 @@ class MqttCover(MqttEntity, CoverEntity):
         """(Re)Subscribe to topics."""
         await subscription.async_subscribe_topics(self.hass, self._sub_state)
 
-    @property
-    def is_closed(self) -> bool | None:
-        """Return true if the cover is closed or None if the status is unknown."""
-        if self._state is None:
-            return None
-
-        return self._state == STATE_CLOSED
-
-    @property
-    def is_opening(self) -> bool:
-        """Return true if the cover is actively opening."""
-        return self._state == STATE_OPENING
-
-    @property
-    def is_closing(self) -> bool:
-        """Return true if the cover is actively closing."""
-        return self._state == STATE_CLOSING
-
-    @property
-    def current_cover_position(self) -> int | None:
-        """Return current position of cover.
-
-        None is unknown, 0 is closed, 100 is fully open.
-        """
-        return self._position
-
-    @property
-    def current_cover_tilt_position(self) -> int | None:
-        """Return current position of cover tilt."""
-        return self._tilt_value
-
     async def async_open_cover(self, **kwargs: Any) -> None:
         """Move the cover up.
 
@@ -534,9 +492,9 @@ class MqttCover(MqttEntity, CoverEntity):
         )
         if self._optimistic:
             # Optimistically assume that cover has changed state.
-            self._state = STATE_OPEN
+            self._update_state(STATE_OPEN)
             if self._config.get(CONF_GET_POSITION_TOPIC):
-                self._position = self.find_percentage_in_range(
+                self._attr_current_cover_position = self.find_percentage_in_range(
                     self._config[CONF_POSITION_OPEN], COVER_PAYLOAD
                 )
             self.async_write_ha_state()
@@ -555,9 +513,9 @@ class MqttCover(MqttEntity, CoverEntity):
         )
         if self._optimistic:
             # Optimistically assume that cover has changed state.
-            self._state = STATE_CLOSED
+            self._update_state(STATE_CLOSED)
             if self._config.get(CONF_GET_POSITION_TOPIC):
-                self._position = self.find_percentage_in_range(
+                self._attr_current_cover_position = self.find_percentage_in_range(
                     self._config[CONF_POSITION_CLOSED], COVER_PAYLOAD
                 )
             self.async_write_ha_state()
@@ -595,7 +553,7 @@ class MqttCover(MqttEntity, CoverEntity):
             self._config[CONF_ENCODING],
         )
         if self._tilt_optimistic:
-            self._tilt_value = self.find_percentage_in_range(
+            self._attr_current_cover_tilt_position = self.find_percentage_in_range(
                 float(self._config[CONF_TILT_OPEN_POSITION])
             )
             self.async_write_ha_state()
@@ -622,7 +580,7 @@ class MqttCover(MqttEntity, CoverEntity):
             self._config[CONF_ENCODING],
         )
         if self._tilt_optimistic:
-            self._tilt_value = self.find_percentage_in_range(
+            self._attr_current_cover_tilt_position = self.find_percentage_in_range(
                 float(self._config[CONF_TILT_CLOSED_POSITION])
             )
             self.async_write_ha_state()
@@ -653,7 +611,7 @@ class MqttCover(MqttEntity, CoverEntity):
         )
         if self._tilt_optimistic:
             _LOGGER.debug("Set tilt value optimistic")
-            self._tilt_value = percentage_tilt
+            self._attr_current_cover_tilt_position = percentage_tilt
             self.async_write_ha_state()
 
     async def async_set_cover_position(self, **kwargs: Any) -> None:
@@ -679,12 +637,12 @@ class MqttCover(MqttEntity, CoverEntity):
             self._config[CONF_ENCODING],
         )
         if self._optimistic:
-            self._state = (
+            self._update_state(
                 STATE_CLOSED
                 if percentage_position == self._config[CONF_POSITION_CLOSED]
                 else STATE_OPEN
             )
-            self._position = percentage_position
+            self._attr_current_cover_position = percentage_position
             self.async_write_ha_state()
 
     async def async_toggle_tilt(self, **kwargs: Any) -> None:
@@ -696,7 +654,7 @@ class MqttCover(MqttEntity, CoverEntity):
 
     def is_tilt_closed(self) -> bool:
         """Return if the cover is tilted closed."""
-        return self._tilt_value == self.find_percentage_in_range(
+        return self._attr_current_cover_tilt_position == self.find_percentage_in_range(
             float(self._config[CONF_TILT_CLOSED_POSITION])
         )
 
@@ -762,7 +720,7 @@ class MqttCover(MqttEntity, CoverEntity):
             <= self._config[CONF_TILT_MIN]
         ):
             level = self.find_percentage_in_range(payload)
-            self._tilt_value = level
+            self._attr_current_cover_tilt_position = level
             get_mqtt_data(self.hass).state_write_requests.write_state_request(self)
         else:
             _LOGGER.warning(
-- 
GitLab