From 08d648799710b3b5696b86bbc42ec256d8b727fa Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Sat, 16 Jul 2022 14:04:44 -0600 Subject: [PATCH] Handle (and better log) more AirVisual cloud API errors (#75332) --- .../components/airvisual/__init__.py | 11 ++++----- .../components/airvisual/config_flow.py | 4 +++- .../components/airvisual/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- .../components/airvisual/test_config_flow.py | 24 +++++++++++++++++++ 6 files changed, 35 insertions(+), 10 deletions(-) diff --git a/homeassistant/components/airvisual/__init__.py b/homeassistant/components/airvisual/__init__.py index c1bb6020b3c..a2a3d76c3db 100644 --- a/homeassistant/components/airvisual/__init__.py +++ b/homeassistant/components/airvisual/__init__.py @@ -4,7 +4,7 @@ from __future__ import annotations from collections.abc import Mapping from datetime import timedelta from math import ceil -from typing import Any, cast +from typing import Any from pyairvisual import CloudAPI, NodeSamba from pyairvisual.errors import ( @@ -12,6 +12,7 @@ from pyairvisual.errors import ( InvalidKeyError, KeyExpiredError, NodeProError, + UnauthorizedError, ) from homeassistant.config_entries import ConfigEntry @@ -210,9 +211,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: ) try: - data = await api_coro - return cast(dict[str, Any], data) - except (InvalidKeyError, KeyExpiredError) as ex: + return await api_coro + except (InvalidKeyError, KeyExpiredError, UnauthorizedError) as ex: raise ConfigEntryAuthFailed from ex except AirVisualError as err: raise UpdateFailed(f"Error while retrieving data: {err}") from err @@ -253,8 +253,7 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: async with NodeSamba( entry.data[CONF_IP_ADDRESS], entry.data[CONF_PASSWORD] ) as node: - data = await node.async_get_latest_measurements() - return cast(dict[str, Any], data) + return await node.async_get_latest_measurements() except NodeProError as err: raise UpdateFailed(f"Error while retrieving data: {err}") from err diff --git a/homeassistant/components/airvisual/config_flow.py b/homeassistant/components/airvisual/config_flow.py index f97616c38fc..385c9f55753 100644 --- a/homeassistant/components/airvisual/config_flow.py +++ b/homeassistant/components/airvisual/config_flow.py @@ -9,8 +9,10 @@ from pyairvisual import CloudAPI, NodeSamba from pyairvisual.errors import ( AirVisualError, InvalidKeyError, + KeyExpiredError, NodeProError, NotFoundError, + UnauthorizedError, ) import voluptuous as vol @@ -119,7 +121,7 @@ class AirVisualFlowHandler(config_entries.ConfigFlow, domain=DOMAIN): if user_input[CONF_API_KEY] not in valid_keys: try: await coro - except InvalidKeyError: + except (InvalidKeyError, KeyExpiredError, UnauthorizedError): errors[CONF_API_KEY] = "invalid_api_key" except NotFoundError: errors[CONF_CITY] = "location_not_found" diff --git a/homeassistant/components/airvisual/manifest.json b/homeassistant/components/airvisual/manifest.json index ed803a3e6a1..9a6279f34a6 100644 --- a/homeassistant/components/airvisual/manifest.json +++ b/homeassistant/components/airvisual/manifest.json @@ -3,7 +3,7 @@ "name": "AirVisual", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/airvisual", - "requirements": ["pyairvisual==5.0.9"], + "requirements": ["pyairvisual==2022.07.0"], "codeowners": ["@bachya"], "iot_class": "cloud_polling", "loggers": ["pyairvisual", "pysmb"] diff --git a/requirements_all.txt b/requirements_all.txt index 706cf2b1a6b..ef293dcdcae 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1369,7 +1369,7 @@ pyaftership==21.11.0 pyairnow==1.1.0 # homeassistant.components.airvisual -pyairvisual==5.0.9 +pyairvisual==2022.07.0 # homeassistant.components.almond pyalmond==0.0.2 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index b0a4d4acff5..2b1ae82fd16 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -935,7 +935,7 @@ pyaehw4a1==0.3.9 pyairnow==1.1.0 # homeassistant.components.airvisual -pyairvisual==5.0.9 +pyairvisual==2022.07.0 # homeassistant.components.almond pyalmond==0.0.2 diff --git a/tests/components/airvisual/test_config_flow.py b/tests/components/airvisual/test_config_flow.py index 12a9e67122f..f97ee845dba 100644 --- a/tests/components/airvisual/test_config_flow.py +++ b/tests/components/airvisual/test_config_flow.py @@ -4,8 +4,10 @@ from unittest.mock import patch from pyairvisual.errors import ( AirVisualError, InvalidKeyError, + KeyExpiredError, NodeProError, NotFoundError, + UnauthorizedError, ) import pytest @@ -84,6 +86,28 @@ async def test_duplicate_error(hass, config, config_entry, data): {CONF_API_KEY: "invalid_api_key"}, INTEGRATION_TYPE_GEOGRAPHY_NAME, ), + ( + { + CONF_API_KEY: "abcde12345", + CONF_CITY: "Beijing", + CONF_STATE: "Beijing", + CONF_COUNTRY: "China", + }, + KeyExpiredError, + {CONF_API_KEY: "invalid_api_key"}, + INTEGRATION_TYPE_GEOGRAPHY_NAME, + ), + ( + { + CONF_API_KEY: "abcde12345", + CONF_CITY: "Beijing", + CONF_STATE: "Beijing", + CONF_COUNTRY: "China", + }, + UnauthorizedError, + {CONF_API_KEY: "invalid_api_key"}, + INTEGRATION_TYPE_GEOGRAPHY_NAME, + ), ( { CONF_API_KEY: "abcde12345",