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 collections.abc import Mapping
from datetime import timedelta from datetime import timedelta
from math import ceil from math import ceil
from typing import Any, cast from typing import Any
from pyairvisual import CloudAPI, NodeSamba from pyairvisual import CloudAPI, NodeSamba
from pyairvisual.errors import ( from pyairvisual.errors import (
@ -12,6 +12,7 @@ from pyairvisual.errors import (
InvalidKeyError, InvalidKeyError,
KeyExpiredError, KeyExpiredError,
NodeProError, NodeProError,
UnauthorizedError,
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
@ -210,9 +211,8 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
) )
try: try:
data = await api_coro return await api_coro
return cast(dict[str, Any], data) except (InvalidKeyError, KeyExpiredError, UnauthorizedError) as ex:
except (InvalidKeyError, KeyExpiredError) as ex:
raise ConfigEntryAuthFailed from ex raise ConfigEntryAuthFailed from ex
except AirVisualError as err: except AirVisualError as err:
raise UpdateFailed(f"Error while retrieving data: {err}") from 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( async with NodeSamba(
entry.data[CONF_IP_ADDRESS], entry.data[CONF_PASSWORD] entry.data[CONF_IP_ADDRESS], entry.data[CONF_PASSWORD]
) as node: ) as node:
data = await node.async_get_latest_measurements() return await node.async_get_latest_measurements()
return cast(dict[str, Any], data)
except NodeProError as err: except NodeProError as err:
raise UpdateFailed(f"Error while retrieving data: {err}") from 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 ( from pyairvisual.errors import (
AirVisualError, AirVisualError,
InvalidKeyError, InvalidKeyError,
KeyExpiredError,
NodeProError, NodeProError,
NotFoundError, NotFoundError,
UnauthorizedError,
) )
import voluptuous as vol 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: if user_input[CONF_API_KEY] not in valid_keys:
try: try:
await coro await coro
except InvalidKeyError: except (InvalidKeyError, KeyExpiredError, UnauthorizedError):
errors[CONF_API_KEY] = "invalid_api_key" errors[CONF_API_KEY] = "invalid_api_key"
except NotFoundError: except NotFoundError:
errors[CONF_CITY] = "location_not_found" errors[CONF_CITY] = "location_not_found"

View file

@ -3,7 +3,7 @@
"name": "AirVisual", "name": "AirVisual",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/airvisual", "documentation": "https://www.home-assistant.io/integrations/airvisual",
"requirements": ["pyairvisual==5.0.9"], "requirements": ["pyairvisual==2022.07.0"],
"codeowners": ["@bachya"], "codeowners": ["@bachya"],
"iot_class": "cloud_polling", "iot_class": "cloud_polling",
"loggers": ["pyairvisual", "pysmb"] "loggers": ["pyairvisual", "pysmb"]

View file

@ -1369,7 +1369,7 @@ pyaftership==21.11.0
pyairnow==1.1.0 pyairnow==1.1.0
# homeassistant.components.airvisual # homeassistant.components.airvisual
pyairvisual==5.0.9 pyairvisual==2022.07.0
# homeassistant.components.almond # homeassistant.components.almond
pyalmond==0.0.2 pyalmond==0.0.2

View file

@ -935,7 +935,7 @@ pyaehw4a1==0.3.9
pyairnow==1.1.0 pyairnow==1.1.0
# homeassistant.components.airvisual # homeassistant.components.airvisual
pyairvisual==5.0.9 pyairvisual==2022.07.0
# homeassistant.components.almond # homeassistant.components.almond
pyalmond==0.0.2 pyalmond==0.0.2

View file

@ -4,8 +4,10 @@ from unittest.mock import patch
from pyairvisual.errors import ( from pyairvisual.errors import (
AirVisualError, AirVisualError,
InvalidKeyError, InvalidKeyError,
KeyExpiredError,
NodeProError, NodeProError,
NotFoundError, NotFoundError,
UnauthorizedError,
) )
import pytest import pytest
@ -84,6 +86,28 @@ async def test_duplicate_error(hass, config, config_entry, data):
{CONF_API_KEY: "invalid_api_key"}, {CONF_API_KEY: "invalid_api_key"},
INTEGRATION_TYPE_GEOGRAPHY_NAME, 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", CONF_API_KEY: "abcde12345",