diff --git a/.coveragerc b/.coveragerc index d3eee9c9f60..40daa9ce230 100644 --- a/.coveragerc +++ b/.coveragerc @@ -832,6 +832,7 @@ omit = homeassistant/components/rituals_perfume_genie/switch.py homeassistant/components/rituals_perfume_genie/__init__.py homeassistant/components/rocketchat/notify.py + homeassistant/components/roomba/__init__.py homeassistant/components/roomba/binary_sensor.py homeassistant/components/roomba/braava.py homeassistant/components/roomba/irobot_base.py diff --git a/homeassistant/components/roomba/__init__.py b/homeassistant/components/roomba/__init__.py index 6de775e1d99..ae1fc05ad53 100644 --- a/homeassistant/components/roomba/__init__.py +++ b/homeassistant/components/roomba/__init__.py @@ -6,19 +6,27 @@ import async_timeout from roombapy import Roomba, RoombaConnectionError from homeassistant import exceptions -from homeassistant.const import CONF_DELAY, CONF_HOST, CONF_NAME, CONF_PASSWORD +from homeassistant.const import ( + CONF_DELAY, + CONF_HOST, + CONF_NAME, + CONF_PASSWORD, + EVENT_HOMEASSISTANT_STOP, +) -from .const import BLID, CONF_BLID, CONF_CONTINUOUS, DOMAIN, PLATFORMS, ROOMBA_SESSION +from .const import ( + BLID, + CANCEL_STOP, + CONF_BLID, + CONF_CONTINUOUS, + DOMAIN, + PLATFORMS, + ROOMBA_SESSION, +) _LOGGER = logging.getLogger(__name__) -async def async_setup(hass, config): - """Set up the roomba environment.""" - hass.data.setdefault(DOMAIN, {}) - return True - - async def async_setup_entry(hass, config_entry): """Set the config entry up.""" # Set up roomba platforms with config entry @@ -46,9 +54,18 @@ async def async_setup_entry(hass, config_entry): except CannotConnect as err: raise exceptions.ConfigEntryNotReady from err + async def _async_disconnect_roomba(event): + await async_disconnect_or_timeout(hass, roomba) + + cancel_stop = hass.bus.async_listen_once( + EVENT_HOMEASSISTANT_STOP, _async_disconnect_roomba + ) + + hass.data.setdefault(DOMAIN, {}) hass.data[DOMAIN][config_entry.entry_id] = { ROOMBA_SESSION: roomba, BLID: config_entry.data[CONF_BLID], + CANCEL_STOP: cancel_stop, } for platform in PLATFORMS: @@ -76,12 +93,12 @@ async def async_connect_or_timeout(hass, roomba): break await asyncio.sleep(1) except RoombaConnectionError as err: - _LOGGER.error("Error to connect to vacuum") + _LOGGER.debug("Error to connect to vacuum: %s", err) raise CannotConnect from err except asyncio.TimeoutError as err: # api looping if user or password incorrect and roomba exist await async_disconnect_or_timeout(hass, roomba) - _LOGGER.error("Timeout expired") + _LOGGER.debug("Timeout expired: %s", err) raise CannotConnect from err return {ROOMBA_SESSION: roomba, CONF_NAME: name} @@ -112,6 +129,7 @@ async def async_unload_entry(hass, config_entry): ) if unload_ok: domain_data = hass.data[DOMAIN][config_entry.entry_id] + domain_data[CANCEL_STOP]() await async_disconnect_or_timeout(hass, roomba=domain_data[ROOMBA_SESSION]) hass.data[DOMAIN].pop(config_entry.entry_id) diff --git a/homeassistant/components/roomba/const.py b/homeassistant/components/roomba/const.py index 0509cd92116..2e59279cfdb 100644 --- a/homeassistant/components/roomba/const.py +++ b/homeassistant/components/roomba/const.py @@ -9,3 +9,4 @@ DEFAULT_CONTINUOUS = True DEFAULT_DELAY = 1 ROOMBA_SESSION = "roomba_session" BLID = "blid_key" +CANCEL_STOP = "cancel_stop" diff --git a/tests/components/roomba/test_config_flow.py b/tests/components/roomba/test_config_flow.py index ee3b7d4b497..e125e9bd5ba 100644 --- a/tests/components/roomba/test_config_flow.py +++ b/tests/components/roomba/test_config_flow.py @@ -150,8 +150,6 @@ async def test_form_user_discovery_and_password_fetch(hass): "homeassistant.components.roomba.config_flow.RoombaPassword", _mocked_getpassword, ), patch( - "homeassistant.components.roomba.async_setup", return_value=True - ) as mock_setup, patch( "homeassistant.components.roomba.async_setup_entry", return_value=True, ) as mock_setup_entry: @@ -171,7 +169,6 @@ async def test_form_user_discovery_and_password_fetch(hass): CONF_HOST: MOCK_IP, CONF_PASSWORD: "password", } - assert len(mock_setup.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1 @@ -269,8 +266,6 @@ async def test_form_user_discovery_manual_and_auto_password_fetch(hass): "homeassistant.components.roomba.config_flow.RoombaPassword", _mocked_getpassword, ), patch( - "homeassistant.components.roomba.async_setup", return_value=True - ) as mock_setup, patch( "homeassistant.components.roomba.async_setup_entry", return_value=True, ) as mock_setup_entry: @@ -290,7 +285,6 @@ async def test_form_user_discovery_manual_and_auto_password_fetch(hass): CONF_HOST: MOCK_IP, CONF_PASSWORD: "password", } - assert len(mock_setup.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1 @@ -371,8 +365,6 @@ async def test_form_user_discovery_manual_and_auto_password_fetch_but_cannot_con "homeassistant.components.roomba.config_flow.RoombaPassword", _mocked_getpassword, ), patch( - "homeassistant.components.roomba.async_setup", return_value=True - ) as mock_setup, patch( "homeassistant.components.roomba.async_setup_entry", return_value=True, ) as mock_setup_entry: @@ -384,7 +376,6 @@ async def test_form_user_discovery_manual_and_auto_password_fetch_but_cannot_con assert result4["type"] == data_entry_flow.RESULT_TYPE_ABORT assert result4["reason"] == "cannot_connect" - assert len(mock_setup.mock_calls) == 0 assert len(mock_setup_entry.mock_calls) == 0 @@ -425,8 +416,6 @@ async def test_form_user_discovery_no_devices_found_and_auto_password_fetch(hass "homeassistant.components.roomba.config_flow.RoombaPassword", _mocked_getpassword, ), patch( - "homeassistant.components.roomba.async_setup", return_value=True - ) as mock_setup, patch( "homeassistant.components.roomba.async_setup_entry", return_value=True, ) as mock_setup_entry: @@ -446,7 +435,6 @@ async def test_form_user_discovery_no_devices_found_and_auto_password_fetch(hass CONF_HOST: MOCK_IP, CONF_PASSWORD: "password", } - assert len(mock_setup.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1 @@ -494,8 +482,6 @@ async def test_form_user_discovery_no_devices_found_and_password_fetch_fails(has "homeassistant.components.roomba.config_flow.Roomba", return_value=mocked_roomba, ), patch( - "homeassistant.components.roomba.async_setup", return_value=True - ) as mock_setup, patch( "homeassistant.components.roomba.async_setup_entry", return_value=True, ) as mock_setup_entry: @@ -515,7 +501,6 @@ async def test_form_user_discovery_no_devices_found_and_password_fetch_fails(has CONF_HOST: MOCK_IP, CONF_PASSWORD: "password", } - assert len(mock_setup.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1 @@ -566,8 +551,6 @@ async def test_form_user_discovery_not_devices_found_and_password_fetch_fails_an "homeassistant.components.roomba.config_flow.Roomba", return_value=mocked_roomba, ), patch( - "homeassistant.components.roomba.async_setup", return_value=True - ) as mock_setup, patch( "homeassistant.components.roomba.async_setup_entry", return_value=True, ) as mock_setup_entry: @@ -579,7 +562,6 @@ async def test_form_user_discovery_not_devices_found_and_password_fetch_fails_an assert result4["type"] == data_entry_flow.RESULT_TYPE_FORM assert result4["errors"] == {"base": "cannot_connect"} - assert len(mock_setup.mock_calls) == 0 assert len(mock_setup_entry.mock_calls) == 0 @@ -627,8 +609,6 @@ async def test_form_user_discovery_and_password_fetch_gets_connection_refused(ha "homeassistant.components.roomba.config_flow.Roomba", return_value=mocked_roomba, ), patch( - "homeassistant.components.roomba.async_setup", return_value=True - ) as mock_setup, patch( "homeassistant.components.roomba.async_setup_entry", return_value=True, ) as mock_setup_entry: @@ -648,7 +628,6 @@ async def test_form_user_discovery_and_password_fetch_gets_connection_refused(ha CONF_HOST: MOCK_IP, CONF_PASSWORD: "password", } - assert len(mock_setup.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1 @@ -684,8 +663,6 @@ async def test_dhcp_discovery_and_roomba_discovery_finds(hass, discovery_data): "homeassistant.components.roomba.config_flow.RoombaPassword", _mocked_getpassword, ), patch( - "homeassistant.components.roomba.async_setup", return_value=True - ) as mock_setup, patch( "homeassistant.components.roomba.async_setup_entry", return_value=True, ) as mock_setup_entry: @@ -705,7 +682,6 @@ async def test_dhcp_discovery_and_roomba_discovery_finds(hass, discovery_data): CONF_HOST: MOCK_IP, CONF_PASSWORD: "password", } - assert len(mock_setup.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1 @@ -757,8 +733,6 @@ async def test_dhcp_discovery_falls_back_to_manual(hass, discovery_data): "homeassistant.components.roomba.config_flow.RoombaPassword", _mocked_getpassword, ), patch( - "homeassistant.components.roomba.async_setup", return_value=True - ) as mock_setup, patch( "homeassistant.components.roomba.async_setup_entry", return_value=True, ) as mock_setup_entry: @@ -778,7 +752,6 @@ async def test_dhcp_discovery_falls_back_to_manual(hass, discovery_data): CONF_HOST: MOCK_IP, CONF_PASSWORD: "password", } - assert len(mock_setup.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1