Просмотр исходного кода

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

* .

* .
CaCO3 3 лет назад
Родитель
Сommit
2b0e0f7d4e

+ 1 - 2
code/components/jomjol_flowcontroll/ClassFlowCNNGeneral.cpp

@@ -790,8 +790,7 @@ bool ClassFlowCNNGeneral::doNeuralNetwork(string time)
                         string zw = "_num (p, m): " + to_string(_num) + " " + to_string(_numplus) + " " + to_string(_numminus);
                         zw = zw + " _val (p, m): " + to_string(_val) + " " + to_string(_valplus) + " " + to_string(_valminus);
                         zw = zw + " result: " + to_string(result) + " _fit: " + to_string(_fit);
-                        ESP_LOGD(TAG, "details cnn: %s", zw.c_str());
-                        LogFile.WriteToFile(ESP_LOG_INFO, TAG, zw);
+                        LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, zw);
 
 
                         _result_save_file = result;

+ 1 - 1
code/components/jomjol_flowcontroll/ClassFlowImage.cpp

@@ -129,7 +129,7 @@ void ClassFlowImage::RemoveOldLogs()
             }
 		}
     }
-    LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Image folder deleted: " + std::to_string(deleted) + ". Image folder not deleted: " + std::to_string(notDeleted));	
+    LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "Image folder deleted: " + std::to_string(deleted) + ". Image folder not deleted: " + std::to_string(notDeleted));	
     closedir(dir);
 }
 

+ 2 - 1
code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp

@@ -230,6 +230,8 @@ bool ClassFlowMQTT::doFlow(string zwtime)
     {
         std::vector<NumberPost*>* NUMBERS = flowpostprocessing->GetNumbers();
 
+        LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Publishing MQTT topics...");
+
         for (int i = 0; i < (*NUMBERS).size(); ++i)
         {
             result =  (*NUMBERS)[i]->ReturnValue;
@@ -245,7 +247,6 @@ bool ClassFlowMQTT::doFlow(string zwtime)
             else
                 namenumber = maintopic + "/" + namenumber + "/";
 
-            LogFile.WriteToFile(ESP_LOG_INFO, TAG, "Publishing MQTT topics...");
 
             if (result.length() > 0)   
                 MQTTPublish(namenumber + "value", result, SetRetainFlag);

+ 1 - 1
code/components/jomjol_logfile/ClassLogFile.cpp

@@ -327,7 +327,7 @@ void ClassLogFile::RemoveOld()
             }
         }
     }
-    LogFile.WriteToFile(ESP_LOG_INFO, TAG, "logfiles deleted: " + std::to_string(deleted) + " files not deleted (incl. leer.txt): " + std::to_string(notDeleted));	
+    LogFile.WriteToFile(ESP_LOG_DEBUG, TAG, "logfiles deleted: " + std::to_string(deleted) + " files not deleted (incl. leer.txt): " + std::to_string(notDeleted));	
     closedir(dir);
 
 

+ 15 - 2
code/components/jomjol_mqtt/interface_mqtt.cpp

@@ -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)
         {

+ 10 - 19
code/components/jomjol_mqtt/server_mqtt.cpp

@@ -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;        
 

+ 2 - 0
code/components/jomjol_tfliteclass/server_tflite.h

@@ -17,6 +17,8 @@ bool isSetupModusActive();
 
 std::string GetMQTTMainTopic();
 
+int getCountFlowRounds();
+
 esp_err_t GetJPG(std::string _filename, httpd_req_t *req);
 
 esp_err_t GetRawJPG(httpd_req_t *req);