From 4d681ed2e23419099f51c23e7253c801a95f6a7a Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Mon, 24 Mar 2025 09:00:05 +0100 Subject: [PATCH] Support fw upgrade via MQTT with JSON payload (#941) --- lib/JsonMqttHandler/include/JsonMqttHandler.h | 1 + lib/JsonMqttHandler/src/JsonMqttHandler.cpp | 23 ++++++++++++++++++- lib/RawMqttHandler/src/RawMqttHandler.cpp | 8 +++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/JsonMqttHandler/include/JsonMqttHandler.h b/lib/JsonMqttHandler/include/JsonMqttHandler.h index ca9cbb0e..dc997b9b 100644 --- a/lib/JsonMqttHandler/include/JsonMqttHandler.h +++ b/lib/JsonMqttHandler/include/JsonMqttHandler.h @@ -25,6 +25,7 @@ public: bool publishPrices(PriceService*); bool publishSystem(HwTools* hw, PriceService* ps, EnergyAccounting* ea); bool publishRaw(String data); + bool publishFirmware(); void onMessage(String &topic, String &payload); diff --git a/lib/JsonMqttHandler/src/JsonMqttHandler.cpp b/lib/JsonMqttHandler/src/JsonMqttHandler.cpp index a72d8bd0..530eab9d 100644 --- a/lib/JsonMqttHandler/src/JsonMqttHandler.cpp +++ b/lib/JsonMqttHandler/src/JsonMqttHandler.cpp @@ -432,5 +432,26 @@ bool JsonMqttHandler::publishRaw(String data) { return false; } -void JsonMqttHandler::onMessage(String &topic, String &payload) { +bool JsonMqttHandler::publishFirmware() { + snprintf_P(json, BufferSize, PSTR("{\"installed_version\":\"%s\",\"latest_version\":\"%s\",\"title\":\"amsreader firmware\",\"release_url\":\"https://github.com/UtilitechAS/amsreader-firmware/releases\",\"release_summary\":\"New version %s is available\",\"update_percentage\":%s}"), + FirmwareVersion::VersionString, + strlen(updater->getNextVersion()) == 0 ? FirmwareVersion::VersionString : updater->getNextVersion(), + strlen(updater->getNextVersion()) == 0 ? FirmwareVersion::VersionString : updater->getNextVersion(), + updater->getProgress() < 0 ? "null" : String(updater->getProgress(), 0) + ); + char topic[192]; + snprintf_P(topic, 192, PSTR("%s/firmware"), mqttConfig.publishTopic); + bool ret = mqtt.publish(topic, json); + loop(); + return ret; +} + +void JsonMqttHandler::onMessage(String &topic, String &payload) { + if(strncmp(topic.c_str(), mqttConfig.subscribeTopic, 12) == 0) { + if(payload.equals("fwupgrade")) { + if(strcmp(updater->getNextVersion(), FirmwareVersion::VersionString) != 0) { + updater->setTargetVersion(updater->getNextVersion()); + } + } + } } diff --git a/lib/RawMqttHandler/src/RawMqttHandler.cpp b/lib/RawMqttHandler/src/RawMqttHandler.cpp index 09d1077f..4c4c5b13 100644 --- a/lib/RawMqttHandler/src/RawMqttHandler.cpp +++ b/lib/RawMqttHandler/src/RawMqttHandler.cpp @@ -7,6 +7,7 @@ #include "RawMqttHandler.h" #include "hexutils.h" #include "Uptime.h" +#include "FirmwareVersion.h" bool RawMqttHandler::publish(AmsData* update, AmsData* previousState, EnergyAccounting* ea, PriceService* ps) { if(topic.isEmpty() || !mqtt.connected()) @@ -382,4 +383,11 @@ bool RawMqttHandler::publishRaw(String data) { } void RawMqttHandler::onMessage(String &topic, String &payload) { + if(strncmp(topic.c_str(), mqttConfig.subscribeTopic, 12) == 0) { + if(payload.equals("fwupgrade")) { + if(strcmp(updater->getNextVersion(), FirmwareVersion::VersionString) != 0) { + updater->setTargetVersion(updater->getNextVersion()); + } + } + } }