mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 06:07:17 +00:00
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/switch.py
|
||||||
homeassistant/components/rituals_perfume_genie/__init__.py
|
homeassistant/components/rituals_perfume_genie/__init__.py
|
||||||
homeassistant/components/rocketchat/notify.py
|
homeassistant/components/rocketchat/notify.py
|
||||||
|
homeassistant/components/roomba/__init__.py
|
||||||
homeassistant/components/roomba/binary_sensor.py
|
homeassistant/components/roomba/binary_sensor.py
|
||||||
homeassistant/components/roomba/braava.py
|
homeassistant/components/roomba/braava.py
|
||||||
homeassistant/components/roomba/irobot_base.py
|
homeassistant/components/roomba/irobot_base.py
|
||||||
|
@ -6,19 +6,27 @@ import async_timeout
|
|||||||
from roombapy import Roomba, RoombaConnectionError
|
from roombapy import Roomba, RoombaConnectionError
|
||||||
|
|
||||||
from homeassistant import exceptions
|
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__)
|
_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):
|
async def async_setup_entry(hass, config_entry):
|
||||||
"""Set the config entry up."""
|
"""Set the config entry up."""
|
||||||
# Set up roomba platforms with config entry
|
# Set up roomba platforms with config entry
|
||||||
@ -46,9 +54,18 @@ async def async_setup_entry(hass, config_entry):
|
|||||||
except CannotConnect as err:
|
except CannotConnect as err:
|
||||||
raise exceptions.ConfigEntryNotReady from 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] = {
|
hass.data[DOMAIN][config_entry.entry_id] = {
|
||||||
ROOMBA_SESSION: roomba,
|
ROOMBA_SESSION: roomba,
|
||||||
BLID: config_entry.data[CONF_BLID],
|
BLID: config_entry.data[CONF_BLID],
|
||||||
|
CANCEL_STOP: cancel_stop,
|
||||||
}
|
}
|
||||||
|
|
||||||
for platform in PLATFORMS:
|
for platform in PLATFORMS:
|
||||||
@ -76,12 +93,12 @@ async def async_connect_or_timeout(hass, roomba):
|
|||||||
break
|
break
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
except RoombaConnectionError as err:
|
except RoombaConnectionError as err:
|
||||||
_LOGGER.error("Error to connect to vacuum")
|
_LOGGER.debug("Error to connect to vacuum: %s", err)
|
||||||
raise CannotConnect from err
|
raise CannotConnect from err
|
||||||
except asyncio.TimeoutError as err:
|
except asyncio.TimeoutError as err:
|
||||||
# api looping if user or password incorrect and roomba exist
|
# api looping if user or password incorrect and roomba exist
|
||||||
await async_disconnect_or_timeout(hass, roomba)
|
await async_disconnect_or_timeout(hass, roomba)
|
||||||
_LOGGER.error("Timeout expired")
|
_LOGGER.debug("Timeout expired: %s", err)
|
||||||
raise CannotConnect from err
|
raise CannotConnect from err
|
||||||
|
|
||||||
return {ROOMBA_SESSION: roomba, CONF_NAME: name}
|
return {ROOMBA_SESSION: roomba, CONF_NAME: name}
|
||||||
@ -112,6 +129,7 @@ async def async_unload_entry(hass, config_entry):
|
|||||||
)
|
)
|
||||||
if unload_ok:
|
if unload_ok:
|
||||||
domain_data = hass.data[DOMAIN][config_entry.entry_id]
|
domain_data = hass.data[DOMAIN][config_entry.entry_id]
|
||||||
|
domain_data[CANCEL_STOP]()
|
||||||
await async_disconnect_or_timeout(hass, roomba=domain_data[ROOMBA_SESSION])
|
await async_disconnect_or_timeout(hass, roomba=domain_data[ROOMBA_SESSION])
|
||||||
hass.data[DOMAIN].pop(config_entry.entry_id)
|
hass.data[DOMAIN].pop(config_entry.entry_id)
|
||||||
|
|
||||||
|
@ -9,3 +9,4 @@ DEFAULT_CONTINUOUS = True
|
|||||||
DEFAULT_DELAY = 1
|
DEFAULT_DELAY = 1
|
||||||
ROOMBA_SESSION = "roomba_session"
|
ROOMBA_SESSION = "roomba_session"
|
||||||
BLID = "blid_key"
|
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",
|
"homeassistant.components.roomba.config_flow.RoombaPassword",
|
||||||
_mocked_getpassword,
|
_mocked_getpassword,
|
||||||
), patch(
|
), patch(
|
||||||
"homeassistant.components.roomba.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.roomba.async_setup_entry",
|
"homeassistant.components.roomba.async_setup_entry",
|
||||||
return_value=True,
|
return_value=True,
|
||||||
) as mock_setup_entry:
|
) as mock_setup_entry:
|
||||||
@ -171,7 +169,6 @@ async def test_form_user_discovery_and_password_fetch(hass):
|
|||||||
CONF_HOST: MOCK_IP,
|
CONF_HOST: MOCK_IP,
|
||||||
CONF_PASSWORD: "password",
|
CONF_PASSWORD: "password",
|
||||||
}
|
}
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.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",
|
"homeassistant.components.roomba.config_flow.RoombaPassword",
|
||||||
_mocked_getpassword,
|
_mocked_getpassword,
|
||||||
), patch(
|
), patch(
|
||||||
"homeassistant.components.roomba.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.roomba.async_setup_entry",
|
"homeassistant.components.roomba.async_setup_entry",
|
||||||
return_value=True,
|
return_value=True,
|
||||||
) as mock_setup_entry:
|
) 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_HOST: MOCK_IP,
|
||||||
CONF_PASSWORD: "password",
|
CONF_PASSWORD: "password",
|
||||||
}
|
}
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.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",
|
"homeassistant.components.roomba.config_flow.RoombaPassword",
|
||||||
_mocked_getpassword,
|
_mocked_getpassword,
|
||||||
), patch(
|
), patch(
|
||||||
"homeassistant.components.roomba.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.roomba.async_setup_entry",
|
"homeassistant.components.roomba.async_setup_entry",
|
||||||
return_value=True,
|
return_value=True,
|
||||||
) as mock_setup_entry:
|
) 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["type"] == data_entry_flow.RESULT_TYPE_ABORT
|
||||||
assert result4["reason"] == "cannot_connect"
|
assert result4["reason"] == "cannot_connect"
|
||||||
assert len(mock_setup.mock_calls) == 0
|
|
||||||
assert len(mock_setup_entry.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",
|
"homeassistant.components.roomba.config_flow.RoombaPassword",
|
||||||
_mocked_getpassword,
|
_mocked_getpassword,
|
||||||
), patch(
|
), patch(
|
||||||
"homeassistant.components.roomba.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.roomba.async_setup_entry",
|
"homeassistant.components.roomba.async_setup_entry",
|
||||||
return_value=True,
|
return_value=True,
|
||||||
) as mock_setup_entry:
|
) 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_HOST: MOCK_IP,
|
||||||
CONF_PASSWORD: "password",
|
CONF_PASSWORD: "password",
|
||||||
}
|
}
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.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",
|
"homeassistant.components.roomba.config_flow.Roomba",
|
||||||
return_value=mocked_roomba,
|
return_value=mocked_roomba,
|
||||||
), patch(
|
), patch(
|
||||||
"homeassistant.components.roomba.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.roomba.async_setup_entry",
|
"homeassistant.components.roomba.async_setup_entry",
|
||||||
return_value=True,
|
return_value=True,
|
||||||
) as mock_setup_entry:
|
) 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_HOST: MOCK_IP,
|
||||||
CONF_PASSWORD: "password",
|
CONF_PASSWORD: "password",
|
||||||
}
|
}
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.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",
|
"homeassistant.components.roomba.config_flow.Roomba",
|
||||||
return_value=mocked_roomba,
|
return_value=mocked_roomba,
|
||||||
), patch(
|
), patch(
|
||||||
"homeassistant.components.roomba.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.roomba.async_setup_entry",
|
"homeassistant.components.roomba.async_setup_entry",
|
||||||
return_value=True,
|
return_value=True,
|
||||||
) as mock_setup_entry:
|
) 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["type"] == data_entry_flow.RESULT_TYPE_FORM
|
||||||
assert result4["errors"] == {"base": "cannot_connect"}
|
assert result4["errors"] == {"base": "cannot_connect"}
|
||||||
assert len(mock_setup.mock_calls) == 0
|
|
||||||
assert len(mock_setup_entry.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",
|
"homeassistant.components.roomba.config_flow.Roomba",
|
||||||
return_value=mocked_roomba,
|
return_value=mocked_roomba,
|
||||||
), patch(
|
), patch(
|
||||||
"homeassistant.components.roomba.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.roomba.async_setup_entry",
|
"homeassistant.components.roomba.async_setup_entry",
|
||||||
return_value=True,
|
return_value=True,
|
||||||
) as mock_setup_entry:
|
) 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_HOST: MOCK_IP,
|
||||||
CONF_PASSWORD: "password",
|
CONF_PASSWORD: "password",
|
||||||
}
|
}
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.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",
|
"homeassistant.components.roomba.config_flow.RoombaPassword",
|
||||||
_mocked_getpassword,
|
_mocked_getpassword,
|
||||||
), patch(
|
), patch(
|
||||||
"homeassistant.components.roomba.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.roomba.async_setup_entry",
|
"homeassistant.components.roomba.async_setup_entry",
|
||||||
return_value=True,
|
return_value=True,
|
||||||
) as mock_setup_entry:
|
) 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_HOST: MOCK_IP,
|
||||||
CONF_PASSWORD: "password",
|
CONF_PASSWORD: "password",
|
||||||
}
|
}
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.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",
|
"homeassistant.components.roomba.config_flow.RoombaPassword",
|
||||||
_mocked_getpassword,
|
_mocked_getpassword,
|
||||||
), patch(
|
), patch(
|
||||||
"homeassistant.components.roomba.async_setup", return_value=True
|
|
||||||
) as mock_setup, patch(
|
|
||||||
"homeassistant.components.roomba.async_setup_entry",
|
"homeassistant.components.roomba.async_setup_entry",
|
||||||
return_value=True,
|
return_value=True,
|
||||||
) as mock_setup_entry:
|
) 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_HOST: MOCK_IP,
|
||||||
CONF_PASSWORD: "password",
|
CONF_PASSWORD: "password",
|
||||||
}
|
}
|
||||||
assert len(mock_setup.mock_calls) == 1
|
|
||||||
assert len(mock_setup_entry.mock_calls) == 1
|
assert len(mock_setup_entry.mock_calls) == 1
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user