This commit is contained in:
Home Assistant Version Control committed 2026-07-24 15:19:02 +00:00
1 parent 8abf4efaec
commit 2d21a40fd6
48 files changed
+4181 -232

No files matched your search

+80 -25
View File
@@ -23,7 +23,13 @@ from midealocal.devices.x40 import DeviceAttributes as X40Attributes
from midealocal.devices.x40 import MideaX40Device
from .const import DEVICES, DOMAIN
from .midea_devices import MIDEA_DEVICES
from .midea_devices import (
FRESH_AIR_EXHAUST,
FRESH_AIR_EXHAUST_MODE,
FRESH_AIR_EXHAUST_POWER,
FRESH_AIR_EXHAUST_SPEED,
MIDEA_DEVICES,
)
from .midea_entity import MideaEntity
_LOGGER = logging.getLogger(__name__)
@@ -45,6 +51,12 @@ async def async_setup_entry(
"dict",
MIDEA_DEVICES[device.device_type]["entities"],
).items():
required_attribute = config.get("required_attribute")
if (
required_attribute is not None
and required_attribute not in device.attributes
):
continue
if config["type"] == Platform.FAN and (
config.get("default") or entity_key in extra_switches
):
@@ -100,7 +112,7 @@ class MideaFan(MideaEntity, FanEntity):
"""Midea Fan fan speed."""
return cast("int", self._device.get_attribute("fan_speed"))
def turn_off(self, **kwargs: Any) -> None: # noqa: ANN401, ARG002
def turn_off(self, **kwargs: Any) -> None: # ruff:ignore[any-type, unused-method-argument]
"""Midea Fan turn off."""
self._device.set_attribute(attr="power", value=False)
@@ -117,7 +129,7 @@ class MideaFan(MideaEntity, FanEntity):
"""Midea Fan percentage."""
if not self.fan_speed:
return None
return int(round(self.fan_speed * self.percentage_step)) # noqa: RUF046
return int(round(self.fan_speed * self.percentage_step)) # ruff:ignore[unnecessary-cast-to-int]
def set_percentage(self, percentage: int) -> None:
"""Midea Fan set percentage."""
@@ -131,7 +143,7 @@ class MideaFan(MideaEntity, FanEntity):
else:
await self.hass.async_add_executor_job(self.set_percentage, percentage)
def update_state(self, status: Any) -> None: # noqa: ANN401, ARG002
def update_state(self, status: Any) -> None: # ruff:ignore[any-type, unused-method-argument]
"""Midea Fan update state."""
if not self.hass:
_LOGGER.warning(
@@ -140,7 +152,7 @@ class MideaFan(MideaEntity, FanEntity):
type(self),
)
return
self.schedule_update_ha_state()
self.schedule_update_if_running()
class MideaFAFan(MideaFan):
@@ -163,7 +175,7 @@ class MideaFAFan(MideaFan):
self,
percentage: int | None = None,
preset_mode: str | None = None,
**kwargs: Any, # noqa: ANN401, ARG002
**kwargs: Any, # ruff:ignore[any-type, unused-method-argument]
) -> None:
"""Midea FA Fan turn on."""
fan_speed = int(percentage / self.percentage_step + 0.5) if percentage else None
@@ -189,7 +201,7 @@ class MideaB6Fan(MideaFan):
self,
percentage: int | None = None,
preset_mode: str | None = None,
**kwargs: Any, # noqa: ANN401, ARG002
**kwargs: Any, # ruff:ignore[any-type, unused-method-argument]
) -> None:
"""Midea B6 Fan turn on."""
fan_speed = int(percentage / self.percentage_step + 0.5) if percentage else None
@@ -204,6 +216,7 @@ class MideaACFreshAirFan(MideaFan):
def __init__(self, device: MideaACDevice, entity_key: str) -> None:
"""Midea AC Fresh Air Fan entity init."""
super().__init__(device, entity_key)
self._is_exhaust = entity_key == FRESH_AIR_EXHAUST
self._attr_supported_features = (
FanEntityFeature.SET_SPEED
| FanEntityFeature.PRESET_MODE
@@ -214,47 +227,89 @@ class MideaACFreshAirFan(MideaFan):
@property
def preset_modes(self) -> list[str] | None:
"""Midea AC Fan preset modes."""
if self._is_exhaust:
return cast(
"list[str]",
getattr(self._device, "fresh_air_exhaust_fan_speeds", []),
)
return cast("list", self._device.fresh_air_fan_speeds)
@property
def is_on(self) -> bool:
"""Midea AC Fan is on."""
return cast("bool", self._device.get_attribute(ACAttributes.fresh_air_power))
attribute = (
FRESH_AIR_EXHAUST_POWER
if self._is_exhaust
else ACAttributes.fresh_air_power
)
return cast("bool", self._device.get_attribute(attribute))
@property
def fan_speed(self) -> int:
"""Midea AC Fan fan speed."""
return cast("int", self._device.get_attribute(ACAttributes.fresh_air_fan_speed))
attribute = (
FRESH_AIR_EXHAUST_SPEED
if self._is_exhaust
else ACAttributes.fresh_air_fan_speed
)
return cast("int", self._device.get_attribute(attribute))
def turn_on(
self,
percentage: int | None = None, # noqa: ARG002
preset_mode: str | None = None, # noqa: ARG002
**kwargs: Any, # noqa: ANN401, ARG002
percentage: int | None = None,
preset_mode: str | None = None,
**kwargs: Any, # ruff:ignore[any-type, unused-method-argument]
) -> None:
"""Midea AC Fan tun on."""
self._device.set_attribute(attr=ACAttributes.fresh_air_power, value=True)
if preset_mode is not None:
self.set_preset_mode(preset_mode)
return
if percentage is not None:
self.set_percentage(percentage)
return
attribute = (
FRESH_AIR_EXHAUST_POWER
if self._is_exhaust
else ACAttributes.fresh_air_power
)
self._device.set_attribute(attr=attribute, value=True)
def turn_off(self, **kwargs: Any) -> None: # noqa: ANN401, ARG002
def turn_off(self, **kwargs: Any) -> None: # ruff:ignore[any-type, unused-method-argument]
"""Midea AC Fan turn off."""
self._device.set_attribute(attr=ACAttributes.fresh_air_power, value=False)
attribute = (
FRESH_AIR_EXHAUST_POWER
if self._is_exhaust
else ACAttributes.fresh_air_power
)
self._device.set_attribute(attr=attribute, value=False)
def set_percentage(self, percentage: int) -> None:
"""Midea AC Fan set percentage."""
fan_speed = int(percentage / self.percentage_step + 0.5)
attribute = (
FRESH_AIR_EXHAUST_SPEED
if self._is_exhaust
else ACAttributes.fresh_air_fan_speed
)
self._device.set_attribute(
attr=ACAttributes.fresh_air_fan_speed,
attr=attribute,
value=fan_speed,
)
def set_preset_mode(self, preset_mode: str) -> None:
"""Midea AC Fan set preset mode."""
self._device.set_attribute(attr=ACAttributes.fresh_air_mode, value=preset_mode)
attribute = (
FRESH_AIR_EXHAUST_MODE if self._is_exhaust else ACAttributes.fresh_air_mode
)
self._device.set_attribute(attr=attribute, value=preset_mode)
@property
def preset_mode(self) -> str | None:
"""Midea AC Fan preset mode."""
return cast("str", self._device.get_attribute(attr=ACAttributes.fresh_air_mode))
attribute = (
FRESH_AIR_EXHAUST_MODE if self._is_exhaust else ACAttributes.fresh_air_mode
)
return cast("str", self._device.get_attribute(attr=attribute))
class MideaCEFan(MideaFan):
@@ -274,9 +329,9 @@ class MideaCEFan(MideaFan):
def turn_on(
self,
percentage: int | None = None, # noqa: ARG002
preset_mode: str | None = None, # noqa: ARG002
**kwargs: Any, # noqa: ANN401, ARG002
percentage: int | None = None, # ruff:ignore[unused-method-argument]
preset_mode: str | None = None, # ruff:ignore[unused-method-argument]
**kwargs: Any, # ruff:ignore[any-type, unused-method-argument]
) -> None:
"""Midea CE Fan turn on."""
self._device.set_attribute(attr=CEAttributes.power, value=True)
@@ -308,13 +363,13 @@ class MideaX40Fan(MideaFan):
def turn_on(
self,
percentage: int | None = None, # noqa: ARG002
preset_mode: str | None = None, # noqa: ARG002
**kwargs: Any, # noqa: ANN401, ARG002
percentage: int | None = None, # ruff:ignore[unused-method-argument]
preset_mode: str | None = None, # ruff:ignore[unused-method-argument]
**kwargs: Any, # ruff:ignore[any-type, unused-method-argument]
) -> None:
"""Midea X40 Fan turn on."""
self._device.set_attribute(attr=X40Attributes.fan_speed, value=1)
def turn_off(self, **kwargs: Any) -> None: # noqa: ANN401, ARG002
def turn_off(self, **kwargs: Any) -> None: # ruff:ignore[any-type, unused-method-argument]
"""Midea X40 Fan turn off."""
self._device.set_attribute(attr=X40Attributes.fan_speed, value=0)