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:
Luke 2023-04-27 15:10:34 -04:00 committed by GitHub
parent ac21f69ad0
commit efec50c8f0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 44 additions and 19 deletions

View File

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

View File

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

View File

@ -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"]
} }

View File

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

View File

@ -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": {

View File

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

View File

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

View File

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

View File

@ -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"}),
], ],
) )