From 8e4875cf69aba6126e5fd2962dc7b41b4f6755e2 Mon Sep 17 00:00:00 2001 From: EyJunge1 Date: Wed, 10 Jun 2026 11:01:43 +0200 Subject: [PATCH 1/2] Fix OTA controller update status after firmware update Sync the cached OTA controller version with the live SystemInfo version before computing controllerUpdateAvailable, so the web UI no longer shows an update prompt for the version already installed. Fixes #749 Co-authored-by: Cursor --- src/display/plugins/WebUIPlugin.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/display/plugins/WebUIPlugin.cpp b/src/display/plugins/WebUIPlugin.cpp index 76b016994..816dc7a21 100644 --- a/src/display/plugins/WebUIPlugin.cpp +++ b/src/display/plugins/WebUIPlugin.cpp @@ -848,15 +848,16 @@ void WebUIPlugin::updateOTAStatus(const String &version) { return; } Settings const &settings = controller->getSettings(); + const String controllerVersion = controller->getSystemInfo().version; + ota->setControllerVersion(controllerVersion); JsonDocument doc(&psramAllocator); - doc["latestVersion"] = ota->getCurrentVersion(); doc["tp"] = "res:ota-settings"; + doc["latestVersion"] = ota->getCurrentVersion(); doc["displayUpdateAvailable"] = ota->isUpdateAvailable(false); doc["controllerUpdateAvailable"] = ota->isUpdateAvailable(true); doc["displayVersion"] = BUILD_GIT_VERSION; - doc["controllerVersion"] = controller->getSystemInfo().version; + doc["controllerVersion"] = controllerVersion; doc["hardware"] = controller->getSystemInfo().hardware; - doc["latestVersion"] = ota->getCurrentVersion(); doc["channel"] = settings.getOTAChannel(); doc["updating"] = updating; // LittleFS usage metrics From 8c2500277f16752ff31e577023d65b64d6d34bc1 Mon Sep 17 00:00:00 2001 From: EyJunge1 Date: Wed, 10 Jun 2026 11:18:42 +0200 Subject: [PATCH 2/2] Address CodeRabbit review feedback for OTA status fix Remove the unused version parameter from updateOTAStatus() and only sync the OTA controller version cache when SystemInfo reports a change. Co-authored-by: Cursor --- src/display/plugins/WebUIPlugin.cpp | 11 +++++++---- src/display/plugins/WebUIPlugin.h | 3 ++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/display/plugins/WebUIPlugin.cpp b/src/display/plugins/WebUIPlugin.cpp index 816dc7a21..8df7539fd 100644 --- a/src/display/plugins/WebUIPlugin.cpp +++ b/src/display/plugins/WebUIPlugin.cpp @@ -126,7 +126,7 @@ void WebUIPlugin::loop() { ota->checkForUpdates(); pluginManager->trigger("ota:update:status", "value", ota->isUpdateAvailable()); lastUpdateCheck = now; - updateOTAStatus(ota->getCurrentVersion()); + updateOTAStatus(); } if (now > lastStatus + STATUS_PERIOD && !ws.getClients().empty()) { lastStatus = now; @@ -452,7 +452,7 @@ void WebUIPlugin::handleOTASettings(uint32_t clientId, JsonDocument &request) { lastUpdateCheck = 0; } } - updateOTAStatus("Checking..."); + updateOTAStatus(); } void WebUIPlugin::handleOTAStart(uint32_t clientId, JsonDocument &request) { @@ -843,13 +843,16 @@ void WebUIPlugin::handleBLEScaleInfo(AsyncWebServerRequest *request) { request->send(response); } -void WebUIPlugin::updateOTAStatus(const String &version) { +void WebUIPlugin::updateOTAStatus() { if (ws.getClients().empty()) { return; } Settings const &settings = controller->getSettings(); const String controllerVersion = controller->getSystemInfo().version; - ota->setControllerVersion(controllerVersion); + if (controllerVersion != lastSyncedControllerVersion) { + ota->setControllerVersion(controllerVersion); + lastSyncedControllerVersion = controllerVersion; + } JsonDocument doc(&psramAllocator); doc["tp"] = "res:ota-settings"; doc["latestVersion"] = ota->getCurrentVersion(); diff --git a/src/display/plugins/WebUIPlugin.h b/src/display/plugins/WebUIPlugin.h index 2d13f6906..f26a15296 100644 --- a/src/display/plugins/WebUIPlugin.h +++ b/src/display/plugins/WebUIPlugin.h @@ -47,7 +47,7 @@ class WebUIPlugin : public Plugin { void handleBLEScaleScan(AsyncWebServerRequest *request); void handleBLEScaleConnect(AsyncWebServerRequest *request); void handleBLEScaleInfo(AsyncWebServerRequest *request); - void updateOTAStatus(const String &version); + void updateOTAStatus(); void updateOTAProgress(uint8_t phase, int progress); void sendAutotuneResult(); void sendAutotuneFailed(); @@ -80,6 +80,7 @@ class WebUIPlugin : public Plugin { bool apMode = false; bool serverRunning = false; String updateComponent = ""; + String lastSyncedControllerVersion = ""; float currentBluetoothWeight = 0.0f; // Reused for every 500ms status broadcast. Allocating a fresh JsonDocument // each tick was a major contributor to internal-heap fragmentation