diff --git a/homeassistant/components/ecovacs/__init__.py b/homeassistant/components/ecovacs/__init__.py index cd87b175cf9..9cb8a8c38d8 100644 --- a/homeassistant/components/ecovacs/__init__.py +++ b/homeassistant/components/ecovacs/__init__.py @@ -46,54 +46,60 @@ ECOVACS_API_DEVICEID = "".join( ) -def setup(hass: HomeAssistant, config: ConfigType) -> bool: +async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up the Ecovacs component.""" _LOGGER.debug("Creating new Ecovacs component") - hass.data[ECOVACS_DEVICES] = [] - - ecovacs_api = EcoVacsAPI( - ECOVACS_API_DEVICEID, - config[DOMAIN].get(CONF_USERNAME), - EcoVacsAPI.md5(config[DOMAIN].get(CONF_PASSWORD)), - config[DOMAIN].get(CONF_COUNTRY), - config[DOMAIN].get(CONF_CONTINENT), - ) - - devices = ecovacs_api.devices() - _LOGGER.debug("Ecobot devices: %s", devices) - - for device in devices: - _LOGGER.info( - "Discovered Ecovacs device on account: %s with nickname %s", - device.get("did"), - device.get("nick"), + def get_devices() -> list[VacBot]: + ecovacs_api = EcoVacsAPI( + ECOVACS_API_DEVICEID, + config[DOMAIN].get(CONF_USERNAME), + EcoVacsAPI.md5(config[DOMAIN].get(CONF_PASSWORD)), + config[DOMAIN].get(CONF_COUNTRY), + config[DOMAIN].get(CONF_CONTINENT), ) - vacbot = VacBot( - ecovacs_api.uid, - ecovacs_api.REALM, - ecovacs_api.resource, - ecovacs_api.user_access_token, - device, - config[DOMAIN].get(CONF_CONTINENT).lower(), - monitor=True, - ) - hass.data[ECOVACS_DEVICES].append(vacbot) + ecovacs_devices = ecovacs_api.devices() + _LOGGER.debug("Ecobot devices: %s", ecovacs_devices) - def stop(event: object) -> None: + devices: list[VacBot] = [] + for device in ecovacs_devices: + _LOGGER.info( + "Discovered Ecovacs device on account: %s with nickname %s", + device.get("did"), + device.get("nick"), + ) + vacbot = VacBot( + ecovacs_api.uid, + ecovacs_api.REALM, + ecovacs_api.resource, + ecovacs_api.user_access_token, + device, + config[DOMAIN].get(CONF_CONTINENT).lower(), + monitor=True, + ) + + devices.append(vacbot) + return devices + + hass.data[ECOVACS_DEVICES] = await hass.async_add_executor_job(get_devices) + + async def async_stop(event: object) -> None: """Shut down open connections to Ecovacs XMPP server.""" - for device in hass.data[ECOVACS_DEVICES]: + devices: list[VacBot] = hass.data[ECOVACS_DEVICES] + for device in devices: _LOGGER.info( "Shutting down connection to Ecovacs device %s", device.vacuum.get("did"), ) - device.disconnect() + await hass.async_add_executor_job(device.disconnect) # Listen for HA stop to disconnect. - hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop) + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, async_stop) if hass.data[ECOVACS_DEVICES]: _LOGGER.debug("Starting vacuum components") - discovery.load_platform(hass, Platform.VACUUM, DOMAIN, {}, config) + hass.async_create_task( + discovery.async_load_platform(hass, Platform.VACUUM, DOMAIN, {}, config) + ) return True diff --git a/homeassistant/components/ecovacs/vacuum.py b/homeassistant/components/ecovacs/vacuum.py index ba922a30b84..2ec9a1a3e4a 100644 --- a/homeassistant/components/ecovacs/vacuum.py +++ b/homeassistant/components/ecovacs/vacuum.py @@ -28,18 +28,20 @@ ATTR_ERROR = "error" ATTR_COMPONENT_PREFIX = "component_" -def setup_platform( +async def async_setup_platform( hass: HomeAssistant, config: ConfigType, - add_entities: AddEntitiesCallback, + async_add_entities: AddEntitiesCallback, discovery_info: DiscoveryInfoType | None = None, ) -> None: """Set up the Ecovacs vacuums.""" vacuums = [] - for device in hass.data[ECOVACS_DEVICES]: + devices: list[sucks.VacBot] = hass.data[ECOVACS_DEVICES] + for device in devices: + await hass.async_add_executor_job(device.connect_and_wait_until_ready) vacuums.append(EcovacsVacuum(device)) _LOGGER.debug("Adding Ecovacs Vacuums to Home Assistant: %s", vacuums) - add_entities(vacuums, True) + async_add_entities(vacuums) class EcovacsVacuum(StateVacuumEntity): @@ -62,15 +64,12 @@ class EcovacsVacuum(StateVacuumEntity): def __init__(self, device: sucks.VacBot) -> None: """Initialize the Ecovacs Vacuum.""" self.device = device - self.device.connect_and_wait_until_ready() vacuum = self.device.vacuum self.error = None self._attr_unique_id = vacuum["did"] self._attr_name = vacuum.get("nick", vacuum["did"]) - _LOGGER.debug("StateVacuum initialized: %s", self.name) - async def async_added_to_hass(self) -> None: """Set up the event listeners now that hass is ready.""" self.device.statusEvents.subscribe(lambda _: self.schedule_update_ha_state())