Skip to content

Commit 388ab5c

Browse files
authored
Migrate Tuya climate (fan_mode) to use wrapper class (home-assistant#156721)
1 parent 81ea6f8 commit 388ab5c

File tree

2 files changed

+20
-23
lines changed

2 files changed

+20
-23
lines changed

homeassistant/components/tuya/climate.py

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@
2626
from . import TuyaConfigEntry
2727
from .const import TUYA_DISCOVERY_NEW, DeviceCategory, DPCode, DPType
2828
from .entity import TuyaEntity
29-
from .models import DPCodeIntegerWrapper, IntegerTypeData, find_dpcode
29+
from .models import (
30+
DPCodeEnumWrapper,
31+
DPCodeIntegerWrapper,
32+
IntegerTypeData,
33+
find_dpcode,
34+
)
3035
from .util import get_dpcode
3136

3237
TUYA_HVAC_TO_HA = {
@@ -110,6 +115,11 @@ def async_discover_device(device_ids: list[str]) -> None:
110115
current_humidity_wrapper=_RoundedIntegerWrapper.find_dpcode(
111116
device, DPCode.HUMIDITY_CURRENT
112117
),
118+
fan_mode_wrapper=DPCodeEnumWrapper.find_dpcode(
119+
device,
120+
(DPCode.FAN_SPEED_ENUM, DPCode.LEVEL, DPCode.WINDSPEED),
121+
prefer_function=True,
122+
),
113123
target_humidity_wrapper=_RoundedIntegerWrapper.find_dpcode(
114124
device, DPCode.HUMIDITY_SET, prefer_function=True
115125
),
@@ -141,6 +151,7 @@ def __init__(
141151
system_temperature_unit: UnitOfTemperature,
142152
*,
143153
current_humidity_wrapper: _RoundedIntegerWrapper | None = None,
154+
fan_mode_wrapper: DPCodeEnumWrapper | None = None,
144155
target_humidity_wrapper: _RoundedIntegerWrapper | None = None,
145156
) -> None:
146157
"""Determine which values to use."""
@@ -149,6 +160,7 @@ def __init__(
149160

150161
super().__init__(device, device_manager)
151162
self._current_humidity_wrapper = current_humidity_wrapper
163+
self._fan_mode_wrapper = fan_mode_wrapper
152164
self._target_humidity_wrapper = target_humidity_wrapper
153165

154166
# If both temperature values for celsius and fahrenheit are present,
@@ -256,16 +268,9 @@ def __init__(
256268
)
257269

258270
# Determine fan modes
259-
self._fan_mode_dp_code: str | None = None
260-
if enum_type := find_dpcode(
261-
self.device,
262-
(DPCode.FAN_SPEED_ENUM, DPCode.LEVEL, DPCode.WINDSPEED),
263-
dptype=DPType.ENUM,
264-
prefer_function=True,
265-
):
271+
if fan_mode_wrapper:
266272
self._attr_supported_features |= ClimateEntityFeature.FAN_MODE
267-
self._attr_fan_modes = enum_type.range
268-
self._fan_mode_dp_code = enum_type.dpcode
273+
self._attr_fan_modes = fan_mode_wrapper.type_information.range
269274

270275
# Determine swing modes
271276
if get_dpcode(
@@ -307,13 +312,9 @@ def set_preset_mode(self, preset_mode: str) -> None:
307312
commands = [{"code": DPCode.MODE, "value": preset_mode}]
308313
self._send_command(commands)
309314

310-
def set_fan_mode(self, fan_mode: str) -> None:
315+
async def async_set_fan_mode(self, fan_mode: str) -> None:
311316
"""Set new target fan mode."""
312-
if TYPE_CHECKING:
313-
# guarded by ClimateEntityFeature.FAN_MODE
314-
assert self._fan_mode_dp_code is not None
315-
316-
self._send_command([{"code": self._fan_mode_dp_code, "value": fan_mode}])
317+
await self._async_send_dpcode_update(self._fan_mode_wrapper, fan_mode)
317318

318319
async def async_set_humidity(self, humidity: int) -> None:
319320
"""Set new target humidity."""
@@ -441,11 +442,7 @@ def preset_mode(self) -> str | None:
441442
@property
442443
def fan_mode(self) -> str | None:
443444
"""Return fan mode."""
444-
return (
445-
self.device.status.get(self._fan_mode_dp_code)
446-
if self._fan_mode_dp_code
447-
else None
448-
)
445+
return self._read_wrapper(self._fan_mode_wrapper)
449446

450447
@property
451448
def swing_mode(self) -> str:

tests/components/tuya/snapshots/test_climate.ambr

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
StateSnapshot({
5151
'attributes': ReadOnlyDict({
5252
'current_temperature': 22.0,
53-
'fan_mode': 1,
53+
'fan_mode': None,
5454
'fan_modes': list([
5555
'1',
5656
'2',
@@ -1134,7 +1134,7 @@
11341134
StateSnapshot({
11351135
'attributes': ReadOnlyDict({
11361136
'current_temperature': 24.0,
1137-
'fan_mode': 2,
1137+
'fan_mode': None,
11381138
'fan_modes': list([
11391139
'1',
11401140
'2',

0 commit comments

Comments
 (0)