Home Assistant Unofficial Reference 2024.12.1
fan.py
Go to the documentation of this file.
1 """Support for Balboa Spa pumps."""
2 
3 from __future__ import annotations
4 
5 import math
6 from typing import Any, cast
7 
8 from pybalboa import SpaControl
9 from pybalboa.enums import OffOnState, UnknownState
10 
11 from homeassistant.components.fan import FanEntity, FanEntityFeature
12 from homeassistant.core import HomeAssistant
13 from homeassistant.helpers.entity_platform import AddEntitiesCallback
15  percentage_to_ranged_value,
16  ranged_value_to_percentage,
17 )
18 
19 from . import BalboaConfigEntry
20 from .entity import BalboaEntity
21 
22 
24  hass: HomeAssistant,
25  entry: BalboaConfigEntry,
26  async_add_entities: AddEntitiesCallback,
27 ) -> None:
28  """Set up the spa's pumps."""
29  spa = entry.runtime_data
30  async_add_entities(BalboaPumpFanEntity(control) for control in spa.pumps)
31 
32 
34  """Representation of a Balboa Spa pump fan entity."""
35 
36  _attr_supported_features = (
37  FanEntityFeature.SET_SPEED
38  | FanEntityFeature.TURN_OFF
39  | FanEntityFeature.TURN_ON
40  )
41  _enable_turn_on_off_backwards_compatibility = False
42  _attr_translation_key = "pump"
43 
44  def __init__(self, control: SpaControl) -> None:
45  """Initialize a Balboa pump fan entity."""
46  super().__init__(control.client, control.name)
47  self._control_control = control
48  self._attr_translation_placeholders_attr_translation_placeholders = {
49  "index": f"{cast(int, control.index) + 1}"
50  }
51 
52  async def async_turn_off(self, **kwargs: Any) -> None:
53  """Turn the pump off."""
54  await self._control_control.set_state(OffOnState.OFF)
55 
56  async def async_turn_on(
57  self,
58  percentage: int | None = None,
59  preset_mode: str | None = None,
60  **kwargs: Any,
61  ) -> None:
62  """Turn the pump on (by default on max speed)."""
63  if percentage is None:
64  percentage = 100
65  await self.async_set_percentageasync_set_percentageasync_set_percentage(percentage)
66 
67  async def async_set_percentage(self, percentage: int) -> None:
68  """Set the speed of the pump."""
69  if percentage > 0:
70  state = math.ceil(
71  percentage_to_ranged_value((1, self.speed_countspeed_countspeed_count), percentage)
72  )
73  else:
74  state = OffOnState.OFF
75  await self._control_control.set_state(state)
76 
77  @property
78  def percentage(self) -> int | None:
79  """Return the speed of the pump."""
80  if self._control_control.state == UnknownState.UNKNOWN:
81  return None
82  if self._control_control.state == OffOnState.OFF:
83  return 0
84  return ranged_value_to_percentage((1, self.speed_countspeed_countspeed_count), self._control_control.state)
85 
86  @property
87  def is_on(self) -> bool | None:
88  """Return true if the pump is running."""
89  if self._control_control.state == UnknownState.UNKNOWN:
90  return None
91  return self._control_control.state != OffOnState.OFF
92 
93  @property
94  def speed_count(self) -> int:
95  """Return the number of different speed settings the pump supports."""
96  return int(max(self._control_control.options))
None async_turn_on(self, int|None percentage=None, str|None preset_mode=None, **Any kwargs)
Definition: fan.py:61
None async_set_percentage(self, int percentage)
Definition: fan.py:67
None __init__(self, SpaControl control)
Definition: fan.py:44
None async_set_percentage(self, int percentage)
Definition: __init__.py:340
None async_setup_entry(HomeAssistant hass, BalboaConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: fan.py:27
float percentage_to_ranged_value(tuple[float, float] low_high_range, float percentage)
Definition: percentage.py:81
int ranged_value_to_percentage(tuple[float, float] low_high_range, float value)
Definition: percentage.py:64