diff --git a/custom_components/biketrax/config_flow.py b/custom_components/biketrax/config_flow.py index 8265d61..82e3645 100644 --- a/custom_components/biketrax/config_flow.py +++ b/custom_components/biketrax/config_flow.py @@ -5,7 +5,7 @@ from typing import Any import voluptuous as vol -from aiobiketrax import Account +from aiobiketrax import Account, exceptions from homeassistant import config_entries from homeassistant.core import HomeAssistant, callback from homeassistant.data_entry_flow import FlowResult @@ -37,10 +37,23 @@ async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, ) try: - await account.update_devices() - except: + try: + await account.update_devices() + except Exception as e: # pylint: disable=broad-except + _LOGGER.debug( + "Exception while validating input for '%s'.", + data["username"], + exc_info=e, + ) + raise + except exceptions.ConnectionError: + raise CannotConnect + except exceptions.AuthenticationError: raise InvalidAuth + if not account.devices: + raise NoDevice + return {"title": f"BikeTrax {data['username']}"} @@ -66,6 +79,8 @@ async def async_step_user( errors["base"] = "cannot_connect" except InvalidAuth: errors["base"] = "invalid_auth" + except NoDevice: + errors["base"] = "no_device" except Exception: # pylint: disable=broad-except _LOGGER.exception("Unexpected exception") errors["base"] = "unknown" @@ -131,3 +146,7 @@ class CannotConnect(HomeAssistantError): class InvalidAuth(HomeAssistantError): """Error to indicate there is invalid auth.""" + + +class NoDevice(HomeAssistantError): + """Error to indicate there are no devices.""" diff --git a/custom_components/biketrax/coordinator.py b/custom_components/biketrax/coordinator.py index 6a7833b..350c856 100644 --- a/custom_components/biketrax/coordinator.py +++ b/custom_components/biketrax/coordinator.py @@ -4,7 +4,7 @@ import logging from datetime import timedelta -from aiobiketrax import Account +from aiobiketrax import Account, exceptions from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed @@ -49,8 +49,10 @@ async def _async_update_data(self) -> None: for device in self.account.devices: await device.update_position() - except (HTTPError, TimeoutException) as err: - raise UpdateFailed(f"Error communicating with BikeTrax API: {err}") from err + except exceptions.BikeTraxError as err: + raise UpdateFailed( + f"A BikeTrax error occurred while updating the devices: {err}" + ) from err def start_background_task(self): """Start the websocket task.""" @@ -83,8 +85,10 @@ async def _async_update_data(self) -> None: try: for device in self.account.devices: await device.update_trips() - except (HTTPError, TimeoutException) as err: - raise UpdateFailed(f"Error communicating with BikeTrax API: {err}") from err + except exceptions.BikeTraxError as err: + raise UpdateFailed( + f"A BikeTrax error occurred while updating the trips: {err}" + ) from err class SubscriptionDataUpdateCoordinator(BikeTraxDataUpdateCoordinator): @@ -109,5 +113,7 @@ async def _async_update_data(self) -> None: try: for device in self.account.devices: await device.update_subscription() - except (HTTPError, TimeoutException) as err: - raise UpdateFailed(f"Error communicating with BikeTrax API: {err}") from err + except exceptions.BikeTraxError as err: + raise UpdateFailed( + f"A BikeTrax error occurred while updating the subscription data: {err}" + ) from err diff --git a/custom_components/biketrax/translations/de.json b/custom_components/biketrax/translations/de.json index 94bc194..ca656c8 100644 --- a/custom_components/biketrax/translations/de.json +++ b/custom_components/biketrax/translations/de.json @@ -1,11 +1,13 @@ { "config": { "abort": { - "already_configured": "Gerät wurde bereits konfiguriert" + "already_configured": "Ger\u00e4t wurde bereits konfiguriert" }, "error": { "cannot_connect": "Verbindung fehlgeschlagen", - "invalid_auth": "Ung\u00fcltige Authentifizierung" + "invalid_auth": "Ung\u00fcltige Authentifizierung", + "no_device": "Kein Ger\u00e4t mit Ihrem Konto verkn\u00fcpft", + "unknown": "Unerwarteter Fehler" }, "step": { "user": { diff --git a/custom_components/biketrax/translations/en.json b/custom_components/biketrax/translations/en.json index 1c95dc7..be416d7 100644 --- a/custom_components/biketrax/translations/en.json +++ b/custom_components/biketrax/translations/en.json @@ -6,6 +6,7 @@ "error": { "cannot_connect": "Failed to connect", "invalid_auth": "Invalid authentication", + "no_device": "No device connected to your account", "unknown": "Unexpected error" }, "step": { diff --git a/custom_components/biketrax/translations/nl.json b/custom_components/biketrax/translations/nl.json index 428707e..e8e833e 100644 --- a/custom_components/biketrax/translations/nl.json +++ b/custom_components/biketrax/translations/nl.json @@ -5,7 +5,9 @@ }, "error": { "cannot_connect": "Kan geen verbinding maken", - "invalid_auth": "Ongeldige authenticatie" + "invalid_auth": "Ongeldige authenticatie", + "no_device": "Er is geen apparat aan het account gekoppeld", + "unknown": "Onbekende fout" }, "step": { "user": {