205 lines
7 KiB
Python
205 lines
7 KiB
Python
|
import logging
|
||
|
from homeassistant.components.fan import *
|
||
|
from homeassistant.const import (
|
||
|
Platform,
|
||
|
CONF_DEVICE_ID,
|
||
|
CONF_SWITCHES,
|
||
|
STATE_ON,
|
||
|
STATE_OFF
|
||
|
)
|
||
|
from .const import (
|
||
|
DOMAIN,
|
||
|
DEVICES,
|
||
|
)
|
||
|
from .midea.devices.ac.device import DeviceAttributes as ACAttributes
|
||
|
from .midea.devices.ce.device import DeviceAttributes as CEAttributes
|
||
|
from .midea.devices.x40.device import DeviceAttributes as X40Attributes
|
||
|
from .midea_devices import MIDEA_DEVICES
|
||
|
from .midea_entity import MideaEntity
|
||
|
|
||
|
_LOGGER = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
async def async_setup_entry(hass, config_entry, async_add_entities):
|
||
|
device_id = config_entry.data.get(CONF_DEVICE_ID)
|
||
|
device = hass.data[DOMAIN][DEVICES].get(device_id)
|
||
|
extra_switches = config_entry.options.get(
|
||
|
CONF_SWITCHES, []
|
||
|
)
|
||
|
devs = []
|
||
|
for entity_key, config in MIDEA_DEVICES[device.device_type]["entities"].items():
|
||
|
if config["type"] == Platform.FAN and (config.get("default") or entity_key in extra_switches):
|
||
|
if device.device_type == 0xFA:
|
||
|
devs.append(MideaFAFan(device, entity_key))
|
||
|
elif device.device_type == 0xB6:
|
||
|
devs.append(MideaB6Fan(device, entity_key))
|
||
|
elif device.device_type == 0xAC:
|
||
|
devs.append(MideaACFreshAirFan(device, entity_key))
|
||
|
elif device.device_type == 0xCE:
|
||
|
devs.append(MideaCEFan(device, entity_key))
|
||
|
elif device.device_type == 0x40:
|
||
|
devs.append(Midea40Fan(device, entity_key))
|
||
|
async_add_entities(devs)
|
||
|
|
||
|
|
||
|
class MideaFan(MideaEntity, FanEntity):
|
||
|
def __init__(self, device, entity_key):
|
||
|
super().__init__(device, entity_key)
|
||
|
|
||
|
def turn_on(
|
||
|
self,
|
||
|
percentage,
|
||
|
preset_mode,
|
||
|
**kwargs,
|
||
|
):
|
||
|
if percentage:
|
||
|
fan_speed = int(percentage / self.percentage_step + 0.5)
|
||
|
else:
|
||
|
fan_speed = None
|
||
|
self._device.turn_on(fan_speed=fan_speed, mode=preset_mode)
|
||
|
|
||
|
@property
|
||
|
def preset_modes(self):
|
||
|
return self._device.preset_modes if hasattr(self._device, "preset_modes") else None
|
||
|
|
||
|
@property
|
||
|
def state(self):
|
||
|
return STATE_ON if self._device.get_attribute("power") else STATE_OFF
|
||
|
|
||
|
@property
|
||
|
def is_on(self) -> bool:
|
||
|
return self.state == STATE_ON
|
||
|
|
||
|
@property
|
||
|
def oscillating(self):
|
||
|
return self._device.get_attribute("oscillate")
|
||
|
|
||
|
@property
|
||
|
def preset_mode(self):
|
||
|
return self._device.get_attribute("mode")
|
||
|
|
||
|
@property
|
||
|
def fan_speed(self):
|
||
|
return self._device.get_attribute("fan_speed")
|
||
|
|
||
|
def turn_off(self):
|
||
|
self._device.set_attribute(attr="power", value=False)
|
||
|
|
||
|
def toggle(self):
|
||
|
toggle = not self.is_on
|
||
|
self._device.set_attribute(attr="power", value=toggle)
|
||
|
|
||
|
def oscillate(self, oscillating: bool):
|
||
|
self._device.set_attribute(attr="oscillate", value=oscillating)
|
||
|
|
||
|
def set_preset_mode(self, preset_mode: str):
|
||
|
self._device.set_attribute(attr="mode", value=preset_mode.capitalize())
|
||
|
|
||
|
@property
|
||
|
def percentage(self):
|
||
|
return round(self.fan_speed * self.percentage_step)
|
||
|
|
||
|
def set_percentage(self, percentage: int):
|
||
|
fan_speed = round(percentage / self.percentage_step)
|
||
|
self._device.set_attribute(attr="fan_speed", value=fan_speed)
|
||
|
|
||
|
async def async_set_percentage(self, percentage: int):
|
||
|
if percentage == 0:
|
||
|
await self.async_turn_off()
|
||
|
else:
|
||
|
await self.hass.async_add_executor_job(self.set_percentage, percentage)
|
||
|
|
||
|
def update_state(self, status):
|
||
|
try:
|
||
|
self.schedule_update_ha_state()
|
||
|
except Exception as e:
|
||
|
_LOGGER.debug(f"Entity {self.entity_id} update_state {repr(e)}, status = {status}")
|
||
|
|
||
|
|
||
|
class MideaFAFan(MideaFan):
|
||
|
def __init__(self, device, entity_key):
|
||
|
super().__init__(device, entity_key)
|
||
|
self._attr_supported_features = SUPPORT_SET_SPEED | SUPPORT_OSCILLATE | SUPPORT_PRESET_MODE
|
||
|
self._attr_speed_count = self._device.speed_count
|
||
|
|
||
|
|
||
|
class MideaB6Fan(MideaFan):
|
||
|
def __init__(self, device, entity_key):
|
||
|
super().__init__(device, entity_key)
|
||
|
self._attr_supported_features = SUPPORT_SET_SPEED | SUPPORT_PRESET_MODE
|
||
|
self._attr_speed_count = self._device.speed_count
|
||
|
|
||
|
|
||
|
class MideaACFreshAirFan(MideaFan):
|
||
|
def __init__(self, device, entity_key):
|
||
|
super().__init__(device, entity_key)
|
||
|
self._attr_supported_features = SUPPORT_SET_SPEED | SUPPORT_PRESET_MODE
|
||
|
self._attr_speed_count = 100
|
||
|
|
||
|
@property
|
||
|
def preset_modes(self):
|
||
|
return self._device.fresh_air_fan_speeds
|
||
|
|
||
|
@property
|
||
|
def state(self):
|
||
|
return STATE_ON if self._device.get_attribute(ACAttributes.fresh_air_power) else STATE_OFF
|
||
|
|
||
|
@property
|
||
|
def is_on(self) -> bool:
|
||
|
return self.state == STATE_ON
|
||
|
|
||
|
@property
|
||
|
def fan_speed(self):
|
||
|
return self._device.get_attribute(ACAttributes.fresh_air_fan_speed)
|
||
|
|
||
|
def turn_on(self, percentage, preset_mode, **kwargs):
|
||
|
self._device.set_attribute(attr=ACAttributes.fresh_air_power, value=True)
|
||
|
|
||
|
def turn_off(self):
|
||
|
self._device.set_attribute(attr=ACAttributes.fresh_air_power, value=False)
|
||
|
|
||
|
def toggle(self):
|
||
|
toggle = not self.is_on
|
||
|
self._device.set_attribute(attr=ACAttributes.fresh_air_power, value=toggle)
|
||
|
|
||
|
def set_percentage(self, percentage: int):
|
||
|
fan_speed = int(percentage / self.percentage_step + 0.5)
|
||
|
self._device.set_attribute(attr=ACAttributes.fresh_air_fan_speed, value=fan_speed)
|
||
|
|
||
|
def set_preset_mode(self, preset_mode: str):
|
||
|
self._device.set_attribute(attr=ACAttributes.fresh_air_mode, value=preset_mode)
|
||
|
|
||
|
@property
|
||
|
def preset_mode(self):
|
||
|
return self._device.get_attribute(attr=ACAttributes.fresh_air_mode)
|
||
|
|
||
|
|
||
|
class MideaCEFan(MideaFan):
|
||
|
def __init__(self, device, entity_key):
|
||
|
super().__init__(device, entity_key)
|
||
|
self._attr_supported_features = SUPPORT_SET_SPEED | SUPPORT_PRESET_MODE
|
||
|
self._attr_speed_count = self._device.speed_count
|
||
|
|
||
|
def turn_on(self, percentage, preset_mode, **kwargs):
|
||
|
self._device.set_attribute(attr=CEAttributes.power, value=True)
|
||
|
|
||
|
async def async_set_percentage(self, percentage: int):
|
||
|
await self.hass.async_add_executor_job(self.set_percentage, percentage)
|
||
|
|
||
|
|
||
|
class Midea40Fan(MideaFan):
|
||
|
def __init__(self, device, entity_key):
|
||
|
super().__init__(device, entity_key)
|
||
|
self._attr_supported_features = SUPPORT_SET_SPEED | SUPPORT_OSCILLATE
|
||
|
self._attr_speed_count = 2
|
||
|
|
||
|
@property
|
||
|
def state(self):
|
||
|
return STATE_ON if self._device.get_attribute(attr=X40Attributes.fan_speed) > 0 else STATE_OFF
|
||
|
|
||
|
def turn_on(self, percentage, preset_mode, **kwargs):
|
||
|
self._device.set_attribute(attr=X40Attributes.fan_speed, value=1)
|
||
|
|
||
|
def turn_off(self):
|
||
|
self._device.set_attribute(attr=X40Attributes.fan_speed, value=0)
|