mirror of https://github.com/home-assistant/core
Disconnect roomba on stop event (#49235)
This commit is contained in:
parent
2887eeb32f
commit
7a40d0f1c2
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -9,3 +9,4 @@ DEFAULT_CONTINUOUS = True
|
|||
DEFAULT_DELAY = 1
|
||||
ROOMBA_SESSION = "roomba_session"
|
||||
BLID = "blid_key"
|
||||
CANCEL_STOP = "cancel_stop"
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue