Disconnect roomba on stop event (#49235)

This commit is contained in:
J. Nick Koston 2021-04-14 23:24:43 -10:00 committed by GitHub
parent 2887eeb32f
commit 7a40d0f1c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 37 deletions

View File

@ -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

View File

@ -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)

View File

@ -9,3 +9,4 @@ DEFAULT_CONTINUOUS = True
DEFAULT_DELAY = 1
ROOMBA_SESSION = "roomba_session"
BLID = "blid_key"
CANCEL_STOP = "cancel_stop"

View File

@ -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