From 94594f599013ad3340c1a8694e7b9cec674ad53f Mon Sep 17 00:00:00 2001 From: Brett Adams Date: Sat, 19 Sep 2026 17:46:48 +1000 Subject: [PATCH] Reset Tesla Fleet energy history interval after rate limit backoff (#182453) --- .../components/tesla_fleet/coordinator.py | 2 ++ tests/components/tesla_fleet/test_init.py | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/homeassistant/components/tesla_fleet/coordinator.py b/homeassistant/components/tesla_fleet/coordinator.py index 0fa6d7e05e9a..de1806ab01c0 100644 --- a/homeassistant/components/tesla_fleet/coordinator.py +++ b/homeassistant/components/tesla_fleet/coordinator.py @@ -322,6 +322,8 @@ class TeslaFleetEnergySiteHistoryCoordinator(DataUpdateCoordinator[dict[str, Any async def _async_update_data(self) -> dict[str, Any]: """Update energy site history data using Tesla Fleet API.""" + self.update_interval = ENERGY_HISTORY_INTERVAL + try: data = (await self.api.energy_history(TeslaEnergyPeriod.DAY))["response"] except RateLimited as e: diff --git a/tests/components/tesla_fleet/test_init.py b/tests/components/tesla_fleet/test_init.py index e660cb767de1..991cc934a7bb 100644 --- a/tests/components/tesla_fleet/test_init.py +++ b/tests/components/tesla_fleet/test_init.py @@ -944,6 +944,41 @@ async def test_energy_history_refresh_ratelimited( assert mock_energy_history.call_count == 2 +async def test_energy_history_refresh_ratelimited_not_sticky( + hass: HomeAssistant, + normal_config_entry: MockConfigEntry, + mock_energy_history: AsyncMock, + freezer: FrozenDateTimeFactory, +) -> None: + """Test a 429 backoff only delays the next energy history refresh.""" + + await setup_platform(hass, normal_config_entry) + + after = ENERGY_HISTORY_INTERVAL + timedelta(seconds=10) + # The library passes the raw Retry-After header through as a string + mock_energy_history.side_effect = RateLimited( + {"after": str(int(after.total_seconds()))} + ) + freezer.tick(ENERGY_HISTORY_INTERVAL) + async_fire_time_changed(hass) + await hass.async_block_till_done() + + assert mock_energy_history.call_count == 1 + + mock_energy_history.side_effect = None + freezer.tick(after) + async_fire_time_changed(hass) + await hass.async_block_till_done() + + assert mock_energy_history.call_count == 2 + + freezer.tick(ENERGY_HISTORY_INTERVAL) + async_fire_time_changed(hass) + await hass.async_block_till_done() + + assert mock_energy_history.call_count == 3 + + async def test_init_region_issue( hass: HomeAssistant, normal_config_entry: MockConfigEntry,