Add select platform for Xiaomi Miio fans (#54702)

* Add select platform for Xiaomi Miio purifiers

* Add missing condition for AirFresh

* Suggested change

* Remove fan_set_led_brightness from services.yaml

* Remove zhimi.airpurifier.v3
This commit is contained in:
Maciej Bieniek 2021-08-18 11:24:15 +02:00 committed by GitHub
parent 102af02d8a
commit c937a235e1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 73 additions and 98 deletions

View File

@ -46,7 +46,7 @@ _LOGGER = logging.getLogger(__name__)
GATEWAY_PLATFORMS = ["alarm_control_panel", "light", "sensor", "switch"] GATEWAY_PLATFORMS = ["alarm_control_panel", "light", "sensor", "switch"]
SWITCH_PLATFORMS = ["switch"] SWITCH_PLATFORMS = ["switch"]
FAN_PLATFORMS = ["fan", "sensor"] FAN_PLATFORMS = ["fan", "select", "sensor"]
HUMIDIFIER_PLATFORMS = [ HUMIDIFIER_PLATFORMS = [
"binary_sensor", "binary_sensor",
"humidifier", "humidifier",

View File

@ -159,10 +159,8 @@ SERVICE_SET_BUZZER_OFF = "fan_set_buzzer_off"
SERVICE_SET_FAN_LED_ON = "fan_set_led_on" SERVICE_SET_FAN_LED_ON = "fan_set_led_on"
SERVICE_SET_FAN_LED_OFF = "fan_set_led_off" SERVICE_SET_FAN_LED_OFF = "fan_set_led_off"
SERVICE_SET_FAN_LED = "fan_set_led" SERVICE_SET_FAN_LED = "fan_set_led"
SERVICE_SET_LED_BRIGHTNESS = "set_led_brightness"
SERVICE_SET_CHILD_LOCK_ON = "fan_set_child_lock_on" SERVICE_SET_CHILD_LOCK_ON = "fan_set_child_lock_on"
SERVICE_SET_CHILD_LOCK_OFF = "fan_set_child_lock_off" SERVICE_SET_CHILD_LOCK_OFF = "fan_set_child_lock_off"
SERVICE_SET_LED_BRIGHTNESS = "fan_set_led_brightness"
SERVICE_SET_FAVORITE_LEVEL = "fan_set_favorite_level" SERVICE_SET_FAVORITE_LEVEL = "fan_set_favorite_level"
SERVICE_SET_FAN_LEVEL = "fan_set_fan_level" SERVICE_SET_FAN_LEVEL = "fan_set_fan_level"
SERVICE_SET_AUTO_DETECT_ON = "fan_set_auto_detect_on" SERVICE_SET_AUTO_DETECT_ON = "fan_set_auto_detect_on"
@ -226,7 +224,6 @@ FEATURE_FLAGS_AIRPURIFIER = (
FEATURE_SET_BUZZER FEATURE_SET_BUZZER
| FEATURE_SET_CHILD_LOCK | FEATURE_SET_CHILD_LOCK
| FEATURE_SET_LED | FEATURE_SET_LED
| FEATURE_SET_LED_BRIGHTNESS
| FEATURE_SET_FAVORITE_LEVEL | FEATURE_SET_FAVORITE_LEVEL
| FEATURE_SET_LEARN_MODE | FEATURE_SET_LEARN_MODE
| FEATURE_RESET_FILTER | FEATURE_RESET_FILTER
@ -261,7 +258,6 @@ FEATURE_FLAGS_AIRPURIFIER_3 = (
| FEATURE_SET_LED | FEATURE_SET_LED
| FEATURE_SET_FAVORITE_LEVEL | FEATURE_SET_FAVORITE_LEVEL
| FEATURE_SET_FAN_LEVEL | FEATURE_SET_FAN_LEVEL
| FEATURE_SET_LED_BRIGHTNESS
) )
FEATURE_FLAGS_AIRPURIFIER_V3 = ( FEATURE_FLAGS_AIRPURIFIER_V3 = (
@ -269,10 +265,7 @@ FEATURE_FLAGS_AIRPURIFIER_V3 = (
) )
FEATURE_FLAGS_AIRHUMIDIFIER = ( FEATURE_FLAGS_AIRHUMIDIFIER = (
FEATURE_SET_BUZZER FEATURE_SET_BUZZER | FEATURE_SET_CHILD_LOCK | FEATURE_SET_TARGET_HUMIDITY
| FEATURE_SET_CHILD_LOCK
| FEATURE_SET_LED_BRIGHTNESS
| FEATURE_SET_TARGET_HUMIDITY
) )
FEATURE_FLAGS_AIRHUMIDIFIER_CA_AND_CB = FEATURE_FLAGS_AIRHUMIDIFIER | FEATURE_SET_DRY FEATURE_FLAGS_AIRHUMIDIFIER_CA_AND_CB = FEATURE_FLAGS_AIRHUMIDIFIER | FEATURE_SET_DRY
@ -284,7 +277,6 @@ FEATURE_FLAGS_AIRHUMIDIFIER_MJSSQ = (
FEATURE_FLAGS_AIRHUMIDIFIER_CA4 = ( FEATURE_FLAGS_AIRHUMIDIFIER_CA4 = (
FEATURE_SET_BUZZER FEATURE_SET_BUZZER
| FEATURE_SET_CHILD_LOCK | FEATURE_SET_CHILD_LOCK
| FEATURE_SET_LED_BRIGHTNESS
| FEATURE_SET_TARGET_HUMIDITY | FEATURE_SET_TARGET_HUMIDITY
| FEATURE_SET_DRY | FEATURE_SET_DRY
| FEATURE_SET_MOTOR_SPEED | FEATURE_SET_MOTOR_SPEED
@ -295,7 +287,6 @@ FEATURE_FLAGS_AIRFRESH = (
FEATURE_SET_BUZZER FEATURE_SET_BUZZER
| FEATURE_SET_CHILD_LOCK | FEATURE_SET_CHILD_LOCK
| FEATURE_SET_LED | FEATURE_SET_LED
| FEATURE_SET_LED_BRIGHTNESS
| FEATURE_RESET_FILTER | FEATURE_RESET_FILTER
| FEATURE_SET_EXTRA_FEATURES | FEATURE_SET_EXTRA_FEATURES
) )

View File

@ -4,18 +4,9 @@ from enum import Enum
import logging import logging
import math import math
from miio.airfresh import ( from miio.airfresh import OperationMode as AirfreshOperationMode
LedBrightness as AirfreshLedBrightness, from miio.airpurifier import OperationMode as AirpurifierOperationMode
OperationMode as AirfreshOperationMode, from miio.airpurifier_miot import OperationMode as AirpurifierMiotOperationMode
)
from miio.airpurifier import (
LedBrightness as AirpurifierLedBrightness,
OperationMode as AirpurifierOperationMode,
)
from miio.airpurifier_miot import (
LedBrightness as AirpurifierMiotLedBrightness,
OperationMode as AirpurifierMiotOperationMode,
)
import voluptuous as vol import voluptuous as vol
from homeassistant.components.fan import ( from homeassistant.components.fan import (
@ -52,7 +43,6 @@ from .const import (
FEATURE_SET_FAVORITE_LEVEL, FEATURE_SET_FAVORITE_LEVEL,
FEATURE_SET_LEARN_MODE, FEATURE_SET_LEARN_MODE,
FEATURE_SET_LED, FEATURE_SET_LED,
FEATURE_SET_LED_BRIGHTNESS,
FEATURE_SET_VOLUME, FEATURE_SET_VOLUME,
KEY_COORDINATOR, KEY_COORDINATOR,
KEY_DEVICE, KEY_DEVICE,
@ -77,7 +67,6 @@ from .const import (
SERVICE_SET_FAVORITE_LEVEL, SERVICE_SET_FAVORITE_LEVEL,
SERVICE_SET_LEARN_MODE_OFF, SERVICE_SET_LEARN_MODE_OFF,
SERVICE_SET_LEARN_MODE_ON, SERVICE_SET_LEARN_MODE_ON,
SERVICE_SET_LED_BRIGHTNESS,
SERVICE_SET_VOLUME, SERVICE_SET_VOLUME,
) )
from .device import XiaomiCoordinatedMiioEntity from .device import XiaomiCoordinatedMiioEntity
@ -107,7 +96,6 @@ ATTR_FAVORITE_LEVEL = "favorite_level"
ATTR_BUZZER = "buzzer" ATTR_BUZZER = "buzzer"
ATTR_CHILD_LOCK = "child_lock" ATTR_CHILD_LOCK = "child_lock"
ATTR_LED = "led" ATTR_LED = "led"
ATTR_LED_BRIGHTNESS = "led_brightness"
ATTR_BRIGHTNESS = "brightness" ATTR_BRIGHTNESS = "brightness"
ATTR_LEVEL = "level" ATTR_LEVEL = "level"
ATTR_FAN_LEVEL = "fan_level" ATTR_FAN_LEVEL = "fan_level"
@ -142,7 +130,6 @@ AVAILABLE_ATTRIBUTES_AIRPURIFIER = {
ATTR_AUTO_DETECT: "auto_detect", ATTR_AUTO_DETECT: "auto_detect",
ATTR_USE_TIME: "use_time", ATTR_USE_TIME: "use_time",
ATTR_BUZZER: "buzzer", ATTR_BUZZER: "buzzer",
ATTR_LED_BRIGHTNESS: "led_brightness",
ATTR_SLEEP_MODE: "sleep_mode", ATTR_SLEEP_MODE: "sleep_mode",
} }
@ -172,7 +159,6 @@ AVAILABLE_ATTRIBUTES_AIRPURIFIER_3 = {
ATTR_LED: "led", ATTR_LED: "led",
ATTR_USE_TIME: "use_time", ATTR_USE_TIME: "use_time",
ATTR_BUZZER: "buzzer", ATTR_BUZZER: "buzzer",
ATTR_LED_BRIGHTNESS: "led_brightness",
ATTR_FAN_LEVEL: "fan_level", ATTR_FAN_LEVEL: "fan_level",
} }
@ -195,7 +181,6 @@ AVAILABLE_ATTRIBUTES_AIRPURIFIER_V3 = {
AVAILABLE_ATTRIBUTES_AIRFRESH = { AVAILABLE_ATTRIBUTES_AIRFRESH = {
ATTR_MODE: "mode", ATTR_MODE: "mode",
ATTR_LED: "led", ATTR_LED: "led",
ATTR_LED_BRIGHTNESS: "led_brightness",
ATTR_BUZZER: "buzzer", ATTR_BUZZER: "buzzer",
ATTR_CHILD_LOCK: "child_lock", ATTR_CHILD_LOCK: "child_lock",
ATTR_USE_TIME: "use_time", ATTR_USE_TIME: "use_time",
@ -236,7 +221,6 @@ FEATURE_FLAGS_AIRPURIFIER = (
FEATURE_SET_BUZZER FEATURE_SET_BUZZER
| FEATURE_SET_CHILD_LOCK | FEATURE_SET_CHILD_LOCK
| FEATURE_SET_LED | FEATURE_SET_LED
| FEATURE_SET_LED_BRIGHTNESS
| FEATURE_SET_FAVORITE_LEVEL | FEATURE_SET_FAVORITE_LEVEL
| FEATURE_SET_LEARN_MODE | FEATURE_SET_LEARN_MODE
| FEATURE_RESET_FILTER | FEATURE_RESET_FILTER
@ -271,7 +255,6 @@ FEATURE_FLAGS_AIRPURIFIER_3 = (
| FEATURE_SET_LED | FEATURE_SET_LED
| FEATURE_SET_FAVORITE_LEVEL | FEATURE_SET_FAVORITE_LEVEL
| FEATURE_SET_FAN_LEVEL | FEATURE_SET_FAN_LEVEL
| FEATURE_SET_LED_BRIGHTNESS
) )
FEATURE_FLAGS_AIRPURIFIER_V3 = ( FEATURE_FLAGS_AIRPURIFIER_V3 = (
@ -282,17 +265,12 @@ FEATURE_FLAGS_AIRFRESH = (
FEATURE_SET_BUZZER FEATURE_SET_BUZZER
| FEATURE_SET_CHILD_LOCK | FEATURE_SET_CHILD_LOCK
| FEATURE_SET_LED | FEATURE_SET_LED
| FEATURE_SET_LED_BRIGHTNESS
| FEATURE_RESET_FILTER | FEATURE_RESET_FILTER
| FEATURE_SET_EXTRA_FEATURES | FEATURE_SET_EXTRA_FEATURES
) )
AIRPURIFIER_SERVICE_SCHEMA = vol.Schema({vol.Optional(ATTR_ENTITY_ID): cv.entity_ids}) AIRPURIFIER_SERVICE_SCHEMA = vol.Schema({vol.Optional(ATTR_ENTITY_ID): cv.entity_ids})
SERVICE_SCHEMA_LED_BRIGHTNESS = AIRPURIFIER_SERVICE_SCHEMA.extend(
{vol.Required(ATTR_BRIGHTNESS): vol.All(vol.Coerce(int), vol.Clamp(min=0, max=2))}
)
SERVICE_SCHEMA_FAVORITE_LEVEL = AIRPURIFIER_SERVICE_SCHEMA.extend( SERVICE_SCHEMA_FAVORITE_LEVEL = AIRPURIFIER_SERVICE_SCHEMA.extend(
{vol.Required(ATTR_LEVEL): vol.All(vol.Coerce(int), vol.Clamp(min=0, max=17))} {vol.Required(ATTR_LEVEL): vol.All(vol.Coerce(int), vol.Clamp(min=0, max=17))}
) )
@ -321,10 +299,6 @@ SERVICE_TO_METHOD = {
SERVICE_SET_LEARN_MODE_ON: {"method": "async_set_learn_mode_on"}, SERVICE_SET_LEARN_MODE_ON: {"method": "async_set_learn_mode_on"},
SERVICE_SET_LEARN_MODE_OFF: {"method": "async_set_learn_mode_off"}, SERVICE_SET_LEARN_MODE_OFF: {"method": "async_set_learn_mode_off"},
SERVICE_RESET_FILTER: {"method": "async_reset_filter"}, SERVICE_RESET_FILTER: {"method": "async_reset_filter"},
SERVICE_SET_LED_BRIGHTNESS: {
"method": "async_set_led_brightness",
"schema": SERVICE_SCHEMA_LED_BRIGHTNESS,
},
SERVICE_SET_FAVORITE_LEVEL: { SERVICE_SET_FAVORITE_LEVEL: {
"method": "async_set_favorite_level", "method": "async_set_favorite_level",
"schema": SERVICE_SCHEMA_FAVORITE_LEVEL, "schema": SERVICE_SCHEMA_FAVORITE_LEVEL,
@ -792,17 +766,6 @@ class XiaomiAirPurifier(XiaomiGenericDevice):
False, False,
) )
async def async_set_led_brightness(self, brightness: int = 2):
"""Set the led brightness."""
if self._device_features & FEATURE_SET_LED_BRIGHTNESS == 0:
return
await self._try_command(
"Setting the led brightness of the miio device failed.",
self._device.set_led_brightness,
AirpurifierLedBrightness(brightness),
)
async def async_set_favorite_level(self, level: int = 1): async def async_set_favorite_level(self, level: int = 1):
"""Set the favorite level.""" """Set the favorite level."""
if self._device_features & FEATURE_SET_FAVORITE_LEVEL == 0: if self._device_features & FEATURE_SET_FAVORITE_LEVEL == 0:
@ -987,17 +950,6 @@ class XiaomiAirPurifierMiot(XiaomiAirPurifier):
self._mode = AirpurifierMiotOperationMode[speed.title()].value self._mode = AirpurifierMiotOperationMode[speed.title()].value
self.async_write_ha_state() self.async_write_ha_state()
async def async_set_led_brightness(self, brightness: int = 2):
"""Set the led brightness."""
if self._device_features & FEATURE_SET_LED_BRIGHTNESS == 0:
return
await self._try_command(
"Setting the led brightness of the miio device failed.",
self._device.set_led_brightness,
AirpurifierMiotLedBrightness(brightness),
)
class XiaomiAirFresh(XiaomiGenericDevice): class XiaomiAirFresh(XiaomiGenericDevice):
"""Representation of a Xiaomi Air Fresh.""" """Representation of a Xiaomi Air Fresh."""
@ -1134,17 +1086,6 @@ class XiaomiAirFresh(XiaomiGenericDevice):
False, False,
) )
async def async_set_led_brightness(self, brightness: int = 2):
"""Set the led brightness."""
if self._device_features & FEATURE_SET_LED_BRIGHTNESS == 0:
return
await self._try_command(
"Setting the led brightness of the miio device failed.",
self._device.set_led_brightness,
AirfreshLedBrightness(brightness),
)
async def async_set_extra_features(self, features: int = 1): async def async_set_extra_features(self, features: int = 1):
"""Set the extra features.""" """Set the extra features."""
if self._device_features & FEATURE_SET_EXTRA_FEATURES == 0: if self._device_features & FEATURE_SET_EXTRA_FEATURES == 0:

View File

@ -4,8 +4,11 @@ from __future__ import annotations
from dataclasses import dataclass from dataclasses import dataclass
from enum import Enum from enum import Enum
from miio.airfresh import LedBrightness as AirfreshLedBrightness
from miio.airhumidifier import LedBrightness as AirhumidifierLedBrightness from miio.airhumidifier import LedBrightness as AirhumidifierLedBrightness
from miio.airhumidifier_miot import LedBrightness as AirhumidifierMiotLedBrightness from miio.airhumidifier_miot import LedBrightness as AirhumidifierMiotLedBrightness
from miio.airpurifier import LedBrightness as AirpurifierLedBrightness
from miio.airpurifier_miot import LedBrightness as AirpurifierMiotLedBrightness
from homeassistant.components.select import SelectEntity, SelectEntityDescription from homeassistant.components.select import SelectEntity, SelectEntityDescription
from homeassistant.core import callback from homeassistant.core import callback
@ -18,8 +21,12 @@ from .const import (
FEATURE_SET_LED_BRIGHTNESS, FEATURE_SET_LED_BRIGHTNESS,
KEY_COORDINATOR, KEY_COORDINATOR,
KEY_DEVICE, KEY_DEVICE,
MODEL_AIRFRESH_VA2,
MODEL_AIRPURIFIER_M1,
MODEL_AIRPURIFIER_M2,
MODELS_HUMIDIFIER_MIIO, MODELS_HUMIDIFIER_MIIO,
MODELS_HUMIDIFIER_MIOT, MODELS_HUMIDIFIER_MIOT,
MODELS_PURIFIER_MIOT,
) )
from .device import XiaomiCoordinatedMiioEntity from .device import XiaomiCoordinatedMiioEntity
@ -27,10 +34,10 @@ ATTR_LED_BRIGHTNESS = "led_brightness"
LED_BRIGHTNESS_MAP = {"Bright": 0, "Dim": 1, "Off": 2} LED_BRIGHTNESS_MAP = {"Bright": 0, "Dim": 1, "Off": 2}
LED_BRIGHTNESS_MAP_MIOT = {"Bright": 2, "Dim": 1, "Off": 0} LED_BRIGHTNESS_MAP_HUMIDIFIER_MIOT = {"Bright": 2, "Dim": 1, "Off": 0}
LED_BRIGHTNESS_REVERSE_MAP = {val: key for key, val in LED_BRIGHTNESS_MAP.items()} LED_BRIGHTNESS_REVERSE_MAP = {val: key for key, val in LED_BRIGHTNESS_MAP.items()}
LED_BRIGHTNESS_REVERSE_MAP_MIOT = { LED_BRIGHTNESS_REVERSE_MAP_HUMIDIFIER_MIOT = {
val: key for key, val in LED_BRIGHTNESS_MAP_MIOT.items() val: key for key, val in LED_BRIGHTNESS_MAP_HUMIDIFIER_MIOT.items()
} }
@ -65,6 +72,12 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
entity_class = XiaomiAirHumidifierSelector entity_class = XiaomiAirHumidifierSelector
elif model in MODELS_HUMIDIFIER_MIOT: elif model in MODELS_HUMIDIFIER_MIOT:
entity_class = XiaomiAirHumidifierMiotSelector entity_class = XiaomiAirHumidifierMiotSelector
elif model in [MODEL_AIRPURIFIER_M1, MODEL_AIRPURIFIER_M2]:
entity_class = XiaomiAirPurifierSelector
elif model in MODELS_PURIFIER_MIOT:
entity_class = XiaomiAirPurifierMiotSelector
elif model == MODEL_AIRFRESH_VA2:
entity_class = XiaomiAirFreshSelector
else: else:
return return
@ -150,14 +163,62 @@ class XiaomiAirHumidifierMiotSelector(XiaomiAirHumidifierSelector):
@property @property
def led_brightness(self): def led_brightness(self):
"""Return the current led brightness.""" """Return the current led brightness."""
return LED_BRIGHTNESS_REVERSE_MAP_MIOT.get(self._current_led_brightness) return LED_BRIGHTNESS_REVERSE_MAP_HUMIDIFIER_MIOT.get(
self._current_led_brightness
)
async def async_set_led_brightness(self, brightness: str): async def async_set_led_brightness(self, brightness: str) -> None:
"""Set the led brightness.""" """Set the led brightness."""
if await self._try_command( if await self._try_command(
"Setting the led brightness of the miio device failed.", "Setting the led brightness of the miio device failed.",
self._device.set_led_brightness, self._device.set_led_brightness,
AirhumidifierMiotLedBrightness(LED_BRIGHTNESS_MAP_MIOT[brightness]), AirhumidifierMiotLedBrightness(
LED_BRIGHTNESS_MAP_HUMIDIFIER_MIOT[brightness]
),
): ):
self._current_led_brightness = LED_BRIGHTNESS_MAP_MIOT[brightness] self._current_led_brightness = LED_BRIGHTNESS_MAP_HUMIDIFIER_MIOT[
brightness
]
self.async_write_ha_state()
class XiaomiAirPurifierSelector(XiaomiAirHumidifierSelector):
"""Representation of a Xiaomi Air Purifier (MIIO protocol) selector."""
async def async_set_led_brightness(self, brightness: str) -> None:
"""Set the led brightness."""
if await self._try_command(
"Setting the led brightness of the miio device failed.",
self._device.set_led_brightness,
AirpurifierLedBrightness(LED_BRIGHTNESS_MAP[brightness]),
):
self._current_led_brightness = LED_BRIGHTNESS_MAP[brightness]
self.async_write_ha_state()
class XiaomiAirPurifierMiotSelector(XiaomiAirHumidifierSelector):
"""Representation of a Xiaomi Air Purifier (MiOT protocol) selector."""
async def async_set_led_brightness(self, brightness: str) -> None:
"""Set the led brightness."""
if await self._try_command(
"Setting the led brightness of the miio device failed.",
self._device.set_led_brightness,
AirpurifierMiotLedBrightness(LED_BRIGHTNESS_MAP[brightness]),
):
self._current_led_brightness = LED_BRIGHTNESS_MAP[brightness]
self.async_write_ha_state()
class XiaomiAirFreshSelector(XiaomiAirHumidifierSelector):
"""Representation of a Xiaomi Air Fresh selector."""
async def async_set_led_brightness(self, brightness: str) -> None:
"""Set the led brightness."""
if await self._try_command(
"Setting the led brightness of the miio device failed.",
self._device.set_led_brightness,
AirfreshLedBrightness(LED_BRIGHTNESS_MAP[brightness]),
):
self._current_led_brightness = LED_BRIGHTNESS_MAP[brightness]
self.async_write_ha_state() self.async_write_ha_state()

View File

@ -101,24 +101,6 @@ fan_set_fan_level:
min: 1 min: 1
max: 3 max: 3
fan_set_led_brightness:
name: Fan set LED brightness
description: Set the led brightness.
fields:
entity_id:
description: Name of the xiaomi miio entity.
selector:
entity:
integration: xiaomi_miio
domain: fan
brightness:
description: Brightness (0 = Bright, 1 = Dim, 2 = Off)
required: true
selector:
number:
min: 0
max: 2
fan_set_auto_detect_on: fan_set_auto_detect_on:
name: Fan set auto detect on name: Fan set auto detect on
description: Turn the auto detect on. description: Turn the auto detect on.