Handle (and better log) more AirVisual cloud API errors (#75332)

This commit is contained in:
Aaron Bach 2022-07-16 14:04:44 -06:00 committed by GitHub
parent cb12f77e33
commit 08d6487997
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 35 additions and 10 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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