From a9f45048b06ff53b641b52a6e2cf293efb3eac12 Mon Sep 17 00:00:00 2001 From: shbatm Date: Tue, 14 Apr 2020 12:46:03 -0500 Subject: [PATCH 1/3] Add unique_id for Xiaomi Vacuums --- .../components/xiaomi_miio/vacuum.py | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/xiaomi_miio/vacuum.py b/homeassistant/components/xiaomi_miio/vacuum.py index 416918e6f4360..5c8e339a54cc3 100644 --- a/homeassistant/components/xiaomi_miio/vacuum.py +++ b/homeassistant/components/xiaomi_miio/vacuum.py @@ -2,6 +2,7 @@ import asyncio from functools import partial import logging +from typing import Optional from miio import DeviceException, Vacuum # pylint: disable=import-error import voluptuous as vol @@ -35,6 +36,7 @@ STATE_OFF, STATE_ON, ) +from homeassistant.exceptions import PlatformNotReady import homeassistant.helpers.config_validation as cv from .const import ( @@ -187,9 +189,23 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= # Create handler _LOGGER.info("Initializing with host %s (token %s...)", host, token[:5]) - vacuum = Vacuum(host, token) - mirobo = MiroboVacuum(name, vacuum) + unique_id = None + + try: + vacuum = Vacuum(host, token) + device_info = await hass.async_add_executor_job(vacuum.info) + unique_id = f"{device_info.model}-{device_info.mac_address}" + _LOGGER.info( + "%s %s %s detected", + device_info.model, + device_info.firmware_version, + device_info.hardware_version, + ) + except DeviceException: + raise PlatformNotReady + + mirobo = MiroboVacuum(name, vacuum, unique_id) hass.data[DATA_KEY][host] = mirobo async_add_entities([mirobo], update_before_add=True) @@ -232,10 +248,11 @@ async def async_service_handler(service): class MiroboVacuum(StateVacuumDevice): """Representation of a Xiaomi Vacuum cleaner robot.""" - def __init__(self, name, vacuum): + def __init__(self, name, vacuum, unique_id): """Initialize the Xiaomi vacuum cleaner robot handler.""" self._name = name self._vacuum = vacuum + self._unique_id = unique_id self.vacuum_state = None self._available = False @@ -247,6 +264,11 @@ def __init__(self, name, vacuum): self._fan_speeds = None self._fan_speeds_reverse = None + @property + def unique_id(self) -> Optional[str]: + """Return a unique ID.""" + return self._unique_id + @property def name(self): """Return the name of the device.""" From ceabadede4e58540d880cded6bd18b2c88e9eb9e Mon Sep 17 00:00:00 2001 From: shbatm Date: Tue, 14 Apr 2020 13:15:48 -0500 Subject: [PATCH 2/3] Update homeassistant/components/xiaomi_miio/vacuum.py Co-Authored-By: J. Nick Koston --- homeassistant/components/xiaomi_miio/vacuum.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/xiaomi_miio/vacuum.py b/homeassistant/components/xiaomi_miio/vacuum.py index 5c8e339a54cc3..4ae2206f7f970 100644 --- a/homeassistant/components/xiaomi_miio/vacuum.py +++ b/homeassistant/components/xiaomi_miio/vacuum.py @@ -195,7 +195,7 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= try: vacuum = Vacuum(host, token) device_info = await hass.async_add_executor_job(vacuum.info) - unique_id = f"{device_info.model}-{device_info.mac_address}" + unique_id = device_info.mac_address _LOGGER.info( "%s %s %s detected", device_info.model, From 4ac30a31ddd2509158d5124e09210f6eb2769a05 Mon Sep 17 00:00:00 2001 From: shbatm Date: Tue, 14 Apr 2020 17:36:37 -0500 Subject: [PATCH 3/3] Only catch exception for external call. --- .../components/xiaomi_miio/vacuum.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/xiaomi_miio/vacuum.py b/homeassistant/components/xiaomi_miio/vacuum.py index 4ae2206f7f970..9f88a9224664f 100644 --- a/homeassistant/components/xiaomi_miio/vacuum.py +++ b/homeassistant/components/xiaomi_miio/vacuum.py @@ -189,22 +189,21 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= # Create handler _LOGGER.info("Initializing with host %s (token %s...)", host, token[:5]) - - unique_id = None + vacuum = Vacuum(host, token) try: - vacuum = Vacuum(host, token) device_info = await hass.async_add_executor_job(vacuum.info) - unique_id = device_info.mac_address - _LOGGER.info( - "%s %s %s detected", - device_info.model, - device_info.firmware_version, - device_info.hardware_version, - ) except DeviceException: raise PlatformNotReady + unique_id = device_info.mac_address + _LOGGER.debug( + "%s %s %s detected", + device_info.model, + device_info.firmware_version, + device_info.hardware_version, + ) + mirobo = MiroboVacuum(name, vacuum, unique_id) hass.data[DATA_KEY][host] = mirobo