Home Assistant Unofficial Reference 2024.12.1
fan.py
Go to the documentation of this file.
1 """Support for deCONZ fans."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from pydeconz.models.event import EventType
8 from pydeconz.models.light.light import Light, LightFanSpeed
9 
10 from homeassistant.components.fan import (
11  DOMAIN as FAN_DOMAIN,
12  FanEntity,
13  FanEntityFeature,
14 )
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.core import HomeAssistant, callback
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19  ordered_list_item_to_percentage,
20  percentage_to_ordered_list_item,
21 )
22 
23 from .entity import DeconzDevice
24 from .hub import DeconzHub
25 
26 ORDERED_NAMED_FAN_SPEEDS: list[LightFanSpeed] = [
27  LightFanSpeed.PERCENT_25,
28  LightFanSpeed.PERCENT_50,
29  LightFanSpeed.PERCENT_75,
30  LightFanSpeed.PERCENT_100,
31 ]
32 
33 
35  hass: HomeAssistant,
36  config_entry: ConfigEntry,
37  async_add_entities: AddEntitiesCallback,
38 ) -> None:
39  """Set up fans for deCONZ component."""
40  hub = DeconzHub.get_hub(hass, config_entry)
41  hub.entities[FAN_DOMAIN] = set()
42 
43  @callback
44  def async_add_fan(_: EventType, fan_id: str) -> None:
45  """Add fan from deCONZ."""
46  fan = hub.api.lights.lights[fan_id]
47  if not fan.supports_fan_speed:
48  return
49  async_add_entities([DeconzFan(fan, hub)])
50 
51  hub.register_platform_add_device_callback(
52  async_add_fan,
53  hub.api.lights.lights,
54  )
55 
56 
57 class DeconzFan(DeconzDevice[Light], FanEntity):
58  """Representation of a deCONZ fan."""
59 
60  TYPE = FAN_DOMAIN
61  _default_on_speed = LightFanSpeed.PERCENT_50
62 
63  _attr_supported_features = (
64  FanEntityFeature.SET_SPEED
65  | FanEntityFeature.TURN_ON
66  | FanEntityFeature.TURN_OFF
67  )
68  _enable_turn_on_off_backwards_compatibility = False
69 
70  def __init__(self, device: Light, hub: DeconzHub) -> None:
71  """Set up fan."""
72  super().__init__(device, hub)
73  if device.fan_speed in ORDERED_NAMED_FAN_SPEEDS:
74  self._default_on_speed_default_on_speed = device.fan_speed
75 
76  @property
77  def is_on(self) -> bool:
78  """Return true if fan is on."""
79  return self._device.fan_speed != LightFanSpeed.OFF
80 
81  @property
82  def percentage(self) -> int | None:
83  """Return the current speed percentage."""
84  if self._device.fan_speed == LightFanSpeed.OFF:
85  return 0
86  if self._device.fan_speed not in ORDERED_NAMED_FAN_SPEEDS:
87  return None
88  return ordered_list_item_to_percentage(
89  ORDERED_NAMED_FAN_SPEEDS, self._device.fan_speed
90  )
91 
92  @callback
93  def async_update_callback(self) -> None:
94  """Store latest configured speed from the device."""
95  if self._device.fan_speed in ORDERED_NAMED_FAN_SPEEDS:
96  self._default_on_speed_default_on_speed = self._device.fan_speed
97  super().async_update_callback()
98 
99  async def async_set_percentage(self, percentage: int) -> None:
100  """Set the speed percentage of the fan."""
101  if percentage == 0:
102  await self.async_turn_offasync_turn_offasync_turn_off()
103  return
104  await self.hub.api.lights.lights.set_state(
105  id=self._device.resource_id,
106  fan_speed=percentage_to_ordered_list_item(
107  ORDERED_NAMED_FAN_SPEEDS, percentage
108  ),
109  )
110 
111  async def async_turn_on(
112  self,
113  percentage: int | None = None,
114  preset_mode: str | None = None,
115  **kwargs: Any,
116  ) -> None:
117  """Turn on fan."""
118  if percentage is not None:
119  await self.async_set_percentageasync_set_percentageasync_set_percentage(percentage)
120  return
121  await self.hub.api.lights.lights.set_state(
122  id=self._device.resource_id,
123  fan_speed=self._default_on_speed_default_on_speed,
124  )
125 
126  async def async_turn_off(self, **kwargs: Any) -> None:
127  """Turn off fan."""
128  await self.hub.api.lights.lights.set_state(
129  id=self._device.resource_id,
130  fan_speed=LightFanSpeed.OFF,
131  )
None __init__(self, Light device, DeconzHub hub)
Definition: fan.py:70
None async_set_percentage(self, int percentage)
Definition: fan.py:99
None async_turn_off(self, **Any kwargs)
Definition: fan.py:126
None async_turn_on(self, int|None percentage=None, str|None preset_mode=None, **Any kwargs)
Definition: fan.py:116
None async_set_percentage(self, int percentage)
Definition: __init__.py:340
None async_turn_off(self, **Any kwargs)
Definition: entity.py:1709
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: fan.py:38