From 8cb064c60f72f43a400493f16d4944257fe5d060 Mon Sep 17 00:00:00 2001 From: Roman Chernyatchik Date: Sun, 5 Apr 2020 19:36:14 +0300 Subject: [PATCH 1/2] Feature: Added Xiaomi Zero Fog Humidifier (shuii.humidifier.jsq001) integration --- homeassistant/components/xiaomi_miio/fan.py | 59 ++++++++++++++++++--- 1 file changed, 53 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/xiaomi_miio/fan.py b/homeassistant/components/xiaomi_miio/fan.py index bd5a0c72047761..ced934567d26cf 100644 --- a/homeassistant/components/xiaomi_miio/fan.py +++ b/homeassistant/components/xiaomi_miio/fan.py @@ -7,6 +7,7 @@ from miio import ( # pylint: disable=import-error AirFresh, AirHumidifier, + AirHumidifierJsq, AirPurifier, AirPurifierMiot, Device, @@ -20,6 +21,10 @@ LedBrightness as AirhumidifierLedBrightness, OperationMode as AirhumidifierOperationMode, ) +from miio.airhumidifier_jsq import ( + LedBrightness as AirhumidifierJsqLedBrightness, + OperationMode as AirhumidifierJsqOperationMode, +) from miio.airpurifier import ( # pylint: disable=import-error, import-error LedBrightness as AirpurifierLedBrightness, OperationMode as AirpurifierOperationMode, @@ -89,6 +94,7 @@ MODEL_AIRHUMIDIFIER_V1 = "zhimi.humidifier.v1" MODEL_AIRHUMIDIFIER_CA1 = "zhimi.humidifier.ca1" MODEL_AIRHUMIDIFIER_CB1 = "zhimi.humidifier.cb1" +MODEL_AIRHUMIDIFIER_JSQ001 = "shuii.humidifier.jsq001" MODEL_AIRFRESH_VA2 = "zhimi.airfresh.va2" @@ -117,6 +123,7 @@ MODEL_AIRHUMIDIFIER_V1, MODEL_AIRHUMIDIFIER_CA1, MODEL_AIRHUMIDIFIER_CB1, + MODEL_AIRHUMIDIFIER_JSQ001, MODEL_AIRFRESH_VA2, ] ), @@ -169,6 +176,10 @@ ATTR_DEPTH = "depth" ATTR_DRY = "dry" +# Air Humidifier JSQ001 +ATTR_NO_WATER = "no_water" +ATTR_LID_OPENED = "lid_opened" + # Air Fresh ATTR_CO2 = "co2" @@ -296,25 +307,35 @@ ATTR_MODE: "mode", ATTR_BUZZER: "buzzer", ATTR_CHILD_LOCK: "child_lock", - ATTR_TARGET_HUMIDITY: "target_humidity", ATTR_LED_BRIGHTNESS: "led_brightness", - ATTR_USE_TIME: "use_time", ATTR_HARDWARE_VERSION: "hardware_version", } AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER = { **AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER_COMMON, + ATTR_TARGET_HUMIDITY: "target_humidity", + ATTR_USE_TIME: "use_time", ATTR_TRANS_LEVEL: "trans_level", ATTR_BUTTON_PRESSED: "button_pressed", } AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER_CA_AND_CB = { **AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER_COMMON, + ATTR_TARGET_HUMIDITY: "target_humidity", + ATTR_USE_TIME: "use_time", ATTR_MOTOR_SPEED: "motor_speed", ATTR_DEPTH: "depth", ATTR_DRY: "dry", } +AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER_JSQ = { + **AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER_COMMON, + ATTR_LED: "led", + ATTR_NO_WATER: "no_water", + ATTR_LID_OPENED: "lid_opened", +} + + AVAILABLE_ATTRIBUTES_AIRFRESH = { ATTR_TEMPERATURE: "temperature", ATTR_AIR_QUALITY_INDEX: "aqi", @@ -421,6 +442,13 @@ FEATURE_FLAGS_AIRHUMIDIFIER_CA_AND_CB = FEATURE_FLAGS_AIRHUMIDIFIER | FEATURE_SET_DRY +FEATURE_FLAGS_AIRHUMIDIFIER_JSQ = ( + FEATURE_SET_BUZZER + | FEATURE_SET_CHILD_LOCK + | FEATURE_SET_LED + | FEATURE_SET_LED_BRIGHTNESS +) + FEATURE_FLAGS_AIRFRESH = ( FEATURE_SET_BUZZER | FEATURE_SET_CHILD_LOCK @@ -535,6 +563,9 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= elif model.startswith("zhimi.humidifier."): air_humidifier = AirHumidifier(host, token, model=model) device = XiaomiAirHumidifier(name, air_humidifier, model, unique_id) + elif model.startswith("shuii.humidifier.jsq"): + air_humidifier = AirHumidifierJsq(host, token, model=model) + device = XiaomiAirHumidifier(name, air_humidifier, model, unique_id) elif model.startswith("zhimi.airfresh."): air_fresh = AirFresh(host, token) device = XiaomiAirFresh(name, air_fresh, model, unique_id) @@ -990,14 +1021,27 @@ def __init__(self, name, device, model, unique_id): if self._model in [MODEL_AIRHUMIDIFIER_CA1, MODEL_AIRHUMIDIFIER_CB1]: self._device_features = FEATURE_FLAGS_AIRHUMIDIFIER_CA_AND_CB self._available_attributes = AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER_CA_AND_CB + self._led_brightness_enum = AirhumidifierLedBrightness + self._led_brightness_default = 2 + self._operation_mode_enum = AirhumidifierOperationMode self._speed_list = [ mode.name for mode in AirhumidifierOperationMode if mode is not AirhumidifierOperationMode.Strong ] + elif self._model in [MODEL_AIRHUMIDIFIER_JSQ001]: + self._device_features = FEATURE_FLAGS_AIRHUMIDIFIER_JSQ + self._available_attributes = AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER_JSQ + self._led_brightness_enum = AirhumidifierJsqLedBrightness + self._led_brightness_default = 0 + self._operation_mode_enum = AirhumidifierJsqOperationMode + self._speed_list = [mode.name for mode in AirhumidifierJsqOperationMode] else: self._device_features = FEATURE_FLAGS_AIRHUMIDIFIER self._available_attributes = AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER + self._led_brightness_enum = AirhumidifierLedBrightness + self._led_brightness_default = 2 + self._operation_mode_enum = AirhumidifierOperationMode self._speed_list = [ mode.name for mode in AirhumidifierOperationMode @@ -1041,7 +1085,7 @@ def speed_list(self) -> list: def speed(self): """Return the current speed.""" if self._state: - return AirhumidifierOperationMode(self._state_attrs[ATTR_MODE]).name + return self._operation_mode_enum(self._state_attrs[ATTR_MODE]).name return None @@ -1055,18 +1099,21 @@ async def async_set_speed(self, speed: str) -> None: await self._try_command( "Setting operation mode of the miio device failed.", self._device.set_mode, - AirhumidifierOperationMode[speed.title()], + self._operation_mode_enum[speed.title()], ) - async def async_set_led_brightness(self, brightness: int = 2): + async def async_set_led_brightness(self, brightness: int = None): """Set the led brightness.""" if self._device_features & FEATURE_SET_LED_BRIGHTNESS == 0: return + if brightness is None: + brightness = self._led_brightness_default + await self._try_command( "Setting the led brightness of the miio device failed.", self._device.set_led_brightness, - AirhumidifierLedBrightness(brightness), + self._led_brightness_enum(brightness), ) async def async_set_target_humidity(self, humidity: int = 40): From 280356dc36813ee4de268ba90c18a2d42b2e386c Mon Sep 17 00:00:00 2001 From: Roman Chernyatchik Date: Mon, 6 Apr 2020 13:05:56 +0300 Subject: [PATCH 2/2] Fixed: AttributeError: 'AirHumidifierStatus' object has no attribute 'hardware_version' --- homeassistant/components/xiaomi_miio/fan.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/xiaomi_miio/fan.py b/homeassistant/components/xiaomi_miio/fan.py index ced934567d26cf..9637f928cee000 100644 --- a/homeassistant/components/xiaomi_miio/fan.py +++ b/homeassistant/components/xiaomi_miio/fan.py @@ -308,12 +308,12 @@ ATTR_BUZZER: "buzzer", ATTR_CHILD_LOCK: "child_lock", ATTR_LED_BRIGHTNESS: "led_brightness", - ATTR_HARDWARE_VERSION: "hardware_version", } AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER = { **AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER_COMMON, ATTR_TARGET_HUMIDITY: "target_humidity", + ATTR_HARDWARE_VERSION: "hardware_version", ATTR_USE_TIME: "use_time", ATTR_TRANS_LEVEL: "trans_level", ATTR_BUTTON_PRESSED: "button_pressed", @@ -322,6 +322,7 @@ AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER_CA_AND_CB = { **AVAILABLE_ATTRIBUTES_AIRHUMIDIFIER_COMMON, ATTR_TARGET_HUMIDITY: "target_humidity", + ATTR_HARDWARE_VERSION: "hardware_version", ATTR_USE_TIME: "use_time", ATTR_MOTOR_SPEED: "motor_speed", ATTR_DEPTH: "depth",