1 """The roomba component."""
5 from functools
import partial
9 from roombapy
import Roomba, RoombaConnectionError, RoombaFactory
11 from homeassistant
import exceptions
18 EVENT_HOMEASSISTANT_STOP,
22 from .const
import CONF_BLID, CONF_CONTINUOUS, DOMAIN, PLATFORMS, ROOMBA_SESSION
23 from .models
import RoombaData
25 _LOGGER = logging.getLogger(__name__)
29 """Set the config entry up."""
32 if not config_entry.options:
33 hass.config_entries.async_update_entry(
36 CONF_CONTINUOUS: config_entry.data[CONF_CONTINUOUS],
37 CONF_DELAY: config_entry.data[CONF_DELAY],
41 roomba = await hass.async_add_executor_job(
43 RoombaFactory.create_roomba,
44 address=config_entry.data[CONF_HOST],
45 blid=config_entry.data[CONF_BLID],
46 password=config_entry.data[CONF_PASSWORD],
47 continuous=config_entry.options[CONF_CONTINUOUS],
48 delay=config_entry.options[CONF_DELAY],
55 except CannotConnect
as err:
58 async
def _async_disconnect_roomba(event):
61 config_entry.async_on_unload(
62 hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _async_disconnect_roomba)
65 domain_data =
RoombaData(roomba, config_entry.data[CONF_BLID])
66 hass.data.setdefault(DOMAIN, {})[config_entry.entry_id] = domain_data
68 await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS)
70 if not config_entry.update_listeners:
71 config_entry.add_update_listener(async_update_options)
77 hass: HomeAssistant, roomba: Roomba
79 """Connect to vacuum."""
82 async
with asyncio.timeout(10):
83 _LOGGER.debug(
"Initialize connection to vacuum")
84 await hass.async_add_executor_job(roomba.connect)
85 while not roomba.roomba_connected
or name
is None:
90 await asyncio.sleep(1)
91 except RoombaConnectionError
as err:
92 _LOGGER.debug(
"Error to connect to vacuum: %s", err)
93 raise CannotConnect
from err
94 except TimeoutError
as err:
97 _LOGGER.debug(
"Timeout expired: %s", err)
98 raise CannotConnect
from err
100 return {ROOMBA_SESSION: roomba, CONF_NAME: name}
104 """Disconnect to vacuum."""
105 _LOGGER.debug(
"Disconnect vacuum")
106 with contextlib.suppress(TimeoutError):
107 async
with asyncio.timeout(3):
108 await hass.async_add_executor_job(roomba.disconnect)
112 """Update options."""
113 await hass.config_entries.async_reload(config_entry.entry_id)
117 """Unload a config entry."""
118 unload_ok = await hass.config_entries.async_unload_platforms(
119 config_entry, PLATFORMS
122 domain_data: RoombaData = hass.data[DOMAIN][config_entry.entry_id]
124 hass.data[DOMAIN].pop(config_entry.entry_id)
131 return roomba.master_state.get(
"state", {}).
get(
"reported", {})
135 """Error to indicate we cannot connect."""
web.Response get(self, web.Request request, str config_key)
None async_update_options(HomeAssistant hass, ConfigEntry config_entry)
dict[str, Any] roomba_reported_state(Roomba roomba)
dict[str, Any] async_connect_or_timeout(HomeAssistant hass, Roomba roomba)
None async_disconnect_or_timeout(HomeAssistant hass, Roomba roomba)
bool async_unload_entry(HomeAssistant hass, ConfigEntry config_entry)
bool async_setup_entry(HomeAssistant hass, ConfigEntry config_entry)