2626from . import TuyaConfigEntry
2727from .const import TUYA_DISCOVERY_NEW , DeviceCategory , DPCode , DPType
2828from .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+ )
3035from .util import get_dpcode
3136
3237TUYA_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 :
0 commit comments