diff --git a/homeassistant/components/xiaomi_miio/__init__.py b/homeassistant/components/xiaomi_miio/__init__.py index 9d854607213..97e52f84dfc 100644 --- a/homeassistant/components/xiaomi_miio/__init__.py +++ b/homeassistant/components/xiaomi_miio/__init__.py @@ -46,7 +46,7 @@ _LOGGER = logging.getLogger(__name__) GATEWAY_PLATFORMS = ["alarm_control_panel", "light", "sensor", "switch"] SWITCH_PLATFORMS = ["switch"] -FAN_PLATFORMS = ["fan", "select", "sensor"] +FAN_PLATFORMS = ["fan", "select", "sensor", "switch"] HUMIDIFIER_PLATFORMS = [ "binary_sensor", "humidifier", diff --git a/homeassistant/components/xiaomi_miio/const.py b/homeassistant/components/xiaomi_miio/const.py index 184629fa2fb..af32e8daafa 100644 --- a/homeassistant/components/xiaomi_miio/const.py +++ b/homeassistant/components/xiaomi_miio/const.py @@ -154,19 +154,8 @@ MODELS_ALL_DEVICES = ( MODELS_ALL = MODELS_ALL_DEVICES + MODELS_GATEWAY # Fan/Humidifier Services -SERVICE_SET_BUZZER_ON = "fan_set_buzzer_on" -SERVICE_SET_BUZZER_OFF = "fan_set_buzzer_off" -SERVICE_SET_FAN_LED_ON = "fan_set_led_on" -SERVICE_SET_FAN_LED_OFF = "fan_set_led_off" -SERVICE_SET_FAN_LED = "fan_set_led" -SERVICE_SET_CHILD_LOCK_ON = "fan_set_child_lock_on" -SERVICE_SET_CHILD_LOCK_OFF = "fan_set_child_lock_off" SERVICE_SET_FAVORITE_LEVEL = "fan_set_favorite_level" SERVICE_SET_FAN_LEVEL = "fan_set_fan_level" -SERVICE_SET_AUTO_DETECT_ON = "fan_set_auto_detect_on" -SERVICE_SET_AUTO_DETECT_OFF = "fan_set_auto_detect_off" -SERVICE_SET_LEARN_MODE_ON = "fan_set_learn_mode_on" -SERVICE_SET_LEARN_MODE_OFF = "fan_set_learn_mode_off" SERVICE_SET_VOLUME = "fan_set_volume" SERVICE_RESET_FILTER = "fan_reset_filter" SERVICE_SET_EXTRA_FEATURES = "fan_set_extra_features" @@ -220,7 +209,7 @@ FEATURE_SET_FAN_LEVEL = 4096 FEATURE_SET_MOTOR_SPEED = 8192 FEATURE_SET_CLEAN = 16384 -FEATURE_FLAGS_AIRPURIFIER = ( +FEATURE_FLAGS_AIRPURIFIER_MIIO = ( FEATURE_SET_BUZZER | FEATURE_SET_CHILD_LOCK | FEATURE_SET_LED @@ -230,11 +219,18 @@ FEATURE_FLAGS_AIRPURIFIER = ( | FEATURE_SET_EXTRA_FEATURES ) +FEATURE_FLAGS_AIRPURIFIER_MIOT = ( + FEATURE_SET_BUZZER + | FEATURE_SET_CHILD_LOCK + | FEATURE_SET_FAVORITE_LEVEL + | FEATURE_SET_FAN_LEVEL + | FEATURE_SET_LED_BRIGHTNESS +) + FEATURE_FLAGS_AIRPURIFIER_PRO = ( FEATURE_SET_CHILD_LOCK | FEATURE_SET_LED | FEATURE_SET_FAVORITE_LEVEL - | FEATURE_SET_AUTO_DETECT | FEATURE_SET_VOLUME ) @@ -252,13 +248,7 @@ FEATURE_FLAGS_AIRPURIFIER_2S = ( | 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_V1 = FEATURE_FLAGS_AIRPURIFIER_MIIO | FEATURE_SET_AUTO_DETECT FEATURE_FLAGS_AIRPURIFIER_V3 = ( FEATURE_SET_BUZZER | FEATURE_SET_CHILD_LOCK | FEATURE_SET_LED @@ -287,6 +277,7 @@ FEATURE_FLAGS_AIRFRESH = ( FEATURE_SET_BUZZER | FEATURE_SET_CHILD_LOCK | FEATURE_SET_LED + | FEATURE_SET_LED_BRIGHTNESS | FEATURE_RESET_FILTER | FEATURE_SET_EXTRA_FEATURES ) diff --git a/homeassistant/components/xiaomi_miio/fan.py b/homeassistant/components/xiaomi_miio/fan.py index 87e8fa0ca2a..57a4f004529 100644 --- a/homeassistant/components/xiaomi_miio/fan.py +++ b/homeassistant/components/xiaomi_miio/fan.py @@ -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: diff --git a/homeassistant/components/xiaomi_miio/services.yaml b/homeassistant/components/xiaomi_miio/services.yaml index 43300f8381a..250b0404a41 100644 --- a/homeassistant/components/xiaomi_miio/services.yaml +++ b/homeassistant/components/xiaomi_miio/services.yaml @@ -1,69 +1,3 @@ -fan_set_buzzer_on: - name: Fan set buzzer on - description: Turn the buzzer on. - fields: - entity_id: - description: Name of the xiaomi miio entity. - selector: - entity: - integration: xiaomi_miio - domain: fan - -fan_set_buzzer_off: - name: Fan set buzzer off - description: Turn the buzzer off. - fields: - entity_id: - description: Name of the xiaomi miio entity. - selector: - entity: - integration: xiaomi_miio - domain: fan - -fan_set_led_on: - name: Fan set LED on - description: Turn the led on. - fields: - entity_id: - description: Name of the xiaomi miio entity. - selector: - entity: - integration: xiaomi_miio - domain: fan - -fan_set_led_off: - name: Fan set LED off - description: Turn the led off. - fields: - entity_id: - description: Name of the xiaomi miio entity. - selector: - entity: - integration: xiaomi_miio - domain: fan - -fan_set_child_lock_on: - name: Fan set child lock on - description: Turn the child lock on. - fields: - entity_id: - description: Name of the xiaomi miio entity. - selector: - entity: - integration: xiaomi_miio - domain: fan - -fan_set_child_lock_off: - name: Fan set child lock off - description: Turn the child lock off. - fields: - entity_id: - description: Name of the xiaomi miio entity. - selector: - entity: - integration: xiaomi_miio - domain: fan - fan_set_favorite_level: name: Fan set favorite level description: Set the favorite level. @@ -101,50 +35,6 @@ fan_set_fan_level: min: 1 max: 3 -fan_set_auto_detect_on: - name: Fan set auto detect on - description: Turn the auto detect on. - fields: - entity_id: - description: Name of the xiaomi miio entity. - selector: - entity: - integration: xiaomi_miio - domain: fan - -fan_set_auto_detect_off: - name: Fan set auto detect off - description: Turn the auto detect off. - fields: - entity_id: - description: Name of the xiaomi miio entity. - selector: - entity: - integration: xiaomi_miio - domain: fan - -fan_set_learn_mode_on: - name: Fan set learn mode on - description: Turn the learn mode on. - fields: - entity_id: - description: Name of the xiaomi miio entity. - selector: - entity: - integration: xiaomi_miio - domain: fan - -fan_set_learn_mode_off: - name: Fan set learn mode off - description: Turn the learn mode off. - fields: - entity_id: - description: Name of the xiaomi miio entity. - selector: - entity: - integration: xiaomi_miio - domain: fan - fan_set_volume: name: Fan set volume description: Set the sound volume. diff --git a/homeassistant/components/xiaomi_miio/switch.py b/homeassistant/components/xiaomi_miio/switch.py index a82d091dee8..4a6471a20b9 100644 --- a/homeassistant/components/xiaomi_miio/switch.py +++ b/homeassistant/components/xiaomi_miio/switch.py @@ -35,22 +35,42 @@ from .const import ( CONF_GATEWAY, CONF_MODEL, DOMAIN, + FEATURE_FLAGS_AIRFRESH, FEATURE_FLAGS_AIRHUMIDIFIER, FEATURE_FLAGS_AIRHUMIDIFIER_CA4, FEATURE_FLAGS_AIRHUMIDIFIER_CA_AND_CB, FEATURE_FLAGS_AIRHUMIDIFIER_MJSSQ, + FEATURE_FLAGS_AIRPURIFIER_2S, + FEATURE_FLAGS_AIRPURIFIER_MIIO, + FEATURE_FLAGS_AIRPURIFIER_MIOT, + FEATURE_FLAGS_AIRPURIFIER_PRO, + FEATURE_FLAGS_AIRPURIFIER_PRO_V7, + FEATURE_FLAGS_AIRPURIFIER_V1, + FEATURE_FLAGS_AIRPURIFIER_V3, + FEATURE_SET_AUTO_DETECT, FEATURE_SET_BUZZER, FEATURE_SET_CHILD_LOCK, FEATURE_SET_CLEAN, FEATURE_SET_DRY, + FEATURE_SET_LEARN_MODE, FEATURE_SET_LED, KEY_COORDINATOR, KEY_DEVICE, + MODEL_AIRFRESH_VA2, MODEL_AIRHUMIDIFIER_CA1, MODEL_AIRHUMIDIFIER_CA4, MODEL_AIRHUMIDIFIER_CB1, + MODEL_AIRPURIFIER_2H, + MODEL_AIRPURIFIER_2S, + MODEL_AIRPURIFIER_PRO, + MODEL_AIRPURIFIER_PRO_V7, + MODEL_AIRPURIFIER_V1, + MODEL_AIRPURIFIER_V3, + MODELS_FAN, MODELS_HUMIDIFIER, MODELS_HUMIDIFIER_MJJSQ, + MODELS_PURIFIER_MIIO, + MODELS_PURIFIER_MIOT, SERVICE_SET_POWER_MODE, SERVICE_SET_POWER_PRICE, SERVICE_SET_WIFI_LED_OFF, @@ -98,10 +118,12 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( } ) +ATTR_AUTO_DETECT = "auto_detect" ATTR_BUZZER = "buzzer" ATTR_CHILD_LOCK = "child_lock" ATTR_CLEAN = "clean_mode" ATTR_DRY = "dry" +ATTR_LEARN_MODE = "learn_mode" ATTR_LED = "led" ATTR_LOAD_POWER = "load_power" ATTR_MODEL = "model" @@ -148,6 +170,19 @@ SERVICE_TO_METHOD = { }, } +MODEL_TO_FEATURES_MAP = { + MODEL_AIRFRESH_VA2: FEATURE_FLAGS_AIRFRESH, + MODEL_AIRHUMIDIFIER_CA1: FEATURE_FLAGS_AIRHUMIDIFIER_CA_AND_CB, + MODEL_AIRHUMIDIFIER_CA4: FEATURE_FLAGS_AIRHUMIDIFIER_CA4, + MODEL_AIRHUMIDIFIER_CB1: FEATURE_FLAGS_AIRHUMIDIFIER_CA_AND_CB, + MODEL_AIRPURIFIER_2H: FEATURE_FLAGS_AIRPURIFIER_2S, + MODEL_AIRPURIFIER_2S: FEATURE_FLAGS_AIRPURIFIER_2S, + MODEL_AIRPURIFIER_PRO: FEATURE_FLAGS_AIRPURIFIER_PRO, + MODEL_AIRPURIFIER_PRO_V7: FEATURE_FLAGS_AIRPURIFIER_PRO_V7, + MODEL_AIRPURIFIER_V1: FEATURE_FLAGS_AIRPURIFIER_V1, + MODEL_AIRPURIFIER_V3: FEATURE_FLAGS_AIRPURIFIER_V3, +} + @dataclass class XiaomiMiioSwitchDescription(SwitchEntityDescription): @@ -201,6 +236,21 @@ SWITCH_TYPES = ( method_on="async_set_led_on", method_off="async_set_led_off", ), + XiaomiMiioSwitchDescription( + key=ATTR_LEARN_MODE, + feature=FEATURE_SET_LEARN_MODE, + name="Learn Mode", + icon="mdi:school-outline", + method_on="async_set_learn_mode_on", + method_off="async_set_learn_mode_off", + ), + XiaomiMiioSwitchDescription( + key=ATTR_AUTO_DETECT, + feature=FEATURE_SET_AUTO_DETECT, + name="Auto Detect", + method_on="async_set_auto_detect_on", + method_off="async_set_auto_detect_off", + ), ) @@ -220,7 +270,8 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= async def async_setup_entry(hass, config_entry, async_add_entities): """Set up the switch from a config entry.""" - if config_entry.data[CONF_MODEL] in MODELS_HUMIDIFIER: + model = config_entry.data[CONF_MODEL] + if model in (*MODELS_HUMIDIFIER, *MODELS_FAN): await async_setup_coordinated_entry(hass, config_entry, async_add_entities) else: await async_setup_other_entry(hass, config_entry, async_add_entities) @@ -239,14 +290,16 @@ async def async_setup_coordinated_entry(hass, config_entry, async_add_entities): device_features = 0 - if model in [MODEL_AIRHUMIDIFIER_CA1, MODEL_AIRHUMIDIFIER_CB1]: - device_features = FEATURE_FLAGS_AIRHUMIDIFIER_CA_AND_CB - elif model in [MODEL_AIRHUMIDIFIER_CA4]: - device_features = FEATURE_FLAGS_AIRHUMIDIFIER_CA4 + if model in MODEL_TO_FEATURES_MAP: + device_features = MODEL_TO_FEATURES_MAP[model] elif model in MODELS_HUMIDIFIER_MJJSQ: device_features = FEATURE_FLAGS_AIRHUMIDIFIER_MJSSQ elif model in MODELS_HUMIDIFIER: device_features = FEATURE_FLAGS_AIRHUMIDIFIER + elif model in MODELS_PURIFIER_MIIO: + device_features = FEATURE_FLAGS_AIRPURIFIER_MIIO + elif model in MODELS_PURIFIER_MIOT: + device_features = FEATURE_FLAGS_AIRPURIFIER_MIOT for description in SWITCH_TYPES: if description.feature & device_features: @@ -519,6 +572,38 @@ class XiaomiGenericCoordinatedSwitch(XiaomiCoordinatedMiioEntity, SwitchEntity): False, ) + async def async_set_learn_mode_on(self) -> bool: + """Turn the learn mode on.""" + 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) -> bool: + """Turn the learn mode off.""" + 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_auto_detect_on(self) -> bool: + """Turn auto detect on.""" + return await self._try_command( + "Turning auto detect of the miio device on failed.", + self._device.set_auto_detect, + True, + ) + + async def async_set_auto_detect_off(self) -> bool: + """Turn auto detect off.""" + return await self._try_command( + "Turning auto detect of the miio device off failed.", + self._device.set_auto_detect, + False, + ) + class XiaomiGatewaySwitch(XiaomiGatewayDevice, SwitchEntity): """Representation of a XiaomiGatewaySwitch."""