Added MQTT Heartbeat and changed Firware Versioning System

This commit is contained in:
2025-12-03 18:22:17 +02:00
parent a7f1bd1667
commit b04590d270
9 changed files with 304 additions and 24 deletions

View File

@@ -126,8 +126,8 @@ void OTAManager::checkForUpdates(const String& channel) {
channel.c_str(), _configManager.getHardwareVariant().c_str());
if (checkVersion(channel)) {
float currentVersion = getCurrentVersion();
LOG_INFO("Current version: %.1f, Available version: %.1f (Channel: %s)",
uint16_t currentVersion = getCurrentVersion();
LOG_INFO("Current version: %u, Available version: %u (Channel: %s)",
currentVersion, _availableVersion, channel.c_str());
if (_availableVersion > currentVersion) {
@@ -180,9 +180,10 @@ void OTAManager::update(const String& channel) {
}
}
float OTAManager::getCurrentVersion() const {
uint16_t OTAManager::getCurrentVersion() const {
String fwVersionStr = _configManager.getFwVersion();
return fwVersionStr.toFloat();
// Parse integer directly: "130" -> 130
return fwVersionStr.toInt();
}
void OTAManager::setStatus(Status status, ErrorCode error) {
@@ -243,14 +244,14 @@ bool OTAManager::checkVersion(const String& channel) {
continue; // Try next server
}
// Extract metadata
_availableVersion = doc["version"].as<float>();
// Extract metadata - all integers now
_availableVersion = doc["version"].as<uint16_t>();
_availableChecksum = doc["checksum"].as<String>();
_updateChannel = doc["channel"].as<String>();
_isMandatory = doc["mandatory"].as<bool>();
_isEmergency = doc["emergency"].as<bool>();
_minVersion = doc["minVersion"].as<float>(); // ✅ NEW
_expectedFileSize = doc["fileSize"].as<size_t>(); // ✅ NEW
_minVersion = doc["minVersion"].as<uint16_t>();
_expectedFileSize = doc["fileSize"].as<size_t>();
// ✅ NEW: Validate channel matches requested
if (_updateChannel != channel) {
@@ -270,16 +271,16 @@ bool OTAManager::checkVersion(const String& channel) {
}
// ✅ NEW: Check minVersion compatibility
float currentVersion = getCurrentVersion();
if (_minVersion > 0.0f && currentVersion < _minVersion) {
LOG_ERROR("OTA: Current version %.1f is below minimum required %.1f",
uint16_t currentVersion = getCurrentVersion();
if (_minVersion > 0 && currentVersion < _minVersion) {
LOG_ERROR("OTA: Current version %u is below minimum required %u",
currentVersion, _minVersion);
LOG_ERROR("OTA: Intermediate update required first - cannot proceed");
_lastError = ErrorCode::VERSION_TOO_LOW;
continue; // Try next server
}
if (_availableVersion == 0.0f) {
if (_availableVersion == 0) {
LOG_ERROR("OTA: Invalid version in metadata from %s", baseUrl.c_str());
continue; // Try next server
}
@@ -290,7 +291,7 @@ bool OTAManager::checkVersion(const String& channel) {
}
LOG_INFO("OTA: Successfully got metadata from %s", baseUrl.c_str());
LOG_INFO("OTA: Expected file size: %u bytes, Min version: %.1f",
LOG_INFO("OTA: Expected file size: %u bytes, Min version: %u",
_expectedFileSize, _minVersion);
return true; // Success!
} else {
@@ -571,7 +572,8 @@ bool OTAManager::installFromSD(const String& filePath) {
}
delay(1000);
_configManager.setFwVersion(String(_availableVersion, 1)); // 1 decimal place
// Version is already an integer - just convert to string: 130 -> "130"
_configManager.setFwVersion(String(_availableVersion));
_configManager.saveDeviceConfig();
delay(500);
ESP.restart();