mirror of
https://github.com/home-assistant/core.git
synced 2025-07-22 20:57:21 +00:00
Bump roborock to 0.8.1 for beta fixes (#92131)
* bump to 0.8.1 * add tests for new config flow errors * removed logs for known errors
This commit is contained in:
parent
ac21f69ad0
commit
efec50c8f0
@ -6,7 +6,13 @@ from typing import Any
|
|||||||
|
|
||||||
from roborock.api import RoborockApiClient
|
from roborock.api import RoborockApiClient
|
||||||
from roborock.containers import UserData
|
from roborock.containers import UserData
|
||||||
from roborock.exceptions import RoborockException
|
from roborock.exceptions import (
|
||||||
|
RoborockAccountDoesNotExist,
|
||||||
|
RoborockException,
|
||||||
|
RoborockInvalidCode,
|
||||||
|
RoborockInvalidEmail,
|
||||||
|
RoborockUrlException,
|
||||||
|
)
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
@ -43,9 +49,15 @@ class RoborockFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
self._client = RoborockApiClient(username)
|
self._client = RoborockApiClient(username)
|
||||||
try:
|
try:
|
||||||
await self._client.request_code()
|
await self._client.request_code()
|
||||||
|
except RoborockAccountDoesNotExist:
|
||||||
|
errors["base"] = "invalid_email"
|
||||||
|
except RoborockUrlException:
|
||||||
|
errors["base"] = "unknown_url"
|
||||||
|
except RoborockInvalidEmail:
|
||||||
|
errors["base"] = "invalid_email_format"
|
||||||
except RoborockException as ex:
|
except RoborockException as ex:
|
||||||
_LOGGER.exception(ex)
|
_LOGGER.exception(ex)
|
||||||
errors["base"] = "invalid_email"
|
errors["base"] = "unknown_roborock"
|
||||||
except Exception as ex: # pylint: disable=broad-except
|
except Exception as ex: # pylint: disable=broad-except
|
||||||
_LOGGER.exception(ex)
|
_LOGGER.exception(ex)
|
||||||
errors["base"] = "unknown"
|
errors["base"] = "unknown"
|
||||||
@ -70,9 +82,11 @@ class RoborockFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
_LOGGER.debug("Logging into Roborock account using email provided code")
|
_LOGGER.debug("Logging into Roborock account using email provided code")
|
||||||
try:
|
try:
|
||||||
login_data = await self._client.code_login(code)
|
login_data = await self._client.code_login(code)
|
||||||
|
except RoborockInvalidCode:
|
||||||
|
errors["base"] = "invalid_code"
|
||||||
except RoborockException as ex:
|
except RoborockException as ex:
|
||||||
_LOGGER.exception(ex)
|
_LOGGER.exception(ex)
|
||||||
errors["base"] = "invalid_code"
|
errors["base"] = "unknown_roborock"
|
||||||
except Exception as ex: # pylint: disable=broad-except
|
except Exception as ex: # pylint: disable=broad-except
|
||||||
_LOGGER.exception(ex)
|
_LOGGER.exception(ex)
|
||||||
errors["base"] = "unknown"
|
errors["base"] = "unknown"
|
||||||
|
@ -13,7 +13,7 @@ from roborock.containers import (
|
|||||||
)
|
)
|
||||||
from roborock.exceptions import RoborockException
|
from roborock.exceptions import RoborockException
|
||||||
from roborock.local_api import RoborockLocalClient
|
from roborock.local_api import RoborockLocalClient
|
||||||
from roborock.typing import RoborockDeviceProp
|
from roborock.typing import DeviceProp
|
||||||
|
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||||
@ -26,9 +26,7 @@ SCAN_INTERVAL = timedelta(seconds=30)
|
|||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class RoborockDataUpdateCoordinator(
|
class RoborockDataUpdateCoordinator(DataUpdateCoordinator[dict[str, DeviceProp]]):
|
||||||
DataUpdateCoordinator[dict[str, RoborockDeviceProp]]
|
|
||||||
):
|
|
||||||
"""Class to manage fetching data from the API."""
|
"""Class to manage fetching data from the API."""
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
@ -50,7 +48,7 @@ class RoborockDataUpdateCoordinator(
|
|||||||
device,
|
device,
|
||||||
networking,
|
networking,
|
||||||
product_info[device.product_id],
|
product_info[device.product_id],
|
||||||
RoborockDeviceProp(),
|
DeviceProp(),
|
||||||
)
|
)
|
||||||
local_devices_info[device.duid] = RoborockLocalDeviceInfo(
|
local_devices_info[device.duid] = RoborockLocalDeviceInfo(
|
||||||
device, networking
|
device, networking
|
||||||
@ -71,7 +69,7 @@ class RoborockDataUpdateCoordinator(
|
|||||||
else:
|
else:
|
||||||
device_info.props = device_prop
|
device_info.props = device_prop
|
||||||
|
|
||||||
async def _async_update_data(self) -> dict[str, RoborockDeviceProp]:
|
async def _async_update_data(self) -> dict[str, DeviceProp]:
|
||||||
"""Update data via library."""
|
"""Update data via library."""
|
||||||
try:
|
try:
|
||||||
await asyncio.gather(
|
await asyncio.gather(
|
||||||
|
@ -6,5 +6,5 @@
|
|||||||
"documentation": "https://www.home-assistant.io/integrations/roborock",
|
"documentation": "https://www.home-assistant.io/integrations/roborock",
|
||||||
"iot_class": "local_polling",
|
"iot_class": "local_polling",
|
||||||
"loggers": ["roborock"],
|
"loggers": ["roborock"],
|
||||||
"requirements": ["python-roborock==0.6.5"]
|
"requirements": ["python-roborock==0.8.1"]
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
|
||||||
from roborock.containers import HomeDataDevice, HomeDataProduct, NetworkInfo
|
from roborock.containers import HomeDataDevice, HomeDataProduct, NetworkInfo
|
||||||
from roborock.typing import RoborockDeviceProp
|
from roborock.typing import DeviceProp
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@ -12,4 +12,4 @@ class RoborockHassDeviceInfo:
|
|||||||
device: HomeDataDevice
|
device: HomeDataDevice
|
||||||
network_info: NetworkInfo
|
network_info: NetworkInfo
|
||||||
product: HomeDataProduct
|
product: HomeDataProduct
|
||||||
props: RoborockDeviceProp
|
props: DeviceProp
|
||||||
|
@ -17,6 +17,9 @@
|
|||||||
"error": {
|
"error": {
|
||||||
"invalid_code": "The code you entered was incorrect, please check it and try again.",
|
"invalid_code": "The code you entered was incorrect, please check it and try again.",
|
||||||
"invalid_email": "There is no account associated with the email you entered, please try again.",
|
"invalid_email": "There is no account associated with the email you entered, please try again.",
|
||||||
|
"invalid_email_format": "There is an issue with the formatting of your email - please try again.",
|
||||||
|
"unknown_roborock": "There was an unknown roborock exception - please check your logs.",
|
||||||
|
"unknown_url": "There was an issue determining the correct url for your roborock account - please check your logs.",
|
||||||
"unknown": "[%key:common::config_flow::error::unknown%]"
|
"unknown": "[%key:common::config_flow::error::unknown%]"
|
||||||
},
|
},
|
||||||
"abort": {
|
"abort": {
|
||||||
|
@ -2108,7 +2108,7 @@ python-qbittorrent==0.4.2
|
|||||||
python-ripple-api==0.0.3
|
python-ripple-api==0.0.3
|
||||||
|
|
||||||
# homeassistant.components.roborock
|
# homeassistant.components.roborock
|
||||||
python-roborock==0.6.5
|
python-roborock==0.8.1
|
||||||
|
|
||||||
# homeassistant.components.smarttub
|
# homeassistant.components.smarttub
|
||||||
python-smarttub==0.0.33
|
python-smarttub==0.0.33
|
||||||
|
@ -1516,7 +1516,7 @@ python-picnic-api==1.1.0
|
|||||||
python-qbittorrent==0.4.2
|
python-qbittorrent==0.4.2
|
||||||
|
|
||||||
# homeassistant.components.roborock
|
# homeassistant.components.roborock
|
||||||
python-roborock==0.6.5
|
python-roborock==0.8.1
|
||||||
|
|
||||||
# homeassistant.components.smarttub
|
# homeassistant.components.smarttub
|
||||||
python-smarttub==0.0.33
|
python-smarttub==0.0.33
|
||||||
|
@ -10,7 +10,7 @@ from roborock.containers import (
|
|||||||
Status,
|
Status,
|
||||||
UserData,
|
UserData,
|
||||||
)
|
)
|
||||||
from roborock.typing import RoborockDeviceProp
|
from roborock.typing import DeviceProp
|
||||||
|
|
||||||
# All data is based on a U.S. customer with a Roborock S7 MaxV Ultra
|
# All data is based on a U.S. customer with a Roborock S7 MaxV Ultra
|
||||||
USER_EMAIL = "user@domain.com"
|
USER_EMAIL = "user@domain.com"
|
||||||
@ -367,4 +367,4 @@ STATUS = Status.from_dict(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
PROP = RoborockDeviceProp(STATUS, DND_TIMER, CLEAN_SUMMARY, CONSUMABLE, CLEAN_RECORD)
|
PROP = DeviceProp(STATUS, DND_TIMER, CLEAN_SUMMARY, CONSUMABLE, CLEAN_RECORD)
|
||||||
|
@ -2,7 +2,13 @@
|
|||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from roborock.exceptions import RoborockException
|
from roborock.exceptions import (
|
||||||
|
RoborockAccountDoesNotExist,
|
||||||
|
RoborockException,
|
||||||
|
RoborockInvalidCode,
|
||||||
|
RoborockInvalidEmail,
|
||||||
|
RoborockUrlException,
|
||||||
|
)
|
||||||
|
|
||||||
from homeassistant import config_entries, data_entry_flow
|
from homeassistant import config_entries, data_entry_flow
|
||||||
from homeassistant.components.roborock.const import CONF_ENTRY_CODE, DOMAIN
|
from homeassistant.components.roborock.const import CONF_ENTRY_CODE, DOMAIN
|
||||||
@ -55,7 +61,10 @@ async def test_config_flow_success(
|
|||||||
"request_code_errors",
|
"request_code_errors",
|
||||||
),
|
),
|
||||||
[
|
[
|
||||||
(RoborockException(), {"base": "invalid_email"}),
|
(RoborockException(), {"base": "unknown_roborock"}),
|
||||||
|
(RoborockAccountDoesNotExist(), {"base": "invalid_email"}),
|
||||||
|
(RoborockInvalidEmail(), {"base": "invalid_email_format"}),
|
||||||
|
(RoborockUrlException(), {"base": "unknown_url"}),
|
||||||
(Exception(), {"base": "unknown"}),
|
(Exception(), {"base": "unknown"}),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
@ -115,7 +124,8 @@ async def test_config_flow_failures_request_code(
|
|||||||
"code_login_errors",
|
"code_login_errors",
|
||||||
),
|
),
|
||||||
[
|
[
|
||||||
(RoborockException(), {"base": "invalid_code"}),
|
(RoborockException(), {"base": "unknown_roborock"}),
|
||||||
|
(RoborockInvalidCode(), {"base": "invalid_code"}),
|
||||||
(Exception(), {"base": "unknown"}),
|
(Exception(), {"base": "unknown"}),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user