mirror of
https://github.com/tbnobody/OpenDTU.git
synced 2025-12-10 16:59:52 +01:00
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:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user