mirror of
https://github.com/tbnobody/OpenDTU.git
synced 2025-12-11 17:30:37 +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 <ArduinoJson.h>
|
||||||
#include <Hoymiles.h>
|
#include <Hoymiles.h>
|
||||||
#include <TaskSchedulerDeclarations.h>
|
#include <TaskSchedulerDeclarations.h>
|
||||||
|
#include <TimeoutHelper.h>
|
||||||
|
|
||||||
// mqtt discovery device classes
|
// mqtt discovery device classes
|
||||||
enum DeviceClassType {
|
enum DeviceClassType {
|
||||||
@@ -98,6 +99,7 @@ private:
|
|||||||
static String getDtuUrl();
|
static String getDtuUrl();
|
||||||
|
|
||||||
Task _loopTask;
|
Task _loopTask;
|
||||||
|
TimeoutHelper _publishConfigTimeout;
|
||||||
|
|
||||||
bool _wasConnected = false;
|
bool _wasConnected = false;
|
||||||
bool _updateForced = false;
|
bool _updateForced = false;
|
||||||
|
|||||||
@@ -10,6 +10,11 @@
|
|||||||
#include "__compiled_constants.h"
|
#include "__compiled_constants.h"
|
||||||
#include "defaults.h"
|
#include "defaults.h"
|
||||||
|
|
||||||
|
#define MAX_CONFIG_PUBLISH_RATIO 60000
|
||||||
|
|
||||||
|
#undef TAG
|
||||||
|
static const char* TAG = "mqtt";
|
||||||
|
|
||||||
MqttHandleHassClass MqttHandleHass;
|
MqttHandleHassClass MqttHandleHass;
|
||||||
|
|
||||||
MqttHandleHassClass::MqttHandleHassClass()
|
MqttHandleHassClass::MqttHandleHassClass()
|
||||||
@@ -25,19 +30,19 @@ void MqttHandleHassClass::init(Scheduler& scheduler)
|
|||||||
|
|
||||||
void MqttHandleHassClass::loop()
|
void MqttHandleHassClass::loop()
|
||||||
{
|
{
|
||||||
if (_updateForced) {
|
|
||||||
publishConfig();
|
|
||||||
_updateForced = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (MqttSettings.getConnected() && !_wasConnected) {
|
if (MqttSettings.getConnected() && !_wasConnected) {
|
||||||
// Connection established
|
// Connection established
|
||||||
_wasConnected = true;
|
_wasConnected = true;
|
||||||
publishConfig();
|
_updateForced = true;
|
||||||
} else if (!MqttSettings.getConnected() && _wasConnected) {
|
} else if (!MqttSettings.getConnected() && _wasConnected) {
|
||||||
// Connection lost
|
// Connection lost
|
||||||
_wasConnected = false;
|
_wasConnected = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_updateForced && _publishConfigTimeout.occured()) {
|
||||||
|
publishConfig();
|
||||||
|
_updateForced = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MqttHandleHassClass::forceUpdate()
|
void MqttHandleHassClass::forceUpdate()
|
||||||
@@ -55,6 +60,9 @@ void MqttHandleHassClass::publishConfig()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ESP_LOGI(TAG, "Publish HA config");
|
||||||
|
_publishConfigTimeout.set(MAX_CONFIG_PUBLISH_RATIO);
|
||||||
|
|
||||||
const CONFIG_T& config = Configuration.get();
|
const CONFIG_T& config = Configuration.get();
|
||||||
|
|
||||||
// publish DTU sensors
|
// publish DTU sensors
|
||||||
@@ -77,6 +85,7 @@ void MqttHandleHassClass::publishConfig()
|
|||||||
// Loop all inverters
|
// Loop all inverters
|
||||||
for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) {
|
for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) {
|
||||||
auto inv = Hoymiles.getInverterByPos(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 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);
|
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;
|
clear = true;
|
||||||
}
|
}
|
||||||
publishInverterField(inv, t, c, deviceFieldAssignment[f], clear);
|
publishInverterField(inv, t, c, deviceFieldAssignment[f], clear);
|
||||||
|
yield();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user