Fix: Prevent crash when performing a lot of inverter edits

On every edit the whole HA MQTT gets published. This leads to a memory issue when saving quite often without any delay in between. The patch only send config updates every 60 seconds and adds several yield() calls.
This should also fix the crash when saving the network config very often.
This commit is contained in:
Thomas Basler
2025-04-30 20:17:17 +02:00
parent cfe78f7700
commit 98675263b6
2 changed files with 18 additions and 6 deletions

View File

@@ -4,6 +4,7 @@
#include <ArduinoJson.h>
#include <Hoymiles.h>
#include <TaskSchedulerDeclarations.h>
#include <TimeoutHelper.h>
// mqtt discovery device classes
enum DeviceClassType {
@@ -98,6 +99,7 @@ private:
static String getDtuUrl();
Task _loopTask;
TimeoutHelper _publishConfigTimeout;
bool _wasConnected = false;
bool _updateForced = false;

View File

@@ -10,6 +10,11 @@
#include "__compiled_constants.h"
#include "defaults.h"
#define MAX_CONFIG_PUBLISH_RATIO 60000
#undef TAG
static const char* TAG = "mqtt";
MqttHandleHassClass MqttHandleHass;
MqttHandleHassClass::MqttHandleHassClass()
@@ -25,19 +30,19 @@ void MqttHandleHassClass::init(Scheduler& scheduler)
void MqttHandleHassClass::loop()
{
if (_updateForced) {
publishConfig();
_updateForced = false;
}
if (MqttSettings.getConnected() && !_wasConnected) {
// Connection established
_wasConnected = true;
publishConfig();
_updateForced = true;
} else if (!MqttSettings.getConnected() && _wasConnected) {
// Connection lost
_wasConnected = false;
}
if (_updateForced && _publishConfigTimeout.occured()) {
publishConfig();
_updateForced = false;
}
}
void MqttHandleHassClass::forceUpdate()
@@ -55,6 +60,9 @@ void MqttHandleHassClass::publishConfig()
return;
}
ESP_LOGI(TAG, "Publish HA config");
_publishConfigTimeout.set(MAX_CONFIG_PUBLISH_RATIO);
const CONFIG_T& config = Configuration.get();
// publish DTU sensors
@@ -77,6 +85,7 @@ void MqttHandleHassClass::publishConfig()
// Loop all inverters
for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) {
auto inv = Hoymiles.getInverterByPos(i);
yield();
publishInverterButton(inv, "Turn Inverter Off", "cmd/power", "0", "mdi:power-plug-off", DEVICE_CLS_NONE, STATE_CLS_NONE, CATEGORY_CONFIG);
publishInverterButton(inv, "Turn Inverter On", "cmd/power", "1", "mdi:power-plug", DEVICE_CLS_NONE, STATE_CLS_NONE, CATEGORY_CONFIG);
@@ -109,6 +118,7 @@ void MqttHandleHassClass::publishConfig()
clear = true;
}
publishInverterField(inv, t, c, deviceFieldAssignment[f], clear);
yield();
}
}
}