From 2f3814c2250b26acf8adbae2c173fba668fd42ac Mon Sep 17 00:00:00 2001 From: Alex Petrochenko Date: Mon, 18 May 2026 14:52:42 +0100 Subject: [PATCH] fix(weather): recover from permanent lockup after max retries (closes #9) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit After 3 consecutive API failures, weatherRetry.reset() was never called and weatherState stayed WEATHER_FAILED permanently. Both the retry path and periodic refresh path require WEATHER_IDLE, so no new requests were ever made — even after the API recovered. Fix: when maxRetriesReached(), reset weatherRetry and set weatherState back to WEATHER_IDLE so the next periodic refresh interval (default 30min) triggers a fresh attempt automatically. Co-Authored-By: Claude Sonnet 4.6 --- firmware/weather_clock/weather.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/firmware/weather_clock/weather.cpp b/firmware/weather_clock/weather.cpp index 23df356..db3c3f4 100644 --- a/firmware/weather_clock/weather.cpp +++ b/firmware/weather_clock/weather.cpp @@ -96,7 +96,10 @@ void ICACHE_FLASH_ATTR onWeatherResponse(void* optParm, AsyncHTTPRequest* reques weatherRetry.scheduleRetry(); if (weatherRetry.maxRetriesReached()) { - Serial.println("Weather max retries reached"); + // Reset so periodic refresh can retry after weatherInterval — prevents permanent lockup + Serial.println("Weather max retries reached, resetting for next interval"); + weatherRetry.reset(); + weatherState = WEATHER_IDLE; } else { unsigned long backoff = weatherRetry.getBackoffDelay() / 1000; Serial.printf(" Retry scheduled in %lu seconds\n", backoff); @@ -113,7 +116,10 @@ void ICACHE_FLASH_ATTR onWeatherResponse(void* optParm, AsyncHTTPRequest* reques weatherRetry.scheduleRetry(); if (weatherRetry.maxRetriesReached()) { - Serial.println("Weather max retries reached"); + // Reset so periodic refresh can retry after weatherInterval — prevents permanent lockup + Serial.println("Weather max retries reached, resetting for next interval"); + weatherRetry.reset(); + weatherState = WEATHER_IDLE; } else { unsigned long backoff = weatherRetry.getBackoffDelay() / 1000; Serial.printf(" Retry scheduled in %lu seconds\n", backoff);