From 4a3d047dffa9bbb49ddeb4038f3592e96183ccf1 Mon Sep 17 00:00:00 2001
From: Robert Svensson <Kane610@users.noreply.github.com>
Date: Thu, 14 Jul 2022 23:53:09 +0200
Subject: [PATCH] Use pydeconz interface controls for fans (#75156)

---
 homeassistant/components/deconz/fan.py        | 67 ++++++++++---------
 homeassistant/components/deconz/light.py      |  8 +--
 homeassistant/components/deconz/manifest.json |  2 +-
 requirements_all.txt                          |  2 +-
 requirements_test_all.txt                     |  2 +-
 5 files changed, 39 insertions(+), 42 deletions(-)

diff --git a/homeassistant/components/deconz/fan.py b/homeassistant/components/deconz/fan.py
index ab9a1ba6f4a..6002e61d326 100644
--- a/homeassistant/components/deconz/fan.py
+++ b/homeassistant/components/deconz/fan.py
@@ -1,17 +1,10 @@
 """Support for deCONZ fans."""
 from __future__ import annotations
 
-from typing import Any, Literal
+from typing import Any
 
 from pydeconz.models.event import EventType
-from pydeconz.models.light.fan import (
-    FAN_SPEED_25_PERCENT,
-    FAN_SPEED_50_PERCENT,
-    FAN_SPEED_75_PERCENT,
-    FAN_SPEED_100_PERCENT,
-    FAN_SPEED_OFF,
-    Fan,
-)
+from pydeconz.models.light.light import Light, LightFanSpeed
 
 from homeassistant.components.fan import DOMAIN, FanEntity, FanEntityFeature
 from homeassistant.config_entries import ConfigEntry
@@ -25,11 +18,11 @@ from homeassistant.util.percentage import (
 from .deconz_device import DeconzDevice
 from .gateway import DeconzGateway, get_gateway_from_config_entry
 
-ORDERED_NAMED_FAN_SPEEDS: list[Literal[0, 1, 2, 3, 4, 5, 6]] = [
-    FAN_SPEED_25_PERCENT,
-    FAN_SPEED_50_PERCENT,
-    FAN_SPEED_75_PERCENT,
-    FAN_SPEED_100_PERCENT,
+ORDERED_NAMED_FAN_SPEEDS: list[LightFanSpeed] = [
+    LightFanSpeed.PERCENT_25,
+    LightFanSpeed.PERCENT_50,
+    LightFanSpeed.PERCENT_75,
+    LightFanSpeed.PERCENT_100,
 ]
 
 
@@ -45,12 +38,14 @@ async def async_setup_entry(
     @callback
     def async_add_fan(_: EventType, fan_id: str) -> None:
         """Add fan from deCONZ."""
-        fan = gateway.api.lights.fans[fan_id]
+        fan = gateway.api.lights.lights[fan_id]
+        if not fan.supports_fan_speed:
+            return
         async_add_entities([DeconzFan(fan, gateway)])
 
     gateway.register_platform_add_device_callback(
         async_add_fan,
-        gateway.api.lights.fans,
+        gateway.api.lights.lights,
     )
 
 
@@ -58,33 +53,32 @@ class DeconzFan(DeconzDevice, FanEntity):
     """Representation of a deCONZ fan."""
 
     TYPE = DOMAIN
-    _device: Fan
-    _default_on_speed: Literal[0, 1, 2, 3, 4, 5, 6]
+    _device: Light
+    _default_on_speed = LightFanSpeed.PERCENT_50
 
     _attr_supported_features = FanEntityFeature.SET_SPEED
 
-    def __init__(self, device: Fan, gateway: DeconzGateway) -> None:
+    def __init__(self, device: Light, gateway: DeconzGateway) -> None:
         """Set up fan."""
         super().__init__(device, gateway)
 
-        self._default_on_speed = FAN_SPEED_50_PERCENT
-        if self._device.speed in ORDERED_NAMED_FAN_SPEEDS:
-            self._default_on_speed = self._device.speed
+        if device.fan_speed in ORDERED_NAMED_FAN_SPEEDS:
+            self._default_on_speed = device.fan_speed
 
     @property
     def is_on(self) -> bool:
         """Return true if fan is on."""
-        return self._device.speed != FAN_SPEED_OFF
+        return self._device.fan_speed != LightFanSpeed.OFF
 
     @property
     def percentage(self) -> int | None:
         """Return the current speed percentage."""
-        if self._device.speed == FAN_SPEED_OFF:
+        if self._device.fan_speed == LightFanSpeed.OFF:
             return 0
-        if self._device.speed not in ORDERED_NAMED_FAN_SPEEDS:
+        if self._device.fan_speed not in ORDERED_NAMED_FAN_SPEEDS:
             return None
         return ordered_list_item_to_percentage(
-            ORDERED_NAMED_FAN_SPEEDS, self._device.speed
+            ORDERED_NAMED_FAN_SPEEDS, self._device.fan_speed
         )
 
     @property
@@ -95,16 +89,19 @@ class DeconzFan(DeconzDevice, FanEntity):
     @callback
     def async_update_callback(self) -> None:
         """Store latest configured speed from the device."""
-        if self._device.speed in ORDERED_NAMED_FAN_SPEEDS:
-            self._default_on_speed = self._device.speed
+        if self._device.fan_speed in ORDERED_NAMED_FAN_SPEEDS:
+            self._default_on_speed = self._device.fan_speed
         super().async_update_callback()
 
     async def async_set_percentage(self, percentage: int) -> None:
         """Set the speed percentage of the fan."""
         if percentage == 0:
             return await self.async_turn_off()
-        await self._device.set_speed(
-            percentage_to_ordered_list_item(ORDERED_NAMED_FAN_SPEEDS, percentage)
+        await self.gateway.api.lights.lights.set_state(
+            id=self._device.resource_id,
+            fan_speed=percentage_to_ordered_list_item(
+                ORDERED_NAMED_FAN_SPEEDS, percentage
+            ),
         )
 
     async def async_turn_on(
@@ -117,8 +114,14 @@ class DeconzFan(DeconzDevice, FanEntity):
         if percentage is not None:
             await self.async_set_percentage(percentage)
             return
-        await self._device.set_speed(self._default_on_speed)
+        await self.gateway.api.lights.lights.set_state(
+            id=self._device.resource_id,
+            fan_speed=self._default_on_speed,
+        )
 
     async def async_turn_off(self, **kwargs: Any) -> None:
         """Turn off fan."""
-        await self._device.set_speed(FAN_SPEED_OFF)
+        await self.gateway.api.lights.lights.set_state(
+            id=self._device.resource_id,
+            fan_speed=LightFanSpeed.OFF,
+        )
diff --git a/homeassistant/components/deconz/light.py b/homeassistant/components/deconz/light.py
index e73314aa477..7be6551cccc 100644
--- a/homeassistant/components/deconz/light.py
+++ b/homeassistant/components/deconz/light.py
@@ -85,8 +85,7 @@ async def async_setup_entry(
     @callback
     def async_add_light(_: EventType, light_id: str) -> None:
         """Add light from deCONZ."""
-        light = gateway.api.lights[light_id]
-        assert isinstance(light, Light)
+        light = gateway.api.lights.lights[light_id]
         if light.type in POWER_PLUGS:
             return
 
@@ -97,11 +96,6 @@ async def async_setup_entry(
         gateway.api.lights.lights,
     )
 
-    gateway.register_platform_add_device_callback(
-        async_add_light,
-        gateway.api.lights.fans,
-    )
-
     @callback
     def async_add_group(_: EventType, group_id: str) -> None:
         """Add group from deCONZ.
diff --git a/homeassistant/components/deconz/manifest.json b/homeassistant/components/deconz/manifest.json
index 2ae400bbe19..c1b0b07de02 100644
--- a/homeassistant/components/deconz/manifest.json
+++ b/homeassistant/components/deconz/manifest.json
@@ -3,7 +3,7 @@
   "name": "deCONZ",
   "config_flow": true,
   "documentation": "https://www.home-assistant.io/integrations/deconz",
-  "requirements": ["pydeconz==98"],
+  "requirements": ["pydeconz==99"],
   "ssdp": [
     {
       "manufacturer": "Royal Philips Electronics",
diff --git a/requirements_all.txt b/requirements_all.txt
index 74f8e7fb0c0..98af8acf5e4 100644
--- a/requirements_all.txt
+++ b/requirements_all.txt
@@ -1447,7 +1447,7 @@ pydaikin==2.7.0
 pydanfossair==0.1.0
 
 # homeassistant.components.deconz
-pydeconz==98
+pydeconz==99
 
 # homeassistant.components.delijn
 pydelijn==1.0.0
diff --git a/requirements_test_all.txt b/requirements_test_all.txt
index 1d4cb752271..0a1afc49dce 100644
--- a/requirements_test_all.txt
+++ b/requirements_test_all.txt
@@ -980,7 +980,7 @@ pycoolmasternet-async==0.1.2
 pydaikin==2.7.0
 
 # homeassistant.components.deconz
-pydeconz==98
+pydeconz==99
 
 # homeassistant.components.dexcom
 pydexcom==0.2.3
-- 
GitLab