Home Assistant Unofficial Reference 2024.12.1
fan.py
Go to the documentation of this file.
1 """Support for Rabbit Air fan entity."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from rabbitair import Mode, Model, Speed
8 
9 from homeassistant.components.fan import FanEntity, FanEntityFeature
10 from homeassistant.config_entries import ConfigEntry
11 from homeassistant.core import HomeAssistant, callback
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
14  ordered_list_item_to_percentage,
15  percentage_to_ordered_list_item,
16 )
17 
18 from .const import DOMAIN
19 from .coordinator import RabbitAirDataUpdateCoordinator
20 from .entity import RabbitAirBaseEntity
21 
22 SPEED_LIST = [
23  Speed.Silent,
24  Speed.Low,
25  Speed.Medium,
26  Speed.High,
27  Speed.Turbo,
28 ]
29 
30 PRESET_MODE_AUTO = "Auto"
31 PRESET_MODE_MANUAL = "Manual"
32 PRESET_MODE_POLLEN = "Pollen"
33 
34 PRESET_MODES = {
35  PRESET_MODE_AUTO: Mode.Auto,
36  PRESET_MODE_MANUAL: Mode.Manual,
37  PRESET_MODE_POLLEN: Mode.Pollen,
38 }
39 
40 
42  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
43 ) -> None:
44  """Set up a config entry."""
45  coordinator: RabbitAirDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id]
46  async_add_entities([RabbitAirFanEntity(coordinator, entry)])
47 
48 
50  """Fan control functions of the Rabbit Air air purifier."""
51 
52  _attr_supported_features = (
53  FanEntityFeature.PRESET_MODE
54  | FanEntityFeature.SET_SPEED
55  | FanEntityFeature.TURN_ON
56  | FanEntityFeature.TURN_OFF
57  )
58  _enable_turn_on_off_backwards_compatibility = False
59 
60  def __init__(
61  self,
62  coordinator: RabbitAirDataUpdateCoordinator,
63  entry: ConfigEntry,
64  ) -> None:
65  """Initialize the entity."""
66  super().__init__(coordinator, entry)
67 
68  if self._is_model_is_model(Model.MinusA2):
69  self._attr_preset_modes_attr_preset_modes = list(PRESET_MODES)
70  elif self._is_model_is_model(Model.A3):
71  # A3 does not support Pollen mode
72  self._attr_preset_modes_attr_preset_modes = [
73  k for k in PRESET_MODES if k != PRESET_MODE_POLLEN
74  ]
75 
76  self._attr_speed_count_attr_speed_count = len(SPEED_LIST)
77 
78  self._get_state_from_coordinator_data_get_state_from_coordinator_data()
79 
80  @callback
81  def _handle_coordinator_update(self) -> None:
82  """Handle updated data from the coordinator."""
83  self._get_state_from_coordinator_data_get_state_from_coordinator_data()
85 
87  """Populate the entity fields with values from the coordinator data."""
88  data = self.coordinator.data
89 
90  # Speed as a percentage
91  if not data.power:
92  self._attr_percentage_attr_percentage = 0
93  elif data.speed is None:
94  self._attr_percentage_attr_percentage = None
95  elif data.speed is Speed.SuperSilent:
96  self._attr_percentage_attr_percentage = 1
97  else:
98  self._attr_percentage_attr_percentage = ordered_list_item_to_percentage(
99  SPEED_LIST, data.speed
100  )
101 
102  # Preset mode
103  if not data.power or data.mode is None:
104  self._attr_preset_mode_attr_preset_mode = None
105  else:
106  # Get key by value in dictionary
107  self._attr_preset_mode_attr_preset_mode = next(
108  k for k, v in PRESET_MODES.items() if v == data.mode
109  )
110 
111  async def async_set_preset_mode(self, preset_mode: str) -> None:
112  """Set new preset mode."""
113  await self._set_state_set_state(power=True, mode=PRESET_MODES[preset_mode])
114  self._attr_preset_mode_attr_preset_mode = preset_mode
115  self.async_write_ha_stateasync_write_ha_state()
116 
117  async def async_set_percentage(self, percentage: int) -> None:
118  """Set the speed of the fan, as a percentage."""
119  if percentage > 0:
120  value = percentage_to_ordered_list_item(SPEED_LIST, percentage)
121  await self._set_state_set_state(power=True, speed=value)
122  self._attr_percentage_attr_percentage = percentage
123  else:
124  await self._set_state_set_state(power=False)
125  self._attr_percentage_attr_percentage = 0
126  self._attr_preset_mode_attr_preset_mode = None
127  self.async_write_ha_stateasync_write_ha_state()
128 
129  async def async_turn_on(
130  self,
131  percentage: int | None = None,
132  preset_mode: str | None = None,
133  **kwargs: Any,
134  ) -> None:
135  """Turn on the fan."""
136  mode_value: Mode | None = None
137  if preset_mode is not None:
138  mode_value = PRESET_MODES[preset_mode]
139  speed_value: Speed | None = None
140  if percentage is not None:
141  speed_value = percentage_to_ordered_list_item(SPEED_LIST, percentage)
142  await self._set_state_set_state(power=True, mode=mode_value, speed=speed_value)
143  if percentage is not None:
144  self._attr_percentage_attr_percentage = percentage
145  if preset_mode is not None:
146  self._attr_preset_mode_attr_preset_mode = preset_mode
147  self.async_write_ha_stateasync_write_ha_state()
148 
149  async def async_turn_off(self, **kwargs: Any) -> None:
150  """Turn the fan off."""
151  await self._set_state_set_state(power=False)
152  self._attr_percentage_attr_percentage = 0
153  self._attr_preset_mode_attr_preset_mode = None
154  self.async_write_ha_stateasync_write_ha_state()
bool _is_model(self, Model|list[Model] model)
Definition: entity.py:49
None async_turn_on(self, int|None percentage=None, str|None preset_mode=None, **Any kwargs)
Definition: fan.py:134
None __init__(self, RabbitAirDataUpdateCoordinator coordinator, ConfigEntry entry)
Definition: fan.py:64
None async_set_preset_mode(self, str preset_mode)
Definition: fan.py:111
None async_set_percentage(self, int percentage)
Definition: fan.py:117
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: fan.py:43