From 085f7b3cde0d529572cb84029524b6944aa87bc7 Mon Sep 17 00:00:00 2001 From: Cyborg2017 Date: Mon, 29 Dec 2025 21:38:39 +0800 Subject: [PATCH] feat: Add preset mode specific speed configurations - Each preset mode (e.g normal/sleep/baby) now supports independent speed settings - Automatically sets fixed speed when switching to single-speed modes - Maintains backward compatibility with existing configuration format - Dynamic switching of speed configuration based on selected preset mode The implementation allows for more intuitive control where different operating modes can have different speed adjustment capabilities. --- .../midea_auto_cloud/device_mapping/T0xFA.py | 15 +++- custom_components/midea_auto_cloud/fan.py | 78 ++++++++++++++++--- 2 files changed, 78 insertions(+), 15 deletions(-) diff --git a/custom_components/midea_auto_cloud/device_mapping/T0xFA.py b/custom_components/midea_auto_cloud/device_mapping/T0xFA.py index 2df5ac5..b897ebb 100644 --- a/custom_components/midea_auto_cloud/device_mapping/T0xFA.py +++ b/custom_components/midea_auto_cloud/device_mapping/T0xFA.py @@ -232,9 +232,18 @@ DEVICE_MAPPING = { "speeds": list({"gear": value + 1} for value in range(0, 3)), "oscillate": "swing", "preset_modes": { - "normal": {"mode": "normal"}, - "sleep": {"mode": "sleep"}, - "baby": {"mode": "baby"} + "normal": { + "mode": "normal", + "speeds": list({"gear": value + 1} for value in range(0, 3)) + }, + "sleep": { + "mode": "sleep", + "speeds": list({"gear": value + 1} for value in range(0, 2)) + }, + "baby": { + "mode": "baby", + "speeds": list({"gear": value + 1} for value in range(0, 1)) + } } } }, diff --git a/custom_components/midea_auto_cloud/fan.py b/custom_components/midea_auto_cloud/fan.py index 8cc0b43..0faa218 100644 --- a/custom_components/midea_auto_cloud/fan.py +++ b/custom_components/midea_auto_cloud/fan.py @@ -69,6 +69,8 @@ class MideaFanEntity(MideaEntity, FanEntity): self._key_oscillate = self._config.get("oscillate") self._key_directions = self._config.get("directions") self._attr_speed_count = len(self._key_speeds) if self._key_speeds else 0 + self._current_preset_mode = None + self._current_speeds = self._key_speeds @property def supported_features(self): @@ -77,7 +79,7 @@ class MideaFanEntity(MideaEntity, FanEntity): features |= FanEntityFeature.TURN_OFF if self._key_preset_modes is not None and len(self._key_preset_modes) > 0: features |= FanEntityFeature.PRESET_MODE - if self._key_speeds is not None and len(self._key_speeds) > 0: + if self._current_speeds is not None and len(self._current_speeds) > 0: features |= FanEntityFeature.SET_SPEED if self._key_oscillate is not None: features |= FanEntityFeature.OSCILLATE @@ -99,11 +101,28 @@ class MideaFanEntity(MideaEntity, FanEntity): def preset_mode(self): if self._key_preset_modes is None: return None - return self._dict_get_selected(self._key_preset_modes) + + current_mode = self._dict_get_selected(self._key_preset_modes) + + if current_mode: + mode_config = self._key_preset_modes.get(current_mode, {}) + + # 切换到该模式的档位配置 + if "speeds" in mode_config: + self._current_speeds = mode_config["speeds"] + self._attr_speed_count = len(self._current_speeds) + else: + # 使用全局配置 + self._current_speeds = self._key_speeds + self._attr_speed_count = len(self._current_speeds) if self._current_speeds else 0 + + self._current_preset_mode = current_mode + + return current_mode @property def percentage(self): - index = self._list_get_selected(self._key_speeds) + index = self._list_get_selected(self._current_speeds) if index is None: return None return round((index + 1) * 100 / self._attr_speed_count) @@ -124,11 +143,28 @@ class MideaFanEntity(MideaEntity, FanEntity): ): new_status = {} if preset_mode is not None and self._key_preset_modes is not None: - new_status.update(self._key_preset_modes.get(preset_mode, {})) - if percentage is not None and self._key_speeds: + mode_config = self._key_preset_modes.get(preset_mode, {}) + new_status.update({"mode": mode_config.get("mode")}) + + # 切换到该模式的档位配置 + if "speeds" in mode_config: + self._current_speeds = mode_config["speeds"] + self._attr_speed_count = len(self._current_speeds) + else: + self._current_speeds = self._key_speeds + self._attr_speed_count = len(self._current_speeds) if self._current_speeds else 0 + + self._current_preset_mode = preset_mode + + # 如果只有一个档位,自动设置 + if "speeds" in mode_config and len(mode_config["speeds"]) == 1: + new_status.update(mode_config["speeds"][0]) + + # 使用当前模式的速度配置 + if percentage is not None and self._current_speeds: index = round(percentage * self._attr_speed_count / 100) - 1 - index = max(0, min(index, len(self._key_speeds) - 1)) - new_status.update(self._key_speeds[index]) + index = max(0, min(index, len(self._current_speeds) - 1)) + new_status.update(self._current_speeds[index]) await self._async_set_status_on_off(self._key_power, True) if new_status: await self.async_set_attributes(new_status) @@ -137,18 +173,36 @@ class MideaFanEntity(MideaEntity, FanEntity): await self._async_set_status_on_off(self._key_power, False) async def async_set_percentage(self, percentage: int): - if not self._key_speeds: + if not self._current_speeds: return index = round(percentage * self._attr_speed_count / 100) - if 0 < index <= len(self._key_speeds): - new_status = self._key_speeds[index - 1] + if 0 < index <= len(self._current_speeds): + new_status = self._current_speeds[index - 1] await self.async_set_attributes(new_status) async def async_set_preset_mode(self, preset_mode: str): if not self._key_preset_modes: return - new_status = self._key_preset_modes.get(preset_mode) - if new_status: + + mode_config = self._key_preset_modes.get(preset_mode, {}) + if mode_config: + # 切换到该模式的档位配置 + if "speeds" in mode_config: + self._current_speeds = mode_config["speeds"] + self._attr_speed_count = len(self._current_speeds) + else: + self._current_speeds = self._key_speeds + self._attr_speed_count = len(self._current_speeds) if self._current_speeds else 0 + + self._current_preset_mode = preset_mode + + # 设置模式 + new_status = {"mode": mode_config.get("mode")} + + # 如果只有一个档位,自动设置 + if "speeds" in mode_config and len(mode_config["speeds"]) == 1: + new_status.update(mode_config["speeds"][0]) + await self.async_set_attributes(new_status) async def async_oscillate(self, oscillating: bool):