Add switch
platform for Xiaomi Miio fans (#54834)
This commit is contained in:
parent
5e8c873d5f
commit
fe6c896754
5 changed files with 123 additions and 383 deletions
|
@ -34,15 +34,17 @@ from .const import (
|
|||
CONF_DEVICE,
|
||||
CONF_FLOW_TYPE,
|
||||
DOMAIN,
|
||||
FEATURE_FLAGS_AIRFRESH,
|
||||
FEATURE_FLAGS_AIRPURIFIER_2S,
|
||||
FEATURE_FLAGS_AIRPURIFIER_MIIO,
|
||||
FEATURE_FLAGS_AIRPURIFIER_MIOT,
|
||||
FEATURE_FLAGS_AIRPURIFIER_PRO,
|
||||
FEATURE_FLAGS_AIRPURIFIER_PRO_V7,
|
||||
FEATURE_FLAGS_AIRPURIFIER_V3,
|
||||
FEATURE_RESET_FILTER,
|
||||
FEATURE_SET_AUTO_DETECT,
|
||||
FEATURE_SET_BUZZER,
|
||||
FEATURE_SET_CHILD_LOCK,
|
||||
FEATURE_SET_EXTRA_FEATURES,
|
||||
FEATURE_SET_FAN_LEVEL,
|
||||
FEATURE_SET_FAVORITE_LEVEL,
|
||||
FEATURE_SET_LEARN_MODE,
|
||||
FEATURE_SET_LED,
|
||||
FEATURE_SET_VOLUME,
|
||||
KEY_COORDINATOR,
|
||||
KEY_DEVICE,
|
||||
|
@ -54,19 +56,9 @@ from .const import (
|
|||
MODELS_FAN,
|
||||
MODELS_PURIFIER_MIOT,
|
||||
SERVICE_RESET_FILTER,
|
||||
SERVICE_SET_AUTO_DETECT_OFF,
|
||||
SERVICE_SET_AUTO_DETECT_ON,
|
||||
SERVICE_SET_BUZZER_OFF,
|
||||
SERVICE_SET_BUZZER_ON,
|
||||
SERVICE_SET_CHILD_LOCK_OFF,
|
||||
SERVICE_SET_CHILD_LOCK_ON,
|
||||
SERVICE_SET_EXTRA_FEATURES,
|
||||
SERVICE_SET_FAN_LED_OFF,
|
||||
SERVICE_SET_FAN_LED_ON,
|
||||
SERVICE_SET_FAN_LEVEL,
|
||||
SERVICE_SET_FAVORITE_LEVEL,
|
||||
SERVICE_SET_LEARN_MODE_OFF,
|
||||
SERVICE_SET_LEARN_MODE_ON,
|
||||
SERVICE_SET_VOLUME,
|
||||
)
|
||||
from .device import XiaomiCoordinatedMiioEntity
|
||||
|
@ -91,21 +83,15 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
|
|||
ATTR_MODEL = "model"
|
||||
|
||||
# Air Purifier
|
||||
ATTR_FILTER_LIFE = "filter_life_remaining"
|
||||
ATTR_FAVORITE_LEVEL = "favorite_level"
|
||||
ATTR_BUZZER = "buzzer"
|
||||
ATTR_CHILD_LOCK = "child_lock"
|
||||
ATTR_LED = "led"
|
||||
ATTR_BRIGHTNESS = "brightness"
|
||||
ATTR_LEVEL = "level"
|
||||
ATTR_FAN_LEVEL = "fan_level"
|
||||
ATTR_LEARN_MODE = "learn_mode"
|
||||
ATTR_SLEEP_TIME = "sleep_time"
|
||||
ATTR_SLEEP_LEARN_COUNT = "sleep_mode_learn_count"
|
||||
ATTR_EXTRA_FEATURES = "extra_features"
|
||||
ATTR_FEATURES = "features"
|
||||
ATTR_TURBO_MODE_SUPPORTED = "turbo_mode_supported"
|
||||
ATTR_AUTO_DETECT = "auto_detect"
|
||||
ATTR_SLEEP_MODE = "sleep_mode"
|
||||
ATTR_VOLUME = "volume"
|
||||
ATTR_USE_TIME = "use_time"
|
||||
|
@ -115,9 +101,6 @@ ATTR_BUTTON_PRESSED = "button_pressed"
|
|||
AVAILABLE_ATTRIBUTES_AIRPURIFIER_COMMON = {
|
||||
ATTR_MODE: "mode",
|
||||
ATTR_FAVORITE_LEVEL: "favorite_level",
|
||||
ATTR_CHILD_LOCK: "child_lock",
|
||||
ATTR_LED: "led",
|
||||
ATTR_LEARN_MODE: "learn_mode",
|
||||
ATTR_EXTRA_FEATURES: "extra_features",
|
||||
ATTR_TURBO_MODE_SUPPORTED: "turbo_mode_supported",
|
||||
ATTR_BUTTON_PRESSED: "button_pressed",
|
||||
|
@ -127,9 +110,7 @@ AVAILABLE_ATTRIBUTES_AIRPURIFIER = {
|
|||
**AVAILABLE_ATTRIBUTES_AIRPURIFIER_COMMON,
|
||||
ATTR_SLEEP_TIME: "sleep_time",
|
||||
ATTR_SLEEP_LEARN_COUNT: "sleep_mode_learn_count",
|
||||
ATTR_AUTO_DETECT: "auto_detect",
|
||||
ATTR_USE_TIME: "use_time",
|
||||
ATTR_BUZZER: "buzzer",
|
||||
ATTR_SLEEP_MODE: "sleep_mode",
|
||||
}
|
||||
|
||||
|
@ -137,57 +118,41 @@ AVAILABLE_ATTRIBUTES_AIRPURIFIER_PRO = {
|
|||
**AVAILABLE_ATTRIBUTES_AIRPURIFIER_COMMON,
|
||||
ATTR_USE_TIME: "use_time",
|
||||
ATTR_VOLUME: "volume",
|
||||
ATTR_AUTO_DETECT: "auto_detect",
|
||||
ATTR_SLEEP_TIME: "sleep_time",
|
||||
ATTR_SLEEP_LEARN_COUNT: "sleep_mode_learn_count",
|
||||
}
|
||||
|
||||
AVAILABLE_ATTRIBUTES_AIRPURIFIER_MIOT = {
|
||||
ATTR_MODE: "mode",
|
||||
ATTR_FAVORITE_LEVEL: "favorite_level",
|
||||
ATTR_USE_TIME: "use_time",
|
||||
ATTR_FAN_LEVEL: "fan_level",
|
||||
}
|
||||
|
||||
AVAILABLE_ATTRIBUTES_AIRPURIFIER_PRO_V7 = {
|
||||
**AVAILABLE_ATTRIBUTES_AIRPURIFIER_COMMON,
|
||||
ATTR_VOLUME: "volume",
|
||||
}
|
||||
|
||||
AVAILABLE_ATTRIBUTES_AIRPURIFIER_2S = {
|
||||
**AVAILABLE_ATTRIBUTES_AIRPURIFIER_COMMON,
|
||||
ATTR_BUZZER: "buzzer",
|
||||
}
|
||||
|
||||
AVAILABLE_ATTRIBUTES_AIRPURIFIER_3 = {
|
||||
ATTR_MODE: "mode",
|
||||
ATTR_FAVORITE_LEVEL: "favorite_level",
|
||||
ATTR_CHILD_LOCK: "child_lock",
|
||||
ATTR_LED: "led",
|
||||
ATTR_USE_TIME: "use_time",
|
||||
ATTR_BUZZER: "buzzer",
|
||||
ATTR_FAN_LEVEL: "fan_level",
|
||||
}
|
||||
|
||||
AVAILABLE_ATTRIBUTES_AIRPURIFIER_V3 = {
|
||||
# Common set isn't used here. It's a very basic version of the device.
|
||||
ATTR_MODE: "mode",
|
||||
ATTR_LED: "led",
|
||||
ATTR_BUZZER: "buzzer",
|
||||
ATTR_CHILD_LOCK: "child_lock",
|
||||
ATTR_VOLUME: "volume",
|
||||
ATTR_LEARN_MODE: "learn_mode",
|
||||
ATTR_SLEEP_TIME: "sleep_time",
|
||||
ATTR_SLEEP_LEARN_COUNT: "sleep_mode_learn_count",
|
||||
ATTR_EXTRA_FEATURES: "extra_features",
|
||||
ATTR_AUTO_DETECT: "auto_detect",
|
||||
ATTR_USE_TIME: "use_time",
|
||||
ATTR_BUTTON_PRESSED: "button_pressed",
|
||||
}
|
||||
|
||||
AVAILABLE_ATTRIBUTES_AIRFRESH = {
|
||||
ATTR_MODE: "mode",
|
||||
ATTR_LED: "led",
|
||||
ATTR_BUZZER: "buzzer",
|
||||
ATTR_CHILD_LOCK: "child_lock",
|
||||
ATTR_USE_TIME: "use_time",
|
||||
ATTR_EXTRA_FEATURES: "extra_features",
|
||||
}
|
||||
|
||||
PRESET_MODES_AIRPURIFIER = ["Auto", "Silent", "Favorite", "Idle"]
|
||||
PRESET_MODES_AIRPURIFIER_MIOT = ["Auto", "Silent", "Favorite", "Fan"]
|
||||
OPERATION_MODES_AIRPURIFIER_PRO = ["Auto", "Silent", "Favorite"]
|
||||
PRESET_MODES_AIRPURIFIER_PRO = ["Auto", "Silent", "Favorite"]
|
||||
OPERATION_MODES_AIRPURIFIER_PRO_V7 = OPERATION_MODES_AIRPURIFIER_PRO
|
||||
|
@ -195,7 +160,6 @@ PRESET_MODES_AIRPURIFIER_PRO_V7 = PRESET_MODES_AIRPURIFIER_PRO
|
|||
OPERATION_MODES_AIRPURIFIER_2S = ["Auto", "Silent", "Favorite"]
|
||||
PRESET_MODES_AIRPURIFIER_2S = ["Auto", "Silent", "Favorite"]
|
||||
OPERATION_MODES_AIRPURIFIER_3 = ["Auto", "Silent", "Favorite", "Fan"]
|
||||
PRESET_MODES_AIRPURIFIER_3 = ["Auto", "Silent", "Favorite", "Fan"]
|
||||
OPERATION_MODES_AIRPURIFIER_V3 = [
|
||||
"Auto",
|
||||
"Silent",
|
||||
|
@ -217,58 +181,6 @@ PRESET_MODES_AIRPURIFIER_V3 = [
|
|||
OPERATION_MODES_AIRFRESH = ["Auto", "Silent", "Interval", "Low", "Middle", "Strong"]
|
||||
PRESET_MODES_AIRFRESH = ["Auto", "Interval"]
|
||||
|
||||
FEATURE_FLAGS_AIRPURIFIER = (
|
||||
FEATURE_SET_BUZZER
|
||||
| FEATURE_SET_CHILD_LOCK
|
||||
| FEATURE_SET_LED
|
||||
| FEATURE_SET_FAVORITE_LEVEL
|
||||
| FEATURE_SET_LEARN_MODE
|
||||
| FEATURE_RESET_FILTER
|
||||
| FEATURE_SET_EXTRA_FEATURES
|
||||
)
|
||||
|
||||
FEATURE_FLAGS_AIRPURIFIER_PRO = (
|
||||
FEATURE_SET_CHILD_LOCK
|
||||
| FEATURE_SET_LED
|
||||
| FEATURE_SET_FAVORITE_LEVEL
|
||||
| FEATURE_SET_AUTO_DETECT
|
||||
| FEATURE_SET_VOLUME
|
||||
)
|
||||
|
||||
FEATURE_FLAGS_AIRPURIFIER_PRO_V7 = (
|
||||
FEATURE_SET_CHILD_LOCK
|
||||
| FEATURE_SET_LED
|
||||
| FEATURE_SET_FAVORITE_LEVEL
|
||||
| FEATURE_SET_VOLUME
|
||||
)
|
||||
|
||||
FEATURE_FLAGS_AIRPURIFIER_2S = (
|
||||
FEATURE_SET_BUZZER
|
||||
| FEATURE_SET_CHILD_LOCK
|
||||
| FEATURE_SET_LED
|
||||
| FEATURE_SET_FAVORITE_LEVEL
|
||||
)
|
||||
|
||||
FEATURE_FLAGS_AIRPURIFIER_3 = (
|
||||
FEATURE_SET_BUZZER
|
||||
| FEATURE_SET_CHILD_LOCK
|
||||
| FEATURE_SET_LED
|
||||
| FEATURE_SET_FAVORITE_LEVEL
|
||||
| FEATURE_SET_FAN_LEVEL
|
||||
)
|
||||
|
||||
FEATURE_FLAGS_AIRPURIFIER_V3 = (
|
||||
FEATURE_SET_BUZZER | FEATURE_SET_CHILD_LOCK | FEATURE_SET_LED
|
||||
)
|
||||
|
||||
FEATURE_FLAGS_AIRFRESH = (
|
||||
FEATURE_SET_BUZZER
|
||||
| FEATURE_SET_CHILD_LOCK
|
||||
| FEATURE_SET_LED
|
||||
| FEATURE_RESET_FILTER
|
||||
| FEATURE_SET_EXTRA_FEATURES
|
||||
)
|
||||
|
||||
AIRPURIFIER_SERVICE_SCHEMA = vol.Schema({vol.Optional(ATTR_ENTITY_ID): cv.entity_ids})
|
||||
|
||||
SERVICE_SCHEMA_FAVORITE_LEVEL = AIRPURIFIER_SERVICE_SCHEMA.extend(
|
||||
|
@ -288,16 +200,6 @@ SERVICE_SCHEMA_EXTRA_FEATURES = AIRPURIFIER_SERVICE_SCHEMA.extend(
|
|||
)
|
||||
|
||||
SERVICE_TO_METHOD = {
|
||||
SERVICE_SET_BUZZER_ON: {"method": "async_set_buzzer_on"},
|
||||
SERVICE_SET_BUZZER_OFF: {"method": "async_set_buzzer_off"},
|
||||
SERVICE_SET_FAN_LED_ON: {"method": "async_set_led_on"},
|
||||
SERVICE_SET_FAN_LED_OFF: {"method": "async_set_led_off"},
|
||||
SERVICE_SET_CHILD_LOCK_ON: {"method": "async_set_child_lock_on"},
|
||||
SERVICE_SET_CHILD_LOCK_OFF: {"method": "async_set_child_lock_off"},
|
||||
SERVICE_SET_AUTO_DETECT_ON: {"method": "async_set_auto_detect_on"},
|
||||
SERVICE_SET_AUTO_DETECT_OFF: {"method": "async_set_auto_detect_off"},
|
||||
SERVICE_SET_LEARN_MODE_ON: {"method": "async_set_learn_mode_on"},
|
||||
SERVICE_SET_LEARN_MODE_OFF: {"method": "async_set_learn_mode_off"},
|
||||
SERVICE_RESET_FILTER: {"method": "async_reset_filter"},
|
||||
SERVICE_SET_FAVORITE_LEVEL: {
|
||||
"method": "async_set_favorite_level",
|
||||
|
@ -416,7 +318,7 @@ class XiaomiGenericDevice(XiaomiCoordinatedMiioEntity, FanEntity):
|
|||
self._mode = None
|
||||
self._fan_level = None
|
||||
self._state_attrs = {ATTR_MODEL: self._model}
|
||||
self._device_features = FEATURE_SET_CHILD_LOCK
|
||||
self._device_features = 0
|
||||
self._supported_features = 0
|
||||
self._speed_count = 100
|
||||
self._preset_modes = []
|
||||
|
@ -528,50 +430,6 @@ class XiaomiGenericDevice(XiaomiCoordinatedMiioEntity, FanEntity):
|
|||
self._state = False
|
||||
self.async_write_ha_state()
|
||||
|
||||
async def async_set_buzzer_on(self):
|
||||
"""Turn the buzzer on."""
|
||||
if self._device_features & FEATURE_SET_BUZZER == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the buzzer of the miio device on failed.",
|
||||
self._device.set_buzzer,
|
||||
True,
|
||||
)
|
||||
|
||||
async def async_set_buzzer_off(self):
|
||||
"""Turn the buzzer off."""
|
||||
if self._device_features & FEATURE_SET_BUZZER == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the buzzer of the miio device off failed.",
|
||||
self._device.set_buzzer,
|
||||
False,
|
||||
)
|
||||
|
||||
async def async_set_child_lock_on(self):
|
||||
"""Turn the child lock on."""
|
||||
if self._device_features & FEATURE_SET_CHILD_LOCK == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the child lock of the miio device on failed.",
|
||||
self._device.set_child_lock,
|
||||
True,
|
||||
)
|
||||
|
||||
async def async_set_child_lock_off(self):
|
||||
"""Turn the child lock off."""
|
||||
if self._device_features & FEATURE_SET_CHILD_LOCK == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the child lock of the miio device off failed.",
|
||||
self._device.set_child_lock,
|
||||
False,
|
||||
)
|
||||
|
||||
|
||||
class XiaomiAirPurifier(XiaomiGenericDevice):
|
||||
"""Representation of a Xiaomi Air Purifier."""
|
||||
|
@ -610,14 +468,14 @@ class XiaomiAirPurifier(XiaomiGenericDevice):
|
|||
self._speed_count = 1
|
||||
elif self._model in [MODEL_AIRPURIFIER_2S, MODEL_AIRPURIFIER_2H]:
|
||||
self._device_features = FEATURE_FLAGS_AIRPURIFIER_2S
|
||||
self._available_attributes = AVAILABLE_ATTRIBUTES_AIRPURIFIER_2S
|
||||
self._available_attributes = AVAILABLE_ATTRIBUTES_AIRPURIFIER_COMMON
|
||||
self._preset_modes = PRESET_MODES_AIRPURIFIER_2S
|
||||
self._supported_features = SUPPORT_PRESET_MODE
|
||||
self._speed_count = 1
|
||||
elif self._model in MODELS_PURIFIER_MIOT:
|
||||
self._device_features = FEATURE_FLAGS_AIRPURIFIER_3
|
||||
self._available_attributes = AVAILABLE_ATTRIBUTES_AIRPURIFIER_3
|
||||
self._preset_modes = PRESET_MODES_AIRPURIFIER_3
|
||||
self._device_features = FEATURE_FLAGS_AIRPURIFIER_MIOT
|
||||
self._available_attributes = AVAILABLE_ATTRIBUTES_AIRPURIFIER_MIOT
|
||||
self._preset_modes = PRESET_MODES_AIRPURIFIER_MIOT
|
||||
self._supported_features = SUPPORT_SET_SPEED | SUPPORT_PRESET_MODE
|
||||
self._speed_count = 3
|
||||
elif self._model == MODEL_AIRPURIFIER_V3:
|
||||
|
@ -627,7 +485,7 @@ class XiaomiAirPurifier(XiaomiGenericDevice):
|
|||
self._supported_features = SUPPORT_PRESET_MODE
|
||||
self._speed_count = 1
|
||||
else:
|
||||
self._device_features = FEATURE_FLAGS_AIRPURIFIER
|
||||
self._device_features = FEATURE_FLAGS_AIRPURIFIER_MIIO
|
||||
self._available_attributes = AVAILABLE_ATTRIBUTES_AIRPURIFIER
|
||||
self._preset_modes = PRESET_MODES_AIRPURIFIER
|
||||
self._supported_features = SUPPORT_PRESET_MODE
|
||||
|
@ -689,26 +547,6 @@ class XiaomiAirPurifier(XiaomiGenericDevice):
|
|||
self.PRESET_MODE_MAPPING[preset_mode],
|
||||
)
|
||||
|
||||
async def async_set_led_on(self):
|
||||
"""Turn the led on."""
|
||||
if self._device_features & FEATURE_SET_LED == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the led of the miio device off failed.", self._device.set_led, True
|
||||
)
|
||||
|
||||
async def async_set_led_off(self):
|
||||
"""Turn the led off."""
|
||||
if self._device_features & FEATURE_SET_LED == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the led of the miio device off failed.",
|
||||
self._device.set_led,
|
||||
False,
|
||||
)
|
||||
|
||||
async def async_set_favorite_level(self, level: int = 1):
|
||||
"""Set the favorite level."""
|
||||
if self._device_features & FEATURE_SET_FAVORITE_LEVEL == 0:
|
||||
|
@ -731,50 +569,6 @@ class XiaomiAirPurifier(XiaomiGenericDevice):
|
|||
level,
|
||||
)
|
||||
|
||||
async def async_set_auto_detect_on(self):
|
||||
"""Turn the auto detect on."""
|
||||
if self._device_features & FEATURE_SET_AUTO_DETECT == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the auto detect of the miio device on failed.",
|
||||
self._device.set_auto_detect,
|
||||
True,
|
||||
)
|
||||
|
||||
async def async_set_auto_detect_off(self):
|
||||
"""Turn the auto detect off."""
|
||||
if self._device_features & FEATURE_SET_AUTO_DETECT == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the auto detect of the miio device off failed.",
|
||||
self._device.set_auto_detect,
|
||||
False,
|
||||
)
|
||||
|
||||
async def async_set_learn_mode_on(self):
|
||||
"""Turn the learn mode on."""
|
||||
if self._device_features & FEATURE_SET_LEARN_MODE == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the learn mode of the miio device on failed.",
|
||||
self._device.set_learn_mode,
|
||||
True,
|
||||
)
|
||||
|
||||
async def async_set_learn_mode_off(self):
|
||||
"""Turn the learn mode off."""
|
||||
if self._device_features & FEATURE_SET_LEARN_MODE == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the learn mode of the miio device off failed.",
|
||||
self._device.set_learn_mode,
|
||||
False,
|
||||
)
|
||||
|
||||
async def async_set_volume(self, volume: int = 50):
|
||||
"""Set the sound volume."""
|
||||
if self._device_features & FEATURE_SET_VOLUME == 0:
|
||||
|
@ -955,26 +749,6 @@ class XiaomiAirFresh(XiaomiGenericDevice):
|
|||
self._mode = self.PRESET_MODE_MAPPING[preset_mode].value
|
||||
self.async_write_ha_state()
|
||||
|
||||
async def async_set_led_on(self):
|
||||
"""Turn the led on."""
|
||||
if self._device_features & FEATURE_SET_LED == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the led of the miio device off failed.", self._device.set_led, True
|
||||
)
|
||||
|
||||
async def async_set_led_off(self):
|
||||
"""Turn the led off."""
|
||||
if self._device_features & FEATURE_SET_LED == 0:
|
||||
return
|
||||
|
||||
await self._try_command(
|
||||
"Turning the led of the miio device off failed.",
|
||||
self._device.set_led,
|
||||
False,
|
||||
)
|
||||
|
||||
async def async_set_extra_features(self, features: int = 1):
|
||||
"""Set the extra features."""
|
||||
if self._device_features & FEATURE_SET_EXTRA_FEATURES == 0:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue