From e5c1cc35e1aa1740b114f84862e7d7c42a4fef31 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 5 Apr 2022 01:10:20 -1000 Subject: [PATCH] Fix roomba doing I/O in the event loop (#69339) --- homeassistant/components/roomba/__init__.py | 16 ++++++++++------ homeassistant/components/roomba/config_flow.py | 16 ++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/roomba/__init__.py b/homeassistant/components/roomba/__init__.py index 0a58effa481..31b5187a195 100644 --- a/homeassistant/components/roomba/__init__.py +++ b/homeassistant/components/roomba/__init__.py @@ -1,5 +1,6 @@ """The roomba component.""" import asyncio +from functools import partial import logging import async_timeout @@ -42,12 +43,15 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> b }, ) - roomba = RoombaFactory.create_roomba( - address=config_entry.data[CONF_HOST], - blid=config_entry.data[CONF_BLID], - password=config_entry.data[CONF_PASSWORD], - continuous=config_entry.options[CONF_CONTINUOUS], - delay=config_entry.options[CONF_DELAY], + roomba = await hass.async_add_executor_job( + partial( + RoombaFactory.create_roomba, + address=config_entry.data[CONF_HOST], + blid=config_entry.data[CONF_BLID], + password=config_entry.data[CONF_PASSWORD], + continuous=config_entry.options[CONF_CONTINUOUS], + delay=config_entry.options[CONF_DELAY], + ) ) try: diff --git a/homeassistant/components/roomba/config_flow.py b/homeassistant/components/roomba/config_flow.py index 2dbecdf32f2..7aee875308b 100644 --- a/homeassistant/components/roomba/config_flow.py +++ b/homeassistant/components/roomba/config_flow.py @@ -1,6 +1,7 @@ """Config flow to configure roomba component.""" import asyncio +from functools import partial from roombapy import RoombaFactory from roombapy.discovery import RoombaDiscovery @@ -41,12 +42,15 @@ async def validate_input(hass: core.HomeAssistant, data): Data has the keys from DATA_SCHEMA with values provided by the user. """ - roomba = RoombaFactory.create_roomba( - address=data[CONF_HOST], - blid=data[CONF_BLID], - password=data[CONF_PASSWORD], - continuous=False, - delay=data[CONF_DELAY], + roomba = await hass.async_add_executor_job( + partial( + RoombaFactory.create_roomba, + address=data[CONF_HOST], + blid=data[CONF_BLID], + password=data[CONF_PASSWORD], + continuous=False, + delay=data[CONF_DELAY], + ) ) info = await async_connect_or_timeout(hass, roomba)