mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 22:27:07 +00:00
Handle Huawei LTE timeouts (#28465)
This commit is contained in:
parent
314c3d0965
commit
b904a2c5ad
@ -5,6 +5,7 @@
|
|||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"connection_failed": "Connection failed",
|
"connection_failed": "Connection failed",
|
||||||
|
"connection_timeout": "Connection timeout",
|
||||||
"incorrect_password": "Incorrect password",
|
"incorrect_password": "Incorrect password",
|
||||||
"incorrect_username": "Incorrect username",
|
"incorrect_username": "Incorrect username",
|
||||||
"incorrect_username_or_password": "Incorrect username or password",
|
"incorrect_username_or_password": "Incorrect username or password",
|
||||||
|
@ -18,6 +18,7 @@ from huawei_lte_api.exceptions import (
|
|||||||
ResponseErrorLoginRequiredException,
|
ResponseErrorLoginRequiredException,
|
||||||
ResponseErrorNotSupportedException,
|
ResponseErrorNotSupportedException,
|
||||||
)
|
)
|
||||||
|
from requests.exceptions import Timeout
|
||||||
from url_normalize import url_normalize
|
from url_normalize import url_normalize
|
||||||
|
|
||||||
from homeassistant.components.device_tracker import DOMAIN as DEVICE_TRACKER_DOMAIN
|
from homeassistant.components.device_tracker import DOMAIN as DEVICE_TRACKER_DOMAIN
|
||||||
@ -33,6 +34,7 @@ from homeassistant.const import (
|
|||||||
EVENT_HOMEASSISTANT_STOP,
|
EVENT_HOMEASSISTANT_STOP,
|
||||||
)
|
)
|
||||||
from homeassistant.core import CALLBACK_TYPE
|
from homeassistant.core import CALLBACK_TYPE
|
||||||
|
from homeassistant.exceptions import ConfigEntryNotReady
|
||||||
from homeassistant.helpers import config_validation as cv, discovery
|
from homeassistant.helpers import config_validation as cv, discovery
|
||||||
from homeassistant.helpers.dispatcher import (
|
from homeassistant.helpers.dispatcher import (
|
||||||
async_dispatcher_connect,
|
async_dispatcher_connect,
|
||||||
@ -44,6 +46,7 @@ from homeassistant.helpers.event import async_track_time_interval
|
|||||||
from homeassistant.helpers.typing import HomeAssistantType
|
from homeassistant.helpers.typing import HomeAssistantType
|
||||||
from .const import (
|
from .const import (
|
||||||
ALL_KEYS,
|
ALL_KEYS,
|
||||||
|
CONNECTION_TIMEOUT,
|
||||||
DEFAULT_DEVICE_NAME,
|
DEFAULT_DEVICE_NAME,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
KEY_DEVICE_BASIC_INFORMATION,
|
KEY_DEVICE_BASIC_INFORMATION,
|
||||||
@ -254,16 +257,21 @@ async def async_setup_entry(hass: HomeAssistantType, config_entry: ConfigEntry)
|
|||||||
username = config_entry.data.get(CONF_USERNAME)
|
username = config_entry.data.get(CONF_USERNAME)
|
||||||
password = config_entry.data.get(CONF_PASSWORD)
|
password = config_entry.data.get(CONF_PASSWORD)
|
||||||
if username or password:
|
if username or password:
|
||||||
connection = AuthorizedConnection(url, username=username, password=password)
|
connection = AuthorizedConnection(
|
||||||
|
url, username=username, password=password, timeout=CONNECTION_TIMEOUT
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
connection = Connection(url)
|
connection = Connection(url, timeout=CONNECTION_TIMEOUT)
|
||||||
return connection
|
return connection
|
||||||
|
|
||||||
def signal_update() -> None:
|
def signal_update() -> None:
|
||||||
"""Signal updates to data."""
|
"""Signal updates to data."""
|
||||||
dispatcher_send(hass, UPDATE_SIGNAL, url)
|
dispatcher_send(hass, UPDATE_SIGNAL, url)
|
||||||
|
|
||||||
|
try:
|
||||||
connection = await hass.async_add_executor_job(get_connection)
|
connection = await hass.async_add_executor_job(get_connection)
|
||||||
|
except Timeout as ex:
|
||||||
|
raise ConfigEntryNotReady from ex
|
||||||
|
|
||||||
# Set up router and store reference to it
|
# Set up router and store reference to it
|
||||||
router = Router(connection, url, mac, signal_update)
|
router = Router(connection, url, mac, signal_update)
|
||||||
|
@ -14,13 +14,14 @@ from huawei_lte_api.exceptions import (
|
|||||||
LoginErrorUsernamePasswordOverrunException,
|
LoginErrorUsernamePasswordOverrunException,
|
||||||
ResponseErrorException,
|
ResponseErrorException,
|
||||||
)
|
)
|
||||||
|
from requests.exceptions import Timeout
|
||||||
from url_normalize import url_normalize
|
from url_normalize import url_normalize
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.const import CONF_PASSWORD, CONF_RECIPIENT, CONF_URL, CONF_USERNAME
|
from homeassistant.const import CONF_PASSWORD, CONF_RECIPIENT, CONF_URL, CONF_USERNAME
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
from .const import DEFAULT_DEVICE_NAME
|
from .const import CONNECTION_TIMEOUT, DEFAULT_DEVICE_NAME
|
||||||
|
|
||||||
# https://github.com/PyCQA/pylint/issues/3202
|
# https://github.com/PyCQA/pylint/issues/3202
|
||||||
from .const import DOMAIN # pylint: disable=unused-import
|
from .const import DOMAIN # pylint: disable=unused-import
|
||||||
@ -115,12 +116,18 @@ class ConfigFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
"""Try connecting with given credentials."""
|
"""Try connecting with given credentials."""
|
||||||
if username or password:
|
if username or password:
|
||||||
conn = AuthorizedConnection(
|
conn = AuthorizedConnection(
|
||||||
user_input[CONF_URL], username=username, password=password
|
user_input[CONF_URL],
|
||||||
|
username=username,
|
||||||
|
password=password,
|
||||||
|
timeout=CONNECTION_TIMEOUT,
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
conn = AuthorizedConnection(
|
conn = AuthorizedConnection(
|
||||||
user_input[CONF_URL], username="", password=""
|
user_input[CONF_URL],
|
||||||
|
username="",
|
||||||
|
password="",
|
||||||
|
timeout=CONNECTION_TIMEOUT,
|
||||||
)
|
)
|
||||||
user_input[CONF_USERNAME] = ""
|
user_input[CONF_USERNAME] = ""
|
||||||
user_input[CONF_PASSWORD] = ""
|
user_input[CONF_PASSWORD] = ""
|
||||||
@ -129,7 +136,7 @@ class ConfigFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
"Could not login with empty credentials, proceeding unauthenticated",
|
"Could not login with empty credentials, proceeding unauthenticated",
|
||||||
exc_info=True,
|
exc_info=True,
|
||||||
)
|
)
|
||||||
conn = Connection(user_input[CONF_URL])
|
conn = Connection(user_input[CONF_URL], timeout=CONNECTION_TIMEOUT)
|
||||||
del user_input[CONF_USERNAME]
|
del user_input[CONF_USERNAME]
|
||||||
del user_input[CONF_PASSWORD]
|
del user_input[CONF_PASSWORD]
|
||||||
return conn
|
return conn
|
||||||
@ -170,6 +177,9 @@ class ConfigFlowHandler(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
except ResponseErrorException:
|
except ResponseErrorException:
|
||||||
_LOGGER.warning("Response error", exc_info=True)
|
_LOGGER.warning("Response error", exc_info=True)
|
||||||
errors["base"] = "response_error"
|
errors["base"] = "response_error"
|
||||||
|
except Timeout:
|
||||||
|
_LOGGER.warning("Connection timeout", exc_info=True)
|
||||||
|
errors[CONF_URL] = "connection_timeout"
|
||||||
except Exception: # pylint: disable=broad-except
|
except Exception: # pylint: disable=broad-except
|
||||||
_LOGGER.warning("Unknown error connecting to device", exc_info=True)
|
_LOGGER.warning("Unknown error connecting to device", exc_info=True)
|
||||||
errors[CONF_URL] = "unknown_connection_error"
|
errors[CONF_URL] = "unknown_connection_error"
|
||||||
|
@ -10,6 +10,8 @@ UPDATE_OPTIONS_SIGNAL = f"{DOMAIN}_options_update"
|
|||||||
UNIT_BYTES = "B"
|
UNIT_BYTES = "B"
|
||||||
UNIT_SECONDS = "s"
|
UNIT_SECONDS = "s"
|
||||||
|
|
||||||
|
CONNECTION_TIMEOUT = 10
|
||||||
|
|
||||||
KEY_DEVICE_BASIC_INFORMATION = "device_basic_information"
|
KEY_DEVICE_BASIC_INFORMATION = "device_basic_information"
|
||||||
KEY_DEVICE_INFORMATION = "device_information"
|
KEY_DEVICE_INFORMATION = "device_information"
|
||||||
KEY_DEVICE_SIGNAL = "device_signal"
|
KEY_DEVICE_SIGNAL = "device_signal"
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
"invalid_url": "Invalid URL",
|
"invalid_url": "Invalid URL",
|
||||||
"login_attempts_exceeded": "Maximum login attempts exceeded, please try again later",
|
"login_attempts_exceeded": "Maximum login attempts exceeded, please try again later",
|
||||||
"response_error": "Unknown error from device",
|
"response_error": "Unknown error from device",
|
||||||
|
"connection_timeout": "Connection timeout",
|
||||||
"unknown_connection_error": "Unknown error connecting to device"
|
"unknown_connection_error": "Unknown error connecting to device"
|
||||||
},
|
},
|
||||||
"step": {
|
"step": {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user