Prevent empty HASS auto discovery topics if memory allocation fails

This commit is contained in:
Thomas Basler 2024-01-04 14:09:58 +01:00 committed by helgeerbe
parent 88d75673fc
commit f00cd1bd61
3 changed files with 37 additions and 0 deletions

View File

@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-or-later // SPDX-License-Identifier: GPL-2.0-or-later
#pragma once #pragma once
#include <ArduinoJson.h>
#include <cstdint> #include <cstdint>
class Utils { class Utils {
@ -9,4 +10,5 @@ public:
static uint64_t generateDtuSerial(); static uint64_t generateDtuSerial();
static int getTimezoneOffset(); static int getTimezoneOffset();
static void restartDtu(); static void restartDtu();
static bool checkJsonAlloc(const DynamicJsonDocument& doc, const char* function, const uint16_t line);
}; };

View File

@ -135,6 +135,10 @@ void MqttHandleHassClass::publishInverterField(std::shared_ptr<InverterAbstract>
} }
DynamicJsonDocument root(1024); DynamicJsonDocument root(1024);
if (!Utils::checkJsonAlloc(root, __FUNCTION__, __LINE__)) {
return;
}
root["name"] = name; root["name"] = name;
root["stat_t"] = stateTopic; root["stat_t"] = stateTopic;
root["uniq_id"] = serial + "_ch" + chanNum + "_" + fieldName; root["uniq_id"] = serial + "_ch" + chanNum + "_" + fieldName;
@ -179,6 +183,10 @@ void MqttHandleHassClass::publishInverterButton(std::shared_ptr<InverterAbstract
const String cmdTopic = MqttSettings.getPrefix() + serial + "/" + subTopic; const String cmdTopic = MqttSettings.getPrefix() + serial + "/" + subTopic;
DynamicJsonDocument root(1024); DynamicJsonDocument root(1024);
if (!Utils::checkJsonAlloc(root, __FUNCTION__, __LINE__)) {
return;
}
root["name"] = caption; root["name"] = caption;
root["uniq_id"] = serial + "_" + buttonId; root["uniq_id"] = serial + "_" + buttonId;
if (strcmp(icon, "")) { if (strcmp(icon, "")) {
@ -217,6 +225,10 @@ void MqttHandleHassClass::publishInverterNumber(
const String statTopic = MqttSettings.getPrefix() + serial + "/" + stateTopic; const String statTopic = MqttSettings.getPrefix() + serial + "/" + stateTopic;
DynamicJsonDocument root(1024); DynamicJsonDocument root(1024);
if (!Utils::checkJsonAlloc(root, __FUNCTION__, __LINE__)) {
return;
}
root["name"] = caption; root["name"] = caption;
root["uniq_id"] = serial + "_" + buttonId; root["uniq_id"] = serial + "_" + buttonId;
if (strcmp(icon, "")) { if (strcmp(icon, "")) {
@ -251,6 +263,10 @@ void MqttHandleHassClass::publishInverterBinarySensor(std::shared_ptr<InverterAb
const String statTopic = MqttSettings.getPrefix() + serial + "/" + subTopic; const String statTopic = MqttSettings.getPrefix() + serial + "/" + subTopic;
DynamicJsonDocument root(1024); DynamicJsonDocument root(1024);
if (!Utils::checkJsonAlloc(root, __FUNCTION__, __LINE__)) {
return;
}
root["name"] = caption; root["name"] = caption;
root["uniq_id"] = serial + "_" + sensorId; root["uniq_id"] = serial + "_" + sensorId;
root["stat_t"] = statTopic; root["stat_t"] = statTopic;
@ -275,6 +291,10 @@ void MqttHandleHassClass::publishDtuSensor(const char* name, const char* device_
} }
DynamicJsonDocument root(1024); DynamicJsonDocument root(1024);
if (!Utils::checkJsonAlloc(root, __FUNCTION__, __LINE__)) {
return;
}
root["name"] = name; root["name"] = name;
root["uniq_id"] = getDtuUniqueId() + "_" + id; root["uniq_id"] = getDtuUniqueId() + "_" + id;
if (strcmp(device_class, "")) { if (strcmp(device_class, "")) {
@ -317,6 +337,10 @@ void MqttHandleHassClass::publishDtuBinarySensor(const char* name, const char* d
} }
DynamicJsonDocument root(1024); DynamicJsonDocument root(1024);
if (!Utils::checkJsonAlloc(root, __FUNCTION__, __LINE__)) {
return;
}
root["name"] = name; root["name"] = name;
root["uniq_id"] = getDtuUniqueId() + "_" + id; root["uniq_id"] = getDtuUniqueId() + "_" + id;
root["stat_t"] = MqttSettings.getPrefix() + topic; root["stat_t"] = MqttSettings.getPrefix() + topic;

View File

@ -5,6 +5,7 @@
#include "Utils.h" #include "Utils.h"
#include "Display_Graphic.h" #include "Display_Graphic.h"
#include "Led_Single.h" #include "Led_Single.h"
#include "MessageOutput.h"
#include <Esp.h> #include <Esp.h>
uint32_t Utils::getChipId() uint32_t Utils::getChipId()
@ -65,3 +66,13 @@ void Utils::restartDtu()
yield(); yield();
ESP.restart(); ESP.restart();
} }
bool Utils::checkJsonAlloc(const DynamicJsonDocument& doc, const char* function, const uint16_t line)
{
if (doc.capacity() == 0) {
MessageOutput.printf("Alloc failed: %s, %d\r\n", function, line);
return false;
}
return true;
}