MQTT improvements (#1302)

* Update server_mqtt.cpp

* Update server_mqtt.cpp

* skipp all MQTT publishing until the next round if an error occures

* improve logging

* only use group for uid and topic if there is more than one number

* .

* .
This commit is contained in:
CaCO3
2022-11-09 18:25:24 +01:00
committed by GitHub
parent 2314d7ef18
commit 2b0e0f7d4e
7 changed files with 32 additions and 26 deletions

View File

@@ -4,6 +4,7 @@
#include "esp_log.h"
#include "mqtt_client.h"
#include "ClassLogFile.h"
#include "server_tflite.h"
#define __HIDE_PASSWORD
@@ -13,6 +14,8 @@ std::map<std::string, std::function<void()>>* connectFunktionMap = NULL;
std::map<std::string, std::function<bool(std::string, char*, int)>>* subscribeFunktionMap = NULL;
int failedOnRound = -1;
esp_mqtt_event_id_t esp_mmqtt_ID = MQTT_EVENT_ANY;
// ESP_EVENT_ANY_ID
@@ -27,11 +30,18 @@ bool MQTTPublish(std::string _key, std::string _content, int retained_flag) {
int msg_id;
std::string zw;
if (failedOnRound == getCountFlowRounds()) { // we already failed in this round, do not retry until the next round
return true; // Fail quietly
}
LogFile.WriteHeapInfo("MQTT Publish");
if (!mqtt_connected) {
LogFile.WriteToFile(ESP_LOG_WARN, TAG, "Not connected, trying to re-connect...");
if (!MQTT_Init()) {
if (!MQTT_Init()) { // Retry
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to init!");
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to init, skipping all MQTT publishings in this round!");
failedOnRound = getCountFlowRounds();
return false;
}
}
@@ -43,8 +53,9 @@ bool MQTTPublish(std::string _key, std::string _content, int retained_flag) {
msg_id = esp_mqtt_client_publish(client, _key.c_str(), _content.c_str(), 0, 1, retained_flag);
if (msg_id < 0) {
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to publish topic '" + _key + "'!");
LogFile.WriteToFile(ESP_LOG_ERROR, TAG, "Failed to publish topic '" + _key + "', skipping all MQTT publishings in this round!");
mqtt_connected = false; // Force re-init on next call
failedOnRound = getCountFlowRounds();
return false;
}
}
@@ -172,6 +183,7 @@ bool MQTT_Init() {
mqtt_cfg.password = password.c_str();
};
LogFile.WriteHeapInfo("MQTT Client Init");
client = esp_mqtt_client_init(&mqtt_cfg);
if (client)
{
@@ -182,6 +194,7 @@ bool MQTT_Init() {
return false;
}
LogFile.WriteHeapInfo("MQTT Client Start");
ret = esp_mqtt_client_start(client);
if (ret != ESP_OK)
{

View File

@@ -52,39 +52,30 @@ void sendHomeAssistantDiscoveryTopic(std::string group, std::string field,
version = std::string(libfive_git_branch()) + " (" + std::string(libfive_git_revision()) + ")";
}
std::string topic;
std::string topicFull;
std::string topicT;
std::string configTopic;
std::string payload;
std::string nl = "\n";
if (group == "") {
topic = field;
topicT = field;
}
else {
topic = group + "/" + field;
topicT = group + "_" + field;
}
configTopic = field;
if ((*NUMBERS).size() > 1) { // There is more than one meter, prepend the group so we can differentiate them
if (group != "") { // But only if the group is set
name = group + " " + name;
}
}
if (group != "" && (*NUMBERS).size() > 1) { // There is more than one meter, prepend the group so we can differentiate them
configTopic = group + "_" + field;
name = group + " " + name;
}
if (field == "problem") { // Special binary sensor which is based on error topic
topicFull = "homeassistant/binary_sensor/" + maintopic + "/" + topicT + "/config";
topicFull = "homeassistant/binary_sensor/" + maintopic + "/" + configTopic + "/config";
}
else {
topicFull = "homeassistant/sensor/" + maintopic + "/" + topicT + "/config";
topicFull = "homeassistant/sensor/" + maintopic + "/" + configTopic + "/config";
}
/* See https://www.home-assistant.io/docs/mqtt/discovery/ */
payload = "{" + nl +
"\"~\": \"" + maintopic + "\"," + nl +
"\"unique_id\": \"" + maintopic + "-" + topicT + "\"," + nl +
"\"object_id\": \"" + maintopic + "_" + topicT + "\"," + nl + // This used to generate the Entity ID
"\"unique_id\": \"" + maintopic + "-" + configTopic + "\"," + nl +
"\"object_id\": \"" + maintopic + "_" + configTopic + "\"," + nl + // This used to generate the Entity ID
"\"name\": \"" + name + "\"," + nl +
"\"icon\": \"mdi:" + icon + "\"," + nl;