Handle (and better log) more AirVisual cloud API errors (#75332)
This commit is contained in:
parent
cb12f77e33
commit
08d6487997
6 changed files with 35 additions and 10 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"]
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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",
|
||||||
|
|
Loading…
Add table
Reference in a new issue