Catch additional errors as potentially retryable errors during energy data updates (#169646)

This commit is contained in:
Andres Ruiz
2026-05-06 08:55:13 +00:00
committed by Franck Nijhof
parent 94732139f4
commit 0e8ecd1065
2 changed files with 20 additions and 6 deletions
@@ -13,6 +13,7 @@ from typing import TYPE_CHECKING
from waterfurnace.waterfurnace import (
WaterFurnace,
WFCredentialError,
WFError,
WFException,
WFGateway,
WFNoDataError,
@@ -174,7 +175,7 @@ class WaterFurnaceEnergyCoordinator(DataUpdateCoordinator[None]):
frequency="1H",
timezone_str=self.hass.config.time_zone,
)
except WFCredentialError:
except WFCredentialError, WFError:
try:
self.client.login()
except WFCredentialError as err:
@@ -192,6 +193,10 @@ class WaterFurnaceEnergyCoordinator(DataUpdateCoordinator[None]):
raise UpdateFailed(
"Authentication failed during energy data fetch"
) from err
except WFError as err:
raise UpdateFailed(
"Error fetching energy data after re-authentication"
) from err
return [
(reading.timestamp, reading.total_power)
for reading in data
@@ -5,7 +5,13 @@ from unittest.mock import Mock, patch
from freezegun.api import FrozenDateTimeFactory
import pytest
from waterfurnace.waterfurnace import WFCredentialError, WFEnergyData, WFNoDataError
from waterfurnace.waterfurnace import (
WFCredentialError,
WFEnergyData,
WFError,
WFException,
WFNoDataError,
)
from homeassistant.components.recorder import Recorder
from homeassistant.components.recorder.models.statistics import StatisticData
@@ -225,6 +231,10 @@ async def test_no_data_error_handled_gracefully(
assert mock_config_entry.state is ConfigEntryState.LOADED
@pytest.mark.parametrize(
"energy_error",
[WFCredentialError("session expired"), WFError("401 Unauthorized")],
)
@pytest.mark.freeze_time(NOW)
@pytest.mark.usefixtures("seed_statistics")
async def test_login_credential_error_raises_update_failed(
@@ -233,16 +243,15 @@ async def test_login_credential_error_raises_update_failed(
mock_config_entry: MockConfigEntry,
mock_waterfurnace_client: Mock,
freezer: FrozenDateTimeFactory,
energy_error: WFException,
) -> None:
"""Test that WFCredentialError during energy login raises UpdateFailed."""
"""Test that WFCredentialError/WFError during energy fetch triggers re-login."""
await _setup_integration(hass, mock_config_entry)
assert mock_config_entry.state is ConfigEntryState.LOADED
# On next poll, get_energy_data fails with expired session, then
# re-login also fails with credential error.
mock_waterfurnace_client.get_energy_data.side_effect = WFCredentialError(
"session expired"
)
mock_waterfurnace_client.get_energy_data.side_effect = energy_error
mock_waterfurnace_client.login.side_effect = WFCredentialError("bad creds")
await _trigger_energy_poll(hass, freezer)