From 3ddcffb7b7b3245111e9cd6d0b9975d8065d6039 Mon Sep 17 00:00:00 2001 From: "Mr. Bubbles" Date: Fri, 19 Jul 2024 12:26:40 +0200 Subject: [PATCH] Fix reauth error and exception in ista EcoTrend integration (#121482) --- .../components/ista_ecotrend/coordinator.py | 50 +++++++++---------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/homeassistant/components/ista_ecotrend/coordinator.py b/homeassistant/components/ista_ecotrend/coordinator.py index 8d55574f0a1..0f14cd06fe3 100644 --- a/homeassistant/components/ista_ecotrend/coordinator.py +++ b/homeassistant/components/ista_ecotrend/coordinator.py @@ -8,6 +8,7 @@ from typing import Any from pyecotrend_ista import KeycloakError, LoginError, PyEcotrendIsta, ServerError +from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_EMAIL from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryAuthFailed @@ -21,6 +22,8 @@ _LOGGER = logging.getLogger(__name__) class IstaCoordinator(DataUpdateCoordinator[dict[str, Any]]): """Ista EcoTrend data update coordinator.""" + config_entry: ConfigEntry + def __init__(self, hass: HomeAssistant, ista: PyEcotrendIsta) -> None: """Initialize ista EcoTrend data update coordinator.""" super().__init__( @@ -35,11 +38,14 @@ class IstaCoordinator(DataUpdateCoordinator[dict[str, Any]]): async def _async_update_data(self): """Fetch ista EcoTrend data.""" - if not self.details: - self.details = await self.async_get_details() - try: + await self.hass.async_add_executor_job(self.ista.login) + + if not self.details: + self.details = await self.async_get_details() + return await self.hass.async_add_executor_job(self.get_consumption_data) + except ServerError as e: raise UpdateFailed( "Unable to connect and retrieve data from ista EcoTrend, try again later" @@ -48,7 +54,9 @@ class IstaCoordinator(DataUpdateCoordinator[dict[str, Any]]): raise ConfigEntryAuthFailed( translation_domain=DOMAIN, translation_key="authentication_exception", - translation_placeholders={CONF_EMAIL: self.ista._email}, # noqa: SLF001 + translation_placeholders={ + CONF_EMAIL: self.config_entry.data[CONF_EMAIL] + }, ) from e def get_consumption_data(self) -> dict[str, Any]: @@ -61,26 +69,16 @@ class IstaCoordinator(DataUpdateCoordinator[dict[str, Any]]): async def async_get_details(self) -> dict[str, Any]: """Retrieve details of consumption units.""" - try: - result = await self.hass.async_add_executor_job( - self.ista.get_consumption_unit_details + + result = await self.hass.async_add_executor_job( + self.ista.get_consumption_unit_details + ) + + return { + consumption_unit: next( + details + for details in result["consumptionUnits"] + if details["id"] == consumption_unit ) - except ServerError as e: - raise UpdateFailed( - "Unable to connect and retrieve data from ista EcoTrend, try again later" - ) from e - except (LoginError, KeycloakError) as e: - raise ConfigEntryAuthFailed( - translation_domain=DOMAIN, - translation_key="authentication_exception", - translation_placeholders={CONF_EMAIL: self.ista._email}, # noqa: SLF001 - ) from e - else: - return { - consumption_unit: next( - details - for details in result["consumptionUnits"] - if details["id"] == consumption_unit - ) - for consumption_unit in self.ista.get_uuids() - } + for consumption_unit in self.ista.get_uuids() + }