From 8ce24df3046112f790eb4db6157cc39ab3e5249d Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:25:17 +0200 Subject: [PATCH 01/45] use unique MQTT client ID. Without this (and multiple running deevices with same ID), they disconnect each other! --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 430f9b18..beab679c 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -26,7 +26,9 @@ void ClassFlowMQTT::SetInitialParameter(void) topicUptime = ""; topicFreeMem = ""; - clientname = "watermeter"; + + clientname = "AIOTED-" + getMac(); + OldValue = ""; flowpostprocessing = NULL; user = ""; From f09067a142ddb760feb4b83fc510c8944c580544 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:34:15 +0200 Subject: [PATCH 02/45] renamed mainerrortopic with lwt, only send it once on connecting, minor fixes and cleanups --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 97 ++++++++----------- .../jomjol_flowcontroll/ClassFlowMQTT.h | 2 +- 2 files changed, 39 insertions(+), 60 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index beab679c..e34d26f2 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -22,7 +22,7 @@ void ClassFlowMQTT::SetInitialParameter(void) topicRate = ""; topicTimeStamp = ""; maintopic = ""; - mainerrortopic = ""; + lwt = ""; topicUptime = ""; topicFreeMem = ""; @@ -121,66 +121,51 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph) { maintopic = zerlegt[1]; } + else { // Main topic not set, use the hostname + maintopic = hostname; + } } #ifdef __HIDE_PASSWORD - ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: XXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: XXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), maintopic.c_str()); #else - ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), maintopic.c_str()); #endif if (!MQTTisConnected() && (uri.length() > 0) && (maintopic.length() > 0)) { ESP_LOGD(TAG, "InitMQTTInit"); - mainerrortopic = maintopic + "/connection"; + lwt = maintopic + "/connection"; #ifdef __HIDE_PASSWORD - ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: XXXXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: XXXXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), maintopic.c_str()); #else - ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), maintopic.c_str()); #endif - if (!MQTTInit(uri, clientname, user, password, mainerrortopic, keepAlive)) + if (!MQTTInit(uri, clientname, user, password, lwt, keepAlive)) { // Failed MQTTenable = false; return true; // We need to return true despite we failed, else it will retry 5x and then reboot! } } - // Try sending mainerrortopic. If it fails, re-run init - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) + // Try sending LWT. If it fails, re-run init + if (!MQTTPublish(lwt, "connected", SetRetainFlag)) { // Failed LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); - if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->mainerrortopic, keepAlive)) + if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->lwt, keepAlive)) { // Failed MQTTenable = false; return false; } + + // Try again sending LWT and quit if it fails + if (!MQTTPublish(lwt, "connected", SetRetainFlag)) + { // Failed + MQTTenable = false; + return false; + } } - // Try again and quit if it fails - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - MQTTenable = false; - return false; - } - - - - - /* if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not publish connection status!"); - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - }*/ - - /* if(!MQTTPublish(_LWTContext, "", 1)) - { - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not publish LWT!"); - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - }*/ - - MQTTenable = true; return true; } @@ -194,24 +179,6 @@ string ClassFlowMQTT::GetMQTTMainTopic() bool ClassFlowMQTT::doFlow(string zwtime) { - // Try sending mainerrortopic. If it fails, re-run init - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); - if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->mainerrortopic, keepAlive)) - { // Failed - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - } - } - - // Try again and quit if it fails - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - } - std::string result; std::string resulterror = ""; std::string resultraw = ""; @@ -221,16 +188,28 @@ bool ClassFlowMQTT::doFlow(string zwtime) string zw = ""; string namenumber = ""; - // if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - //{ // Failed, skip other topics - // return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - //} - zw = maintopic + "/" + "uptime"; char uptimeStr[11]; sprintf(uptimeStr, "%ld", (long)getUpTime()); - MQTTPublish(zw, uptimeStr, SetRetainFlag); + // Try sending uptime. If it fails, re-run init + if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) + { // Failed + LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); + if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->lwt, keepAlive)) + { // Failed + MQTTenable = false; + return true; // We need to return true despite we failed, else it will retry 5x and then reboot! + } + + // Try again and quit if it fails + if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) + { // Failed + MQTTenable = false; + return true; // We need to return true despite we failed, else it will retry 5x and then reboot! + } + } + zw = maintopic + "/" + "freeMem"; char freeheapmem[11]; sprintf(freeheapmem, "%zu", esp_get_free_heap_size()); diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h index 3a990c7d..a2805a4b 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h @@ -17,7 +17,7 @@ protected: bool MQTTenable; int keepAlive; - std::string maintopic, mainerrortopic; + std::string maintopic, lwt; void SetInitialParameter(void); public: From 86c515bcb84f2f727faf5d5a2120a7451dad8efc Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:52:06 +0200 Subject: [PATCH 03/45] removed \r\n in logs --- .../jomjol_controlGPIO/server_GPIO.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/components/jomjol_controlGPIO/server_GPIO.cpp b/code/components/jomjol_controlGPIO/server_GPIO.cpp index e54dcaa2..c21adde5 100644 --- a/code/components/jomjol_controlGPIO/server_GPIO.cpp +++ b/code/components/jomjol_controlGPIO/server_GPIO.cpp @@ -110,7 +110,7 @@ void GpioPin::init() // if (_interruptType != GPIO_INTR_DISABLE) { // ohne GPIO_PIN_MODE_EXTERNAL_FLASH_WS281X, wenn das genutzt wird, dann soll auch der Handler hier nicht initialisiert werden, da das dann über SmartLED erfolgt. if ((_interruptType != GPIO_INTR_DISABLE) && (_interruptType != GPIO_PIN_MODE_EXTERNAL_FLASH_WS281X)) { //hook isr handler for specific gpio pin - ESP_LOGD(TAG_SERVERGPIO, "GpioPin::init add isr handler for GPIO %d\r\n", _gpio); + ESP_LOGD(TAG_SERVERGPIO, "GpioPin::init add isr handler for GPIO %d", _gpio); gpio_isr_handler_add(_gpio, gpio_isr_handler, (void*)&_gpio); } @@ -131,7 +131,7 @@ bool GpioPin::getValue(std::string* errorText) void GpioPin::setValue(bool value, gpio_set_source setSource, std::string* errorText) { - ESP_LOGD(TAG_SERVERGPIO, "GpioPin::setValue %d\r\n", value); + ESP_LOGD(TAG_SERVERGPIO, "GpioPin::setValue %d", value); if ((_mode != GPIO_PIN_MODE_OUTPUT) && (_mode != GPIO_PIN_MODE_OUTPUT_PWM) && (_mode != GPIO_PIN_MODE_BUILT_IN_FLASH_LED)) { (*errorText) = "GPIO is not in output mode"; @@ -154,7 +154,7 @@ void GpioPin::publishState() { } bool GpioPin::handleMQTT(std::string, char* data, int data_len) { - ESP_LOGD(TAG_SERVERGPIO, "GpioPin::handleMQTT data %.*s\r\n", data_len, data); + ESP_LOGD(TAG_SERVERGPIO, "GpioPin::handleMQTT data %.*s", data_len, data); std::string dataStr(data, data_len); dataStr = toLower(dataStr); @@ -321,7 +321,7 @@ bool GpioHandler::readConfig() if (mainTopicMQTT.length() > 0) { mainTopicMQTT = mainTopicMQTT + "/GPIO"; - ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found\r\n"); + ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found"); } bool registerISR = false; @@ -333,9 +333,9 @@ bool GpioHandler::readConfig() // if (std::regex_match(zerlegt[0], pieces_match, pieces_regex) && (pieces_match.size() == 2)) // { // std::string gpioStr = pieces_match[1]; - ESP_LOGD(TAG_SERVERGPIO, "conf param %s\r\n", toUpper(zerlegt[0]).c_str()); + ESP_LOGD(TAG_SERVERGPIO, "conf param %s", toUpper(zerlegt[0]).c_str()); if (toUpper(zerlegt[0]) == "MAINTOPICMQTT") { -// ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found\r\n"); +// ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found"); // mainTopicMQTT = zerlegt[1]; } else if ((zerlegt[0].rfind("IO", 0) == 0) && (zerlegt.size() >= 6)) { @@ -420,7 +420,7 @@ bool GpioHandler::readConfig() void GpioHandler::clear() { - ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::clear\r\n"); + ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::clear"); if (gpioMap != NULL) { for(std::map::iterator it = gpioMap->begin(); it != gpioMap->end(); ++it) { @@ -541,7 +541,7 @@ esp_err_t GpioHandler::handleHttpRequest(httpd_req_t *req) void GpioHandler::flashLightEnable(bool value) { - ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::flashLightEnable %s\r\n", value ? "true" : "false"); + ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::flashLightEnable %s", value ? "true" : "false"); if (gpioMap != NULL) { for(std::map::iterator it = gpioMap->begin(); it != gpioMap->end(); ++it) @@ -552,9 +552,9 @@ void GpioHandler::flashLightEnable(bool value) it->second->setValue(value, GPIO_SET_SOURCE_INTERNAL, &resp_str); if (resp_str == "") { - ESP_LOGD(TAG_SERVERGPIO, "Flash light pin GPIO %d switched to %s\r\n", (int)it->first, (value ? "on" : "off")); + ESP_LOGD(TAG_SERVERGPIO, "Flash light pin GPIO %d switched to %s", (int)it->first, (value ? "on" : "off")); } else { - ESP_LOGE(TAG_SERVERGPIO, "Can't set flash light pin GPIO %d. Error: %s\r\n", (int)it->first, resp_str.c_str()); + ESP_LOGE(TAG_SERVERGPIO, "Can't set flash light pin GPIO %d. Error: %s", (int)it->first, resp_str.c_str()); } } else { From 455962bd947ed881bff3ee12c0e73fa8b6f816e9 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:53:24 +0200 Subject: [PATCH 04/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index e34d26f2..df6283c2 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -192,7 +192,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) char uptimeStr[11]; sprintf(uptimeStr, "%ld", (long)getUpTime()); - // Try sending uptime. If it fails, re-run init + // Try sending ptime. If it fails, re-run init if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) { // Failed LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); From bc7a0e46b73748bccceec6fd9d11dfbbd560abac Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:54:28 +0200 Subject: [PATCH 05/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index df6283c2..e34d26f2 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -192,7 +192,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) char uptimeStr[11]; sprintf(uptimeStr, "%ld", (long)getUpTime()); - // Try sending ptime. If it fails, re-run init + // Try sending uptime. If it fails, re-run init if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) { // Failed LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); From 43b65d6b2e0b5fd0b2315a3f55ceb7b91697192f Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 11:12:56 +0200 Subject: [PATCH 06/45] updated log messages --- code/components/jomjol_mqtt/interface_mqtt.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index 48a88f97..dc92269e 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -11,7 +11,6 @@ static const char *TAG_INTERFACEMQTT = "interface_mqtt"; std::map>* connectFunktionMap = NULL; std::map>* subscribeFunktionMap = NULL; -bool debugdetail = true; // #define CONFIG_BROKER_URL "mqtt://192.168.178.43:1883" @@ -27,11 +26,11 @@ bool MQTTPublish(std::string _key, std::string _content, int retained_flag){ std::string zw; 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, "MQTT - Failed to publish '" + _key + "'!"); + LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Failed to publish topic '" + _key + "'!"); return false; } - zw = "MQTT - sent publish successful in MQTTPublish, msg_id=" + std::to_string(msg_id) + ", " + _key + ", " + _content; - if (debugdetail) LogFile.WriteToFile(ESP_LOG_INFO, zw); + zw = "MQTT - Published topic: " + _key + ", content: " + _content + " (msg_id=" + std::to_string(msg_id) + ")"; + LogFile.WriteToFile(ESP_LOG_DEBUG, zw); return true; } @@ -109,7 +108,7 @@ bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, st .keepalive = _keepalive }; - LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Init"); + LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Init (client ID: " + _clientid + ")"); if (_user.length() && _password.length()){ mqtt_cfg.username = _user.c_str(); @@ -139,7 +138,7 @@ bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, st /* if(!MQTTPublish(_LWTContext, "", 1)) { - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not publish LWT!"); + LogFile.WriteToFile("MQTT - Could not publish LWT!"); return false; }*/ } From a13d1d06929c48246a8f2eff08ab9628dc0deb31 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 22:31:34 +0200 Subject: [PATCH 07/45] Temporarily disable data file writing as it can cause crashs, see https://github.com/jomjol/AI-on-the-edge-device/issues/1225 --- code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp b/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp index ef81cd80..076ce5b4 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowPostProcessing.cpp @@ -866,6 +866,8 @@ bool ClassFlowPostProcessing::doFlow(string zwtime) void ClassFlowPostProcessing::WriteDataLog(int _index) { + LogFile.WriteToFile(ESP_LOG_WARN, "Data file writing temporarily disabled, see https://github.com/jomjol/AI-on-the-edge-device/issues/1225"); + return; string analog = ""; string digital = ""; string timezw = ""; From dabe66819da784db95dc40f4af54cbf65e75a94e Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:25:17 +0200 Subject: [PATCH 08/45] use unique MQTT client ID. Without this (and multiple running deevices with same ID), they disconnect each other! --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 430f9b18..beab679c 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -26,7 +26,9 @@ void ClassFlowMQTT::SetInitialParameter(void) topicUptime = ""; topicFreeMem = ""; - clientname = "watermeter"; + + clientname = "AIOTED-" + getMac(); + OldValue = ""; flowpostprocessing = NULL; user = ""; From 25ae9a045f26eb709d1b948293da3abe669586ca Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:34:15 +0200 Subject: [PATCH 09/45] renamed mainerrortopic with lwt, only send it once on connecting, minor fixes and cleanups --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 97 ++++++++----------- .../jomjol_flowcontroll/ClassFlowMQTT.h | 2 +- 2 files changed, 39 insertions(+), 60 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index beab679c..e34d26f2 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -22,7 +22,7 @@ void ClassFlowMQTT::SetInitialParameter(void) topicRate = ""; topicTimeStamp = ""; maintopic = ""; - mainerrortopic = ""; + lwt = ""; topicUptime = ""; topicFreeMem = ""; @@ -121,66 +121,51 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph) { maintopic = zerlegt[1]; } + else { // Main topic not set, use the hostname + maintopic = hostname; + } } #ifdef __HIDE_PASSWORD - ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: XXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: XXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), maintopic.c_str()); #else - ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), maintopic.c_str()); #endif if (!MQTTisConnected() && (uri.length() > 0) && (maintopic.length() > 0)) { ESP_LOGD(TAG, "InitMQTTInit"); - mainerrortopic = maintopic + "/connection"; + lwt = maintopic + "/connection"; #ifdef __HIDE_PASSWORD - ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: XXXXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: XXXXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), maintopic.c_str()); #else - ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), maintopic.c_str()); #endif - if (!MQTTInit(uri, clientname, user, password, mainerrortopic, keepAlive)) + if (!MQTTInit(uri, clientname, user, password, lwt, keepAlive)) { // Failed MQTTenable = false; return true; // We need to return true despite we failed, else it will retry 5x and then reboot! } } - // Try sending mainerrortopic. If it fails, re-run init - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) + // Try sending LWT. If it fails, re-run init + if (!MQTTPublish(lwt, "connected", SetRetainFlag)) { // Failed LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); - if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->mainerrortopic, keepAlive)) + if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->lwt, keepAlive)) { // Failed MQTTenable = false; return false; } + + // Try again sending LWT and quit if it fails + if (!MQTTPublish(lwt, "connected", SetRetainFlag)) + { // Failed + MQTTenable = false; + return false; + } } - // Try again and quit if it fails - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - MQTTenable = false; - return false; - } - - - - - /* if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not publish connection status!"); - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - }*/ - - /* if(!MQTTPublish(_LWTContext, "", 1)) - { - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not publish LWT!"); - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - }*/ - - MQTTenable = true; return true; } @@ -194,24 +179,6 @@ string ClassFlowMQTT::GetMQTTMainTopic() bool ClassFlowMQTT::doFlow(string zwtime) { - // Try sending mainerrortopic. If it fails, re-run init - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); - if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->mainerrortopic, keepAlive)) - { // Failed - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - } - } - - // Try again and quit if it fails - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - } - std::string result; std::string resulterror = ""; std::string resultraw = ""; @@ -221,16 +188,28 @@ bool ClassFlowMQTT::doFlow(string zwtime) string zw = ""; string namenumber = ""; - // if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - //{ // Failed, skip other topics - // return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - //} - zw = maintopic + "/" + "uptime"; char uptimeStr[11]; sprintf(uptimeStr, "%ld", (long)getUpTime()); - MQTTPublish(zw, uptimeStr, SetRetainFlag); + // Try sending uptime. If it fails, re-run init + if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) + { // Failed + LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); + if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->lwt, keepAlive)) + { // Failed + MQTTenable = false; + return true; // We need to return true despite we failed, else it will retry 5x and then reboot! + } + + // Try again and quit if it fails + if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) + { // Failed + MQTTenable = false; + return true; // We need to return true despite we failed, else it will retry 5x and then reboot! + } + } + zw = maintopic + "/" + "freeMem"; char freeheapmem[11]; sprintf(freeheapmem, "%zu", esp_get_free_heap_size()); diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h index 3a990c7d..a2805a4b 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h @@ -17,7 +17,7 @@ protected: bool MQTTenable; int keepAlive; - std::string maintopic, mainerrortopic; + std::string maintopic, lwt; void SetInitialParameter(void); public: From 9d73c5475e8e8fd757e3fc7d6c275061bcddfa7b Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:52:06 +0200 Subject: [PATCH 10/45] removed \r\n in logs --- .../jomjol_controlGPIO/server_GPIO.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/components/jomjol_controlGPIO/server_GPIO.cpp b/code/components/jomjol_controlGPIO/server_GPIO.cpp index e54dcaa2..c21adde5 100644 --- a/code/components/jomjol_controlGPIO/server_GPIO.cpp +++ b/code/components/jomjol_controlGPIO/server_GPIO.cpp @@ -110,7 +110,7 @@ void GpioPin::init() // if (_interruptType != GPIO_INTR_DISABLE) { // ohne GPIO_PIN_MODE_EXTERNAL_FLASH_WS281X, wenn das genutzt wird, dann soll auch der Handler hier nicht initialisiert werden, da das dann über SmartLED erfolgt. if ((_interruptType != GPIO_INTR_DISABLE) && (_interruptType != GPIO_PIN_MODE_EXTERNAL_FLASH_WS281X)) { //hook isr handler for specific gpio pin - ESP_LOGD(TAG_SERVERGPIO, "GpioPin::init add isr handler for GPIO %d\r\n", _gpio); + ESP_LOGD(TAG_SERVERGPIO, "GpioPin::init add isr handler for GPIO %d", _gpio); gpio_isr_handler_add(_gpio, gpio_isr_handler, (void*)&_gpio); } @@ -131,7 +131,7 @@ bool GpioPin::getValue(std::string* errorText) void GpioPin::setValue(bool value, gpio_set_source setSource, std::string* errorText) { - ESP_LOGD(TAG_SERVERGPIO, "GpioPin::setValue %d\r\n", value); + ESP_LOGD(TAG_SERVERGPIO, "GpioPin::setValue %d", value); if ((_mode != GPIO_PIN_MODE_OUTPUT) && (_mode != GPIO_PIN_MODE_OUTPUT_PWM) && (_mode != GPIO_PIN_MODE_BUILT_IN_FLASH_LED)) { (*errorText) = "GPIO is not in output mode"; @@ -154,7 +154,7 @@ void GpioPin::publishState() { } bool GpioPin::handleMQTT(std::string, char* data, int data_len) { - ESP_LOGD(TAG_SERVERGPIO, "GpioPin::handleMQTT data %.*s\r\n", data_len, data); + ESP_LOGD(TAG_SERVERGPIO, "GpioPin::handleMQTT data %.*s", data_len, data); std::string dataStr(data, data_len); dataStr = toLower(dataStr); @@ -321,7 +321,7 @@ bool GpioHandler::readConfig() if (mainTopicMQTT.length() > 0) { mainTopicMQTT = mainTopicMQTT + "/GPIO"; - ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found\r\n"); + ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found"); } bool registerISR = false; @@ -333,9 +333,9 @@ bool GpioHandler::readConfig() // if (std::regex_match(zerlegt[0], pieces_match, pieces_regex) && (pieces_match.size() == 2)) // { // std::string gpioStr = pieces_match[1]; - ESP_LOGD(TAG_SERVERGPIO, "conf param %s\r\n", toUpper(zerlegt[0]).c_str()); + ESP_LOGD(TAG_SERVERGPIO, "conf param %s", toUpper(zerlegt[0]).c_str()); if (toUpper(zerlegt[0]) == "MAINTOPICMQTT") { -// ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found\r\n"); +// ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found"); // mainTopicMQTT = zerlegt[1]; } else if ((zerlegt[0].rfind("IO", 0) == 0) && (zerlegt.size() >= 6)) { @@ -420,7 +420,7 @@ bool GpioHandler::readConfig() void GpioHandler::clear() { - ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::clear\r\n"); + ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::clear"); if (gpioMap != NULL) { for(std::map::iterator it = gpioMap->begin(); it != gpioMap->end(); ++it) { @@ -541,7 +541,7 @@ esp_err_t GpioHandler::handleHttpRequest(httpd_req_t *req) void GpioHandler::flashLightEnable(bool value) { - ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::flashLightEnable %s\r\n", value ? "true" : "false"); + ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::flashLightEnable %s", value ? "true" : "false"); if (gpioMap != NULL) { for(std::map::iterator it = gpioMap->begin(); it != gpioMap->end(); ++it) @@ -552,9 +552,9 @@ void GpioHandler::flashLightEnable(bool value) it->second->setValue(value, GPIO_SET_SOURCE_INTERNAL, &resp_str); if (resp_str == "") { - ESP_LOGD(TAG_SERVERGPIO, "Flash light pin GPIO %d switched to %s\r\n", (int)it->first, (value ? "on" : "off")); + ESP_LOGD(TAG_SERVERGPIO, "Flash light pin GPIO %d switched to %s", (int)it->first, (value ? "on" : "off")); } else { - ESP_LOGE(TAG_SERVERGPIO, "Can't set flash light pin GPIO %d. Error: %s\r\n", (int)it->first, resp_str.c_str()); + ESP_LOGE(TAG_SERVERGPIO, "Can't set flash light pin GPIO %d. Error: %s", (int)it->first, resp_str.c_str()); } } else { From 99e03dde06f0f24ec453482a99895565bc251991 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:53:24 +0200 Subject: [PATCH 11/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index e34d26f2..df6283c2 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -192,7 +192,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) char uptimeStr[11]; sprintf(uptimeStr, "%ld", (long)getUpTime()); - // Try sending uptime. If it fails, re-run init + // Try sending ptime. If it fails, re-run init if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) { // Failed LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); From 41abc19a97aee2d59fcb230f2d3cc109eae60db3 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:54:28 +0200 Subject: [PATCH 12/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index df6283c2..e34d26f2 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -192,7 +192,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) char uptimeStr[11]; sprintf(uptimeStr, "%ld", (long)getUpTime()); - // Try sending ptime. If it fails, re-run init + // Try sending uptime. If it fails, re-run init if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) { // Failed LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); From 1aa23aa14a0d96620722f1b7b99e8bcb8b78bdf0 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 11:12:56 +0200 Subject: [PATCH 13/45] updated log messages --- code/components/jomjol_mqtt/interface_mqtt.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index 48a88f97..dc92269e 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -11,7 +11,6 @@ static const char *TAG_INTERFACEMQTT = "interface_mqtt"; std::map>* connectFunktionMap = NULL; std::map>* subscribeFunktionMap = NULL; -bool debugdetail = true; // #define CONFIG_BROKER_URL "mqtt://192.168.178.43:1883" @@ -27,11 +26,11 @@ bool MQTTPublish(std::string _key, std::string _content, int retained_flag){ std::string zw; 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, "MQTT - Failed to publish '" + _key + "'!"); + LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Failed to publish topic '" + _key + "'!"); return false; } - zw = "MQTT - sent publish successful in MQTTPublish, msg_id=" + std::to_string(msg_id) + ", " + _key + ", " + _content; - if (debugdetail) LogFile.WriteToFile(ESP_LOG_INFO, zw); + zw = "MQTT - Published topic: " + _key + ", content: " + _content + " (msg_id=" + std::to_string(msg_id) + ")"; + LogFile.WriteToFile(ESP_LOG_DEBUG, zw); return true; } @@ -109,7 +108,7 @@ bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, st .keepalive = _keepalive }; - LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Init"); + LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Init (client ID: " + _clientid + ")"); if (_user.length() && _password.length()){ mqtt_cfg.username = _user.c_str(); @@ -139,7 +138,7 @@ bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, st /* if(!MQTTPublish(_LWTContext, "", 1)) { - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not publish LWT!"); + LogFile.WriteToFile("MQTT - Could not publish LWT!"); return false; }*/ } From 6b47eef4cdffd49bd5ceaeedc222f90d57ae2b32 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:25:17 +0200 Subject: [PATCH 14/45] use unique MQTT client ID. Without this (and multiple running deevices with same ID), they disconnect each other! --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 430f9b18..beab679c 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -26,7 +26,9 @@ void ClassFlowMQTT::SetInitialParameter(void) topicUptime = ""; topicFreeMem = ""; - clientname = "watermeter"; + + clientname = "AIOTED-" + getMac(); + OldValue = ""; flowpostprocessing = NULL; user = ""; From 98451c8fc78bddd5a6837d9532d3083014f0ce93 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:34:15 +0200 Subject: [PATCH 15/45] renamed mainerrortopic with lwt, only send it once on connecting, minor fixes and cleanups --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 97 ++++++++----------- .../jomjol_flowcontroll/ClassFlowMQTT.h | 2 +- 2 files changed, 39 insertions(+), 60 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index beab679c..e34d26f2 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -22,7 +22,7 @@ void ClassFlowMQTT::SetInitialParameter(void) topicRate = ""; topicTimeStamp = ""; maintopic = ""; - mainerrortopic = ""; + lwt = ""; topicUptime = ""; topicFreeMem = ""; @@ -121,66 +121,51 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph) { maintopic = zerlegt[1]; } + else { // Main topic not set, use the hostname + maintopic = hostname; + } } #ifdef __HIDE_PASSWORD - ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: XXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: XXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), maintopic.c_str()); #else - ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), maintopic.c_str()); #endif if (!MQTTisConnected() && (uri.length() > 0) && (maintopic.length() > 0)) { ESP_LOGD(TAG, "InitMQTTInit"); - mainerrortopic = maintopic + "/connection"; + lwt = maintopic + "/connection"; #ifdef __HIDE_PASSWORD - ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: XXXXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: XXXXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), maintopic.c_str()); #else - ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), mainerrortopic.c_str()); + ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), maintopic.c_str()); #endif - if (!MQTTInit(uri, clientname, user, password, mainerrortopic, keepAlive)) + if (!MQTTInit(uri, clientname, user, password, lwt, keepAlive)) { // Failed MQTTenable = false; return true; // We need to return true despite we failed, else it will retry 5x and then reboot! } } - // Try sending mainerrortopic. If it fails, re-run init - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) + // Try sending LWT. If it fails, re-run init + if (!MQTTPublish(lwt, "connected", SetRetainFlag)) { // Failed LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); - if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->mainerrortopic, keepAlive)) + if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->lwt, keepAlive)) { // Failed MQTTenable = false; return false; } + + // Try again sending LWT and quit if it fails + if (!MQTTPublish(lwt, "connected", SetRetainFlag)) + { // Failed + MQTTenable = false; + return false; + } } - // Try again and quit if it fails - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - MQTTenable = false; - return false; - } - - - - - /* if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not publish connection status!"); - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - }*/ - - /* if(!MQTTPublish(_LWTContext, "", 1)) - { - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not publish LWT!"); - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - }*/ - - MQTTenable = true; return true; } @@ -194,24 +179,6 @@ string ClassFlowMQTT::GetMQTTMainTopic() bool ClassFlowMQTT::doFlow(string zwtime) { - // Try sending mainerrortopic. If it fails, re-run init - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); - if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->mainerrortopic, keepAlive)) - { // Failed - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - } - } - - // Try again and quit if it fails - if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - { // Failed - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - } - std::string result; std::string resulterror = ""; std::string resultraw = ""; @@ -221,16 +188,28 @@ bool ClassFlowMQTT::doFlow(string zwtime) string zw = ""; string namenumber = ""; - // if (!MQTTPublish(mainerrortopic, "connected", SetRetainFlag)) - //{ // Failed, skip other topics - // return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - //} - zw = maintopic + "/" + "uptime"; char uptimeStr[11]; sprintf(uptimeStr, "%ld", (long)getUpTime()); - MQTTPublish(zw, uptimeStr, SetRetainFlag); + // Try sending uptime. If it fails, re-run init + if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) + { // Failed + LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); + if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->lwt, keepAlive)) + { // Failed + MQTTenable = false; + return true; // We need to return true despite we failed, else it will retry 5x and then reboot! + } + + // Try again and quit if it fails + if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) + { // Failed + MQTTenable = false; + return true; // We need to return true despite we failed, else it will retry 5x and then reboot! + } + } + zw = maintopic + "/" + "freeMem"; char freeheapmem[11]; sprintf(freeheapmem, "%zu", esp_get_free_heap_size()); diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h index 3a990c7d..a2805a4b 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h @@ -17,7 +17,7 @@ protected: bool MQTTenable; int keepAlive; - std::string maintopic, mainerrortopic; + std::string maintopic, lwt; void SetInitialParameter(void); public: From 9d658898241b042eeb46b595cce6c678920045d2 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:52:06 +0200 Subject: [PATCH 16/45] removed \r\n in logs --- .../jomjol_controlGPIO/server_GPIO.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/components/jomjol_controlGPIO/server_GPIO.cpp b/code/components/jomjol_controlGPIO/server_GPIO.cpp index e54dcaa2..c21adde5 100644 --- a/code/components/jomjol_controlGPIO/server_GPIO.cpp +++ b/code/components/jomjol_controlGPIO/server_GPIO.cpp @@ -110,7 +110,7 @@ void GpioPin::init() // if (_interruptType != GPIO_INTR_DISABLE) { // ohne GPIO_PIN_MODE_EXTERNAL_FLASH_WS281X, wenn das genutzt wird, dann soll auch der Handler hier nicht initialisiert werden, da das dann über SmartLED erfolgt. if ((_interruptType != GPIO_INTR_DISABLE) && (_interruptType != GPIO_PIN_MODE_EXTERNAL_FLASH_WS281X)) { //hook isr handler for specific gpio pin - ESP_LOGD(TAG_SERVERGPIO, "GpioPin::init add isr handler for GPIO %d\r\n", _gpio); + ESP_LOGD(TAG_SERVERGPIO, "GpioPin::init add isr handler for GPIO %d", _gpio); gpio_isr_handler_add(_gpio, gpio_isr_handler, (void*)&_gpio); } @@ -131,7 +131,7 @@ bool GpioPin::getValue(std::string* errorText) void GpioPin::setValue(bool value, gpio_set_source setSource, std::string* errorText) { - ESP_LOGD(TAG_SERVERGPIO, "GpioPin::setValue %d\r\n", value); + ESP_LOGD(TAG_SERVERGPIO, "GpioPin::setValue %d", value); if ((_mode != GPIO_PIN_MODE_OUTPUT) && (_mode != GPIO_PIN_MODE_OUTPUT_PWM) && (_mode != GPIO_PIN_MODE_BUILT_IN_FLASH_LED)) { (*errorText) = "GPIO is not in output mode"; @@ -154,7 +154,7 @@ void GpioPin::publishState() { } bool GpioPin::handleMQTT(std::string, char* data, int data_len) { - ESP_LOGD(TAG_SERVERGPIO, "GpioPin::handleMQTT data %.*s\r\n", data_len, data); + ESP_LOGD(TAG_SERVERGPIO, "GpioPin::handleMQTT data %.*s", data_len, data); std::string dataStr(data, data_len); dataStr = toLower(dataStr); @@ -321,7 +321,7 @@ bool GpioHandler::readConfig() if (mainTopicMQTT.length() > 0) { mainTopicMQTT = mainTopicMQTT + "/GPIO"; - ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found\r\n"); + ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found"); } bool registerISR = false; @@ -333,9 +333,9 @@ bool GpioHandler::readConfig() // if (std::regex_match(zerlegt[0], pieces_match, pieces_regex) && (pieces_match.size() == 2)) // { // std::string gpioStr = pieces_match[1]; - ESP_LOGD(TAG_SERVERGPIO, "conf param %s\r\n", toUpper(zerlegt[0]).c_str()); + ESP_LOGD(TAG_SERVERGPIO, "conf param %s", toUpper(zerlegt[0]).c_str()); if (toUpper(zerlegt[0]) == "MAINTOPICMQTT") { -// ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found\r\n"); +// ESP_LOGD(TAG_SERVERGPIO, "MAINTOPICMQTT found"); // mainTopicMQTT = zerlegt[1]; } else if ((zerlegt[0].rfind("IO", 0) == 0) && (zerlegt.size() >= 6)) { @@ -420,7 +420,7 @@ bool GpioHandler::readConfig() void GpioHandler::clear() { - ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::clear\r\n"); + ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::clear"); if (gpioMap != NULL) { for(std::map::iterator it = gpioMap->begin(); it != gpioMap->end(); ++it) { @@ -541,7 +541,7 @@ esp_err_t GpioHandler::handleHttpRequest(httpd_req_t *req) void GpioHandler::flashLightEnable(bool value) { - ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::flashLightEnable %s\r\n", value ? "true" : "false"); + ESP_LOGD(TAG_SERVERGPIO, "GpioHandler::flashLightEnable %s", value ? "true" : "false"); if (gpioMap != NULL) { for(std::map::iterator it = gpioMap->begin(); it != gpioMap->end(); ++it) @@ -552,9 +552,9 @@ void GpioHandler::flashLightEnable(bool value) it->second->setValue(value, GPIO_SET_SOURCE_INTERNAL, &resp_str); if (resp_str == "") { - ESP_LOGD(TAG_SERVERGPIO, "Flash light pin GPIO %d switched to %s\r\n", (int)it->first, (value ? "on" : "off")); + ESP_LOGD(TAG_SERVERGPIO, "Flash light pin GPIO %d switched to %s", (int)it->first, (value ? "on" : "off")); } else { - ESP_LOGE(TAG_SERVERGPIO, "Can't set flash light pin GPIO %d. Error: %s\r\n", (int)it->first, resp_str.c_str()); + ESP_LOGE(TAG_SERVERGPIO, "Can't set flash light pin GPIO %d. Error: %s", (int)it->first, resp_str.c_str()); } } else { From 74c9eada47cf49b14aa790331552c862b48600a4 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:53:24 +0200 Subject: [PATCH 17/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index e34d26f2..df6283c2 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -192,7 +192,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) char uptimeStr[11]; sprintf(uptimeStr, "%ld", (long)getUpTime()); - // Try sending uptime. If it fails, re-run init + // Try sending ptime. If it fails, re-run init if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) { // Failed LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); From 96b3d7cc2f3898bf1966f6ea57244d05b7ec4c41 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:54:28 +0200 Subject: [PATCH 18/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index df6283c2..e34d26f2 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -192,7 +192,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) char uptimeStr[11]; sprintf(uptimeStr, "%ld", (long)getUpTime()); - // Try sending ptime. If it fails, re-run init + // Try sending uptime. If it fails, re-run init if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) { // Failed LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); From 6e58f5eebb96a2c2fa3303c23b85e55489bd60af Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 11:12:56 +0200 Subject: [PATCH 19/45] updated log messages --- code/components/jomjol_mqtt/interface_mqtt.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index 48a88f97..dc92269e 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -11,7 +11,6 @@ static const char *TAG_INTERFACEMQTT = "interface_mqtt"; std::map>* connectFunktionMap = NULL; std::map>* subscribeFunktionMap = NULL; -bool debugdetail = true; // #define CONFIG_BROKER_URL "mqtt://192.168.178.43:1883" @@ -27,11 +26,11 @@ bool MQTTPublish(std::string _key, std::string _content, int retained_flag){ std::string zw; 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, "MQTT - Failed to publish '" + _key + "'!"); + LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Failed to publish topic '" + _key + "'!"); return false; } - zw = "MQTT - sent publish successful in MQTTPublish, msg_id=" + std::to_string(msg_id) + ", " + _key + ", " + _content; - if (debugdetail) LogFile.WriteToFile(ESP_LOG_INFO, zw); + zw = "MQTT - Published topic: " + _key + ", content: " + _content + " (msg_id=" + std::to_string(msg_id) + ")"; + LogFile.WriteToFile(ESP_LOG_DEBUG, zw); return true; } @@ -109,7 +108,7 @@ bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, st .keepalive = _keepalive }; - LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Init"); + LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Init (client ID: " + _clientid + ")"); if (_user.length() && _password.length()){ mqtt_cfg.username = _user.c_str(); @@ -139,7 +138,7 @@ bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, st /* if(!MQTTPublish(_LWTContext, "", 1)) { - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not publish LWT!"); + LogFile.WriteToFile("MQTT - Could not publish LWT!"); return false; }*/ } From 724169b0598a848da72a4185448cb48085662b5b Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:53:24 +0200 Subject: [PATCH 20/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index e34d26f2..df6283c2 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -192,7 +192,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) char uptimeStr[11]; sprintf(uptimeStr, "%ld", (long)getUpTime()); - // Try sending uptime. If it fails, re-run init + // Try sending ptime. If it fails, re-run init if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) { // Failed LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); From 72e3570dc4c27a949baa35bed0d73c5c55905bf0 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Wed, 26 Oct 2022 10:54:28 +0200 Subject: [PATCH 21/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index df6283c2..e34d26f2 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -192,7 +192,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) char uptimeStr[11]; sprintf(uptimeStr, "%ld", (long)getUpTime()); - // Try sending ptime. If it fails, re-run init + // Try sending uptime. If it fails, re-run init if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) { // Failed LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); From 30549ac5af28ba2a9882b403ee3793b36d4f8830 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 01:09:09 +0200 Subject: [PATCH 22/45] refactored MQTT --- .../jomjol_flowcontroll/ClassFlowControll.cpp | 7 +- .../jomjol_flowcontroll/ClassFlowControll.h | 1 + .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 135 ++++++------------ .../jomjol_flowcontroll/ClassFlowMQTT.h | 4 +- .../components/jomjol_mqtt/interface_mqtt.cpp | 111 +++++++++----- code/components/jomjol_mqtt/interface_mqtt.h | 5 +- 6 files changed, 130 insertions(+), 133 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowControll.cpp b/code/components/jomjol_flowcontroll/ClassFlowControll.cpp index e3e2e62e..bc8bfa4a 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowControll.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowControll.cpp @@ -131,7 +131,6 @@ string ClassFlowControll::GetMQTTMainTopic() if (FlowControll[i]->name().compare("ClassFlowMQTT") == 0) return ((ClassFlowMQTT*) (FlowControll[i]))->GetMQTTMainTopic(); - return ""; } @@ -148,7 +147,6 @@ void ClassFlowControll::SetInitialParameter(void) disabled = false; aktRunNr = 0; aktstatus = "Booting ..."; - } bool ClassFlowControll::isAutoStart(long &_intervall) @@ -157,6 +155,11 @@ bool ClassFlowControll::isAutoStart(long &_intervall) return AutoStart; } +int ClassFlowControll::getAutoInterval() +{ + return AutoIntervall * 60; // AutoIntervall: Minuten -> seconds +} + ClassFlow* ClassFlowControll::CreateClassFlow(std::string _type) { ClassFlow* cfc = NULL; diff --git a/code/components/jomjol_flowcontroll/ClassFlowControll.h b/code/components/jomjol_flowcontroll/ClassFlowControll.h index 5fd3b08a..0a2753c7 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowControll.h +++ b/code/components/jomjol_flowcontroll/ClassFlowControll.h @@ -63,6 +63,7 @@ public: std::string doSingleStep(std::string _stepname, std::string _host); bool isAutoStart(long &_intervall); + int getAutoInterval(); std::string* getActStatus(); diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index e34d26f2..868096f0 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -6,7 +6,8 @@ #include "time_sntp.h" #include "interface_mqtt.h" #include "ClassFlowPostProcessing.h" -#include "ClassLogFile.h" +#include "ClassFlowPostProcessing.h" +#include "ClassFlowControll.h" #include @@ -22,7 +23,6 @@ void ClassFlowMQTT::SetInitialParameter(void) topicRate = ""; topicTimeStamp = ""; maintopic = ""; - lwt = ""; topicUptime = ""; topicFreeMem = ""; @@ -37,8 +37,6 @@ void ClassFlowMQTT::SetInitialParameter(void) previousElement = NULL; ListFlowControll = NULL; disabled = false; - MQTTenable = false; - keepAlive = 600; // TODO This must be greater than the Flow Interval! } ClassFlowMQTT::ClassFlowMQTT() @@ -57,6 +55,12 @@ ClassFlowMQTT::ClassFlowMQTT(std::vector* lfc) { flowpostprocessing = (ClassFlowPostProcessing*) (*ListFlowControll)[i]; } + + if (((*ListFlowControll)[i])->name().compare("ClassFlowControll") == 0) + { + ClassFlowControll *cfc = (ClassFlowControll*) (*ListFlowControll)[i]; + keepAlive = cfc->getAutoInterval()* 2.5; // Allow at least than 2 failed rounds before we are threated as disconnected + } } } @@ -125,48 +129,23 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph) maintopic = hostname; } } + + MQTT_Configure(uri, clientname, user, password, maintopic + "/connection", keepAlive); -#ifdef __HIDE_PASSWORD - ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: XXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), maintopic.c_str()); -#else - ESP_LOGD(TAG, "Init Read with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), maintopic.c_str()); -#endif + ESP_LOGD(TAG, "MQTT maintopic: %s", maintopic.c_str()); - if (!MQTTisConnected() && (uri.length() > 0) && (maintopic.length() > 0)) - { - ESP_LOGD(TAG, "InitMQTTInit"); - lwt = maintopic + "/connection"; -#ifdef __HIDE_PASSWORD - ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: XXXXXXXX, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), maintopic.c_str()); -#else - ESP_LOGD(TAG, "Init MQTT with uri: %s, clientname: %s, user: %s, password: %s, maintopic: %s", uri.c_str(), clientname.c_str(), user.c_str(), password.c_str(), maintopic.c_str()); -#endif - if (!MQTTInit(uri, clientname, user, password, lwt, keepAlive)) - { // Failed - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - } - } - - // Try sending LWT. If it fails, re-run init - if (!MQTTPublish(lwt, "connected", SetRetainFlag)) - { // Failed - LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); - if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->lwt, keepAlive)) - { // Failed - MQTTenable = false; - return false; - } - - // Try again sending LWT and quit if it fails - if (!MQTTPublish(lwt, "connected", SetRetainFlag)) - { // Failed - MQTTenable = false; + if (!MQTT_Init()) { + if (!MQTT_Init()) { // Retry return false; } } - MQTTenable = true; + MQTTPublish(maintopic + "/" + "mac", getMac(), SetRetainFlag); + MQTTPublish(maintopic + "/" + "ip", *getIPAddress(), SetRetainFlag); + MQTTPublish(maintopic + "/" + "hostname", hostname, SetRetainFlag); + + publishRuntimeData(); + return true; } @@ -176,6 +155,22 @@ string ClassFlowMQTT::GetMQTTMainTopic() return maintopic; } +void ClassFlowMQTT::publishRuntimeData() { + char tmp_char[50]; + + sprintf(tmp_char, "%ld", (long)getUpTime()); + MQTTPublish(maintopic + "/" + "uptime", std::string(tmp_char), SetRetainFlag); + + sprintf(tmp_char, "%zu", esp_get_free_heap_size()); + MQTTPublish(maintopic + "/" + "freeMem", std::string(tmp_char), SetRetainFlag); + + sprintf(tmp_char, "%d", get_WIFI_RSSI()); + MQTTPublish(maintopic + "/" + "wifiRSSI", std::string(tmp_char), SetRetainFlag); + + sprintf(tmp_char, "%d", (int)temperatureRead()); + MQTTPublish(maintopic + "/" + "CPUtemp", std::string(tmp_char), SetRetainFlag); +} + bool ClassFlowMQTT::doFlow(string zwtime) { @@ -188,44 +183,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) string zw = ""; string namenumber = ""; - zw = maintopic + "/" + "uptime"; - char uptimeStr[11]; - sprintf(uptimeStr, "%ld", (long)getUpTime()); - - // Try sending uptime. If it fails, re-run init - if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) - { // Failed - LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Re-running init...!"); - if (!MQTTInit(this->uri, this->clientname, this->user, this->password, this->lwt, keepAlive)) - { // Failed - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - } - - // Try again and quit if it fails - if (!MQTTPublish(zw, uptimeStr, SetRetainFlag)) - { // Failed - MQTTenable = false; - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - } - } - - zw = maintopic + "/" + "freeMem"; - char freeheapmem[11]; - sprintf(freeheapmem, "%zu", esp_get_free_heap_size()); - if (!MQTTPublish(zw, freeheapmem, SetRetainFlag)) - { // Failed, skip other topics - return true; // We need to return true despite we failed, else it will retry 5x and then reboot! - } - - zw = maintopic + "/" + "wifiRSSI"; - char rssi[11]; - sprintf(rssi, "%d", get_WIFI_RSSI()); - MQTTPublish(zw, rssi, SetRetainFlag); - - zw = maintopic + "/" + "CPUtemp"; - std::string cputemp = std::to_string(temperatureRead()); - MQTTPublish(zw, cputemp, SetRetainFlag); + publishRuntimeData(); if (flowpostprocessing) { @@ -246,29 +204,23 @@ bool ClassFlowMQTT::doFlow(string zwtime) else namenumber = maintopic + "/" + namenumber + "/"; - zw = namenumber + "value"; if (result.length() > 0) - MQTTPublish(zw, result, SetRetainFlag); + MQTTPublish(namenumber + "value", result, SetRetainFlag); - zw = namenumber + "error"; if (resulterror.length() > 0) - MQTTPublish(zw, resulterror, SetRetainFlag); + MQTTPublish(namenumber + "error", resulterror, SetRetainFlag); - zw = namenumber + "rate"; if (resultrate.length() > 0) - MQTTPublish(zw, resultrate, SetRetainFlag); + MQTTPublish(namenumber + "rate", resultrate, SetRetainFlag); - zw = namenumber + "changeabsolut"; if (resultchangabs.length() > 0) - MQTTPublish(zw, resultchangabs, SetRetainFlag); + MQTTPublish(namenumber + "changeabsolut", resultchangabs, SetRetainFlag); - zw = namenumber + "raw"; if (resultraw.length() > 0) - MQTTPublish(zw, resultraw, SetRetainFlag); + MQTTPublish(namenumber + "raw", resultraw, SetRetainFlag); - zw = namenumber + "timestamp"; if (resulttimestamp.length() > 0) - MQTTPublish(zw, resulttimestamp, SetRetainFlag); + MQTTPublish(namenumber + "timestamp", resulttimestamp, SetRetainFlag); std::string json = ""; @@ -286,8 +238,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) json += "\",\"rate\":\"\""; json += ",\"timestamp\":\""+resulttimestamp+"\"}"; - zw = namenumber + "json"; - MQTTPublish(zw, json, SetRetainFlag); + MQTTPublish(namenumber + "json", json, SetRetainFlag); } } else diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h index a2805a4b..78213a50 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h @@ -14,10 +14,9 @@ protected: ClassFlowPostProcessing* flowpostprocessing; std::string user, password; int SetRetainFlag; - bool MQTTenable; int keepAlive; - std::string maintopic, lwt; + std::string maintopic; void SetInitialParameter(void); public: @@ -28,6 +27,7 @@ public: string GetMQTTMainTopic(); bool ReadParameter(FILE* pfile, string& aktparamgraph); + void publishRuntimeData(); bool doFlow(string time); string name(){return "ClassFlowMQTT";}; }; diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index dc92269e..d6505cdc 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -19,16 +19,36 @@ esp_mqtt_event_id_t esp_mmqtt_ID = MQTT_EVENT_ANY; bool mqtt_connected = false; esp_mqtt_client_handle_t client = NULL; +std::string uri, client_id, lwt_topic, user, password; +int keepalive; -bool MQTTPublish(std::string _key, std::string _content, int retained_flag){ - + +bool MQTTPublish(std::string _key, std::string _content, int retained_flag) { int msg_id; std::string zw; + + if (!mqtt_connected) { + LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Not connected, trying to re-connect..."); + if (!MQTT_Init()) { + if (!MQTT_Init()) { // Retry + LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Failed to init!"); + return false; + } + } + } + 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, "MQTT - Failed to publish topic '" + _key + "'!"); - return false; + LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Failed to publish topic '" + _key + "', re-trying..."); + + 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, "MQTT - Failed to publish topic '" + _key + "'!"); + mqtt_connected = false; // Force re-init on next call + return false; + } } + zw = "MQTT - Published topic: " + _key + ", content: " + _content + " (msg_id=" + std::to_string(msg_id) + ")"; LogFile.WriteToFile(ESP_LOG_DEBUG, zw); return true; @@ -50,6 +70,7 @@ static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event) break; case MQTT_EVENT_DISCONNECTED: ESP_LOGI(TAG_INTERFACEMQTT, "MQTT_EVENT_DISCONNECTED"); + mqtt_connected = false; // Force re-init on next call esp_mqtt_client_reconnect(client); break; case MQTT_EVENT_SUBSCRIBED: @@ -79,6 +100,7 @@ static esp_err_t mqtt_event_handler_cb(esp_mqtt_event_handle_t event) break; case MQTT_EVENT_ERROR: ESP_LOGI(TAG_INTERFACEMQTT, "MQTT_EVENT_ERROR"); + mqtt_connected = false; // Force re-init on next call break; default: ESP_LOGI(TAG_INTERFACEMQTT, "Other event id:%d", event->event_id); @@ -93,35 +115,57 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ } -bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, std::string _LWTContext, int _keepalive){ - std::string _zwmessage = "connection lost"; +void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, std::string _lwt, int _keepalive){ +#ifdef __HIDE_PASSWORD + LogFile.WriteToFile(ESP_LOG_INFO, "MQTT Configuration: uri: " + _mqttURI + ", clientname: " + _clientid + + ", user: " + _user + ", password: XXXXXXXX, last-will-topic: " + _lwt + ", timeout: " + std::to_string(_keepalive)); +#else + LogFile.WriteToFile(ESP_LOG_INFO, "MQTT Configuration: uri: " + _mqttURI + ", clientname: " + _clientid + + ", user: " + _user + ", password: " + _password + ", last-will-topic: " + _lwt + ", timeout: " + std::to_string(_keepalive)); +#endif - int _lzw = _zwmessage.length(); - - esp_mqtt_client_config_t mqtt_cfg = { - .uri = _mqttURI.c_str(), - .client_id = _clientid.c_str(), - .lwt_topic = _LWTContext.c_str(), - .lwt_msg = _zwmessage.c_str(), - .lwt_retain = 1, - .lwt_msg_len = _lzw, - .keepalive = _keepalive - }; - - LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Init (client ID: " + _clientid + ")"); + uri = _mqttURI; + client_id = _clientid; + lwt_topic = _lwt; + keepalive = _keepalive; if (_user.length() && _password.length()){ - mqtt_cfg.username = _user.c_str(); - mqtt_cfg.password = _password.c_str(); + user = _user; + password = _password; + } +} -#ifdef __HIDE_PASSWORD - ESP_LOGI(TAG_INTERFACEMQTT, "Connect to MQTT: %s, XXXXXXXX", mqtt_cfg.username); -#else - ESP_LOGI(TAG_INTERFACEMQTT, "Connect to MQTT: %s, %s", mqtt_cfg.username, mqtt_cfg.password); -#endif +bool MQTT_Init() { + LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Init"); + + MQTTdestroy_client(); +/* + mqtt_cfg.uri = uri.c_str(); + mqtt_cfg.client_id = client_id.c_str(); + mqtt_cfg.lwt_topic = lwt_topic.c_str(); + mqtt_cfg.lwt_msg = lwt_msg.c_str(); + mqtt_cfg.lwt_retain = 1; + mqtt_cfg.lwt_msg_len = lwt_msg.length(); + mqtt_cfg.keepalive = keepalive; +*/ + + std::string lw = "connection lost"; + + esp_mqtt_client_config_t mqtt_cfg = { + .uri = uri.c_str(), + .client_id = client_id.c_str(), + .lwt_topic = lwt_topic.c_str(), + .lwt_msg = lw.c_str(), + .lwt_retain = 1, + .lwt_msg_len = (int)(lw.length()), + .keepalive = keepalive + }; + + if (user.length() && password.length()){ + mqtt_cfg.username = user.c_str(); + mqtt_cfg.password = password.c_str(); }; - MQTTdestroy(); client = esp_mqtt_client_init(&mqtt_cfg); if (client) { @@ -135,16 +179,10 @@ bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, st LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not start client!"); return false; } - - /* if(!MQTTPublish(_LWTContext, "", 1)) - { - LogFile.WriteToFile("MQTT - Could not publish LWT!"); - return false; - }*/ } else { - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not Init client!"); + LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not init client!"); return false; } @@ -153,7 +191,7 @@ bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, st } -void MQTTdestroy() { +void MQTTdestroy_client() { if (client != NULL) { esp_mqtt_client_stop(client); esp_mqtt_client_destroy(client); @@ -211,6 +249,9 @@ void MQTTregisterSubscribeFunction(std::string topic, std::function>::iterator it = connectFunktionMap->begin(); it != connectFunktionMap->end(); ++it) { it->second(); diff --git a/code/components/jomjol_mqtt/interface_mqtt.h b/code/components/jomjol_mqtt/interface_mqtt.h index 6e9ae85e..db0e6971 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.h +++ b/code/components/jomjol_mqtt/interface_mqtt.h @@ -5,8 +5,9 @@ #include #include -bool MQTTInit(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, std::string _LWTContext, int _keepalive); -void MQTTdestroy(); +void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, std::string _lwt, int _keepalive); +bool MQTT_Init(); +void MQTTdestroy_client(); bool MQTTPublish(std::string _key, std::string _content, int retained_flag = 1); // retained Flag as Standart From 8f66fcf2a64d72ce5f1774ccdfbbdf8ba2bb5bcc Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 01:12:53 +0200 Subject: [PATCH 23/45] . --- code/components/jomjol_mqtt/interface_mqtt.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index d6505cdc..bbe7da3c 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -139,15 +139,6 @@ bool MQTT_Init() { LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Init"); MQTTdestroy_client(); -/* - mqtt_cfg.uri = uri.c_str(); - mqtt_cfg.client_id = client_id.c_str(); - mqtt_cfg.lwt_topic = lwt_topic.c_str(); - mqtt_cfg.lwt_msg = lwt_msg.c_str(); - mqtt_cfg.lwt_retain = 1; - mqtt_cfg.lwt_msg_len = lwt_msg.length(); - mqtt_cfg.keepalive = keepalive; -*/ std::string lw = "connection lost"; From ca45d0a2782df81a63ca671e0e50b05d2d5af02d Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 10:03:05 +0200 Subject: [PATCH 24/45] . --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 19 +++++++++++++------ .../components/jomjol_mqtt/interface_mqtt.cpp | 10 +++++++--- code/components/jomjol_mqtt/interface_mqtt.h | 2 +- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 868096f0..8d5351af 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -15,6 +15,9 @@ static const char *TAG = "class_flow_MQTT"; + +extern ClassFlowControll tfliteflow; + void ClassFlowMQTT::SetInitialParameter(void) { uri = ""; @@ -37,6 +40,7 @@ void ClassFlowMQTT::SetInitialParameter(void) previousElement = NULL; ListFlowControll = NULL; disabled = false; + keepAlive = 25*60; } ClassFlowMQTT::ClassFlowMQTT() @@ -51,16 +55,20 @@ ClassFlowMQTT::ClassFlowMQTT(std::vector* lfc) ListFlowControll = lfc; for (int i = 0; i < ListFlowControll->size(); ++i) { + // ESP_LOGW(TAG, "LCF: %s", ((*ListFlowControll)[i])->name().c_str()); + if (((*ListFlowControll)[i])->name().compare("ClassFlowPostProcessing") == 0) { flowpostprocessing = (ClassFlowPostProcessing*) (*ListFlowControll)[i]; } - if (((*ListFlowControll)[i])->name().compare("ClassFlowControll") == 0) +// TODO this does not work since ClassFlowControll is not in the list! + /* if (((*ListFlowControll)[i])->name().compare("ClassFlowControll") == 0) { ClassFlowControll *cfc = (ClassFlowControll*) (*ListFlowControll)[i]; - keepAlive = cfc->getAutoInterval()* 2.5; // Allow at least than 2 failed rounds before we are threated as disconnected - } + this->keepAlive = cfc->getAutoInterval()* 2.5; // Allow at least than 2 failed rounds before we are threated as disconnected + ESP_LOGW(TAG, "KEEPALIVE: %d", this->keepAlive); + }*/ } } @@ -130,9 +138,8 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph) } } - MQTT_Configure(uri, clientname, user, password, maintopic + "/connection", keepAlive); - - ESP_LOGD(TAG, "MQTT maintopic: %s", maintopic.c_str()); + ESP_LOGW(TAG, "KEEPALIVE: %d", keepAlive); + MQTT_Configure(uri, clientname, user, password, maintopic, "/connection", keepAlive); if (!MQTT_Init()) { if (!MQTT_Init()) { // Retry diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index bbe7da3c..e1cc08ae 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -115,15 +115,16 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ } -void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, std::string _lwt, int _keepalive){ +void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, std::string _maintopic, std::string _lwt, int _keepalive){ #ifdef __HIDE_PASSWORD LogFile.WriteToFile(ESP_LOG_INFO, "MQTT Configuration: uri: " + _mqttURI + ", clientname: " + _clientid + - ", user: " + _user + ", password: XXXXXXXX, last-will-topic: " + _lwt + ", timeout: " + std::to_string(_keepalive)); + ", user: " + _user + ", password: XXXXXXXX, last-will-topic: " + _maintopic + _lwt + ", keepAlive: " + std::to_string(_keepalive)); #else LogFile.WriteToFile(ESP_LOG_INFO, "MQTT Configuration: uri: " + _mqttURI + ", clientname: " + _clientid + - ", user: " + _user + ", password: " + _password + ", last-will-topic: " + _lwt + ", timeout: " + std::to_string(_keepalive)); + ", user: " + _user + ", password: " + _password + ", last-will-topic: " + _maintopic + _lwt + ", keepAlive: " + std::to_string(_keepalive)); #endif + uri = _mqttURI; client_id = _clientid; lwt_topic = _lwt; @@ -133,6 +134,9 @@ void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _us user = _user; password = _password; } + + + LogFile.WriteToFile(ESP_LOG_INFO, "MQTT maintopic: %s", _maintopic.c_str()); } bool MQTT_Init() { diff --git a/code/components/jomjol_mqtt/interface_mqtt.h b/code/components/jomjol_mqtt/interface_mqtt.h index db0e6971..fa1227ee 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.h +++ b/code/components/jomjol_mqtt/interface_mqtt.h @@ -5,7 +5,7 @@ #include #include -void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, std::string _lwt, int _keepalive); +void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, std::string _maintopic, std::string _lwt, int _keepalive); bool MQTT_Init(); void MQTTdestroy_client(); From f4ae688527a75a12ac1773be84194914092573e5 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 10:44:28 +0200 Subject: [PATCH 25/45] refactored check if logfile is enabled. error messages always get logged now --- .../jomjol_controlcamera/ClassControllCamera.cpp | 4 ---- code/components/jomjol_fileserver_ota/server_ota.cpp | 1 - code/components/jomjol_flowcontroll/ClassFlowControll.cpp | 4 +--- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 5 ++--- code/components/jomjol_image_proc/CImageBasis.cpp | 1 - code/components/jomjol_logfile/ClassLogFile.cpp | 2 +- code/components/jomjol_mqtt/interface_mqtt.cpp | 8 ++++---- code/main/main.cpp | 6 ------ 8 files changed, 8 insertions(+), 23 deletions(-) diff --git a/code/components/jomjol_controlcamera/ClassControllCamera.cpp b/code/components/jomjol_controlcamera/ClassControllCamera.cpp index 5790cf70..208dcefb 100644 --- a/code/components/jomjol_controlcamera/ClassControllCamera.cpp +++ b/code/components/jomjol_controlcamera/ClassControllCamera.cpp @@ -263,7 +263,6 @@ void CCamera::EnableAutoExposure(int flashdauer) ESP_LOGE(TAGCAMERACLASS, "Camera Capture Failed"); LEDOnOff(false); LightOnOff(false); - LogFile.SwitchOnOff(true); LogFile.WriteToFile(ESP_LOG_ERROR, "Camera Capture Failed (Procedure 'EnableAutoExposure') --> Reboot! " "Check that your camera module is working and connected properly."); //doReboot(); @@ -315,7 +314,6 @@ esp_err_t CCamera::CaptureToBasisImage(CImageBasis *_Image, int delay) LEDOnOff(false); LightOnOff(false); - LogFile.SwitchOnOff(true); LogFile.WriteToFile(ESP_LOG_ERROR, "Camera is not working anymore (CCamera::CaptureToBasisImage) - most probably caused by a hardware problem (instablility, ...). " "System will reboot."); doReboot(); @@ -328,7 +326,6 @@ esp_err_t CCamera::CaptureToBasisImage(CImageBasis *_Image, int delay) if (!zwischenspeicher) { ESP_LOGE(TAGCAMERACLASS, "Insufficient memory space for image in function CaptureToBasisImage()"); - LogFile.SwitchOnOff(true); LogFile.WriteToFile(ESP_LOG_ERROR, "Insufficient memory space for image in function CaptureToBasisImage()"); } for (int i = 0; i < _size; ++i) @@ -413,7 +410,6 @@ esp_err_t CCamera::CaptureToFile(std::string nm, int delay) ESP_LOGE(TAGCAMERACLASS, "CaptureToFile: Camera Capture Failed"); LEDOnOff(false); LightOnOff(false); - LogFile.SwitchOnOff(true); LogFile.WriteToFile(ESP_LOG_ERROR, "Camera Capture Failed (CCamera::CaptureToFile) --> Reboot! " "Check that your camera module is working and connected properly."); //doReboot(); diff --git a/code/components/jomjol_fileserver_ota/server_ota.cpp b/code/components/jomjol_fileserver_ota/server_ota.cpp index 17facf15..7df5e72c 100644 --- a/code/components/jomjol_fileserver_ota/server_ota.cpp +++ b/code/components/jomjol_fileserver_ota/server_ota.cpp @@ -492,7 +492,6 @@ void task_reboot(void *pvParameter) } void doReboot(){ - LogFile.SwitchOnOff(true); LogFile.WriteToFile(ESP_LOG_INFO, "Reboot triggered by Software (5s)."); LogFile.WriteToFile(ESP_LOG_WARN, "Reboot in 5sec"); xTaskCreate(&task_reboot, "reboot", configMINIMAL_STACK_SIZE * 64, NULL, 10, NULL); diff --git a/code/components/jomjol_flowcontroll/ClassFlowControll.cpp b/code/components/jomjol_flowcontroll/ClassFlowControll.cpp index bc8bfa4a..c306447c 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowControll.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowControll.cpp @@ -308,7 +308,6 @@ bool ClassFlowControll::doFlow(string time) if (i) i -= 1; // vorheriger Schritt muss wiederholt werden (vermutlich Bilder aufnehmen) result = false; if (repeat > 5) { - LogFile.SwitchOnOff(true); LogFile.WriteToFile(ESP_LOG_ERROR, "Wiederholung 5x nicht erfolgreich --> reboot"); doReboot(); // Schritt wurde 5x wiederholt --> reboot @@ -496,8 +495,7 @@ bool ClassFlowControll::ReadParameter(FILE* pfile, string& aktparamgraph) { // reboot notwendig damit die neue wlan.ini auch benutzt wird !!! fclose(pfile); - LogFile.SwitchOnOff(true); - LogFile.WriteToFile(ESP_LOG_WARN, "Rebooting to activate new HOSTNAME..."); + LogFile.WriteToFile(ESP_LOG_ERROR, "Rebooting to activate new HOSTNAME..."); esp_restart(); hard_restart(); doReboot(); diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 8d5351af..c2801114 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -137,9 +137,8 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph) maintopic = hostname; } } - - ESP_LOGW(TAG, "KEEPALIVE: %d", keepAlive); - MQTT_Configure(uri, clientname, user, password, maintopic, "/connection", keepAlive); + + MQTT_Configure(uri, clientname, user, password, maintopic, "connection", keepAlive); if (!MQTT_Init()) { if (!MQTT_Init()) { // Retry diff --git a/code/components/jomjol_image_proc/CImageBasis.cpp b/code/components/jomjol_image_proc/CImageBasis.cpp index f72632c7..b7fa3e84 100644 --- a/code/components/jomjol_image_proc/CImageBasis.cpp +++ b/code/components/jomjol_image_proc/CImageBasis.cpp @@ -362,7 +362,6 @@ void CImageBasis::LoadFromMemory(stbi_uc *_buffer, int len) ESP_LOGD(TAG, "Image loaded from memory: %d, %d, %d", width, height, channels); if ((width * height * channels) == 0) { - LogFile.SwitchOnOff(true); LogFile.WriteToFile(ESP_LOG_ERROR, "Image with size 0 loaded --> reboot to be done! " "Check that your camera module is working and connected properly."); diff --git a/code/components/jomjol_logfile/ClassLogFile.cpp b/code/components/jomjol_logfile/ClassLogFile.cpp index c40aeef9..05667514 100644 --- a/code/components/jomjol_logfile/ClassLogFile.cpp +++ b/code/components/jomjol_logfile/ClassLogFile.cpp @@ -120,7 +120,7 @@ void ClassLogFile::WriteToDedicatedFile(std::string _fn, esp_log_level_t level, std::string zwtime; std::string logline = ""; - if (!doLogFile){ + if (!doLogFile && level != ESP_LOG_ERROR){ // Only write to file if logfile is enabled or its an error message return; } diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index e1cc08ae..5d7e97a8 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -118,16 +118,16 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, std::string _maintopic, std::string _lwt, int _keepalive){ #ifdef __HIDE_PASSWORD LogFile.WriteToFile(ESP_LOG_INFO, "MQTT Configuration: uri: " + _mqttURI + ", clientname: " + _clientid + - ", user: " + _user + ", password: XXXXXXXX, last-will-topic: " + _maintopic + _lwt + ", keepAlive: " + std::to_string(_keepalive)); + ", user: " + _user + ", password: XXXXXXXX, last-will-topic: " + _maintopic + "/" + _lwt + ", keepAlive: " + std::to_string(_keepalive)); #else LogFile.WriteToFile(ESP_LOG_INFO, "MQTT Configuration: uri: " + _mqttURI + ", clientname: " + _clientid + - ", user: " + _user + ", password: " + _password + ", last-will-topic: " + _maintopic + _lwt + ", keepAlive: " + std::to_string(_keepalive)); + ", user: " + _user + ", password: " + _password + ", last-will-topic: " + _maintopic + "/" + _lwt + ", keepAlive: " + std::to_string(_keepalive)); #endif uri = _mqttURI; client_id = _clientid; - lwt_topic = _lwt; + lwt_topic = _maintopic + "/" + _lwt; keepalive = _keepalive; if (_user.length() && _password.length()){ @@ -136,7 +136,7 @@ void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _us } - LogFile.WriteToFile(ESP_LOG_INFO, "MQTT maintopic: %s", _maintopic.c_str()); + LogFile.WriteToFile(ESP_LOG_INFO, "MQTT maintopic: " + _maintopic); } bool MQTT_Init() { diff --git a/code/main/main.cpp b/code/main/main.cpp index 9cdf60fc..5f1da209 100644 --- a/code/main/main.cpp +++ b/code/main/main.cpp @@ -219,7 +219,6 @@ extern "C" void app_main(void) LogFile.WriteToFile(ESP_LOG_INFO, "============================================================================================="); LogFile.WriteToFile(ESP_LOG_INFO, versionFormated); LogFile.WriteToFile(ESP_LOG_INFO, "Reset reason: " + getResetReason()); - LogFile.SwitchOnOff(false); std::string zw = gettimestring("%Y%m%d-%H%M%S"); ESP_LOGD(TAGMAIN, "time %s", zw.c_str()); @@ -229,20 +228,15 @@ extern "C" void app_main(void) { std::string _zws = "Not enough PSRAM available. Expected 4.194.304 MByte - available: " + std::to_string(_hsize); _zws = _zws + "\nEither not initialzed, too small (2MByte only) or not present at all. Firmware cannot start!!"; - LogFile.SwitchOnOff(true); LogFile.WriteToFile(ESP_LOG_ERROR, _zws); - LogFile.SwitchOnOff(false); } else { if (cam != ESP_OK) { - LogFile.SwitchOnOff(true); LogFile.WriteToFile(ESP_LOG_ERROR, "Failed to initialize camera module. " "Check that your camera module is working and connected properly."); - LogFile.SwitchOnOff(false); } else { // Test Camera camera_fb_t * fb = esp_camera_fb_get(); if (!fb) { - LogFile.SwitchOnOff(true); LogFile.WriteToFile(ESP_LOG_ERROR, "Camera cannot be initialzed. " "System will reboot."); doReboot(); From 7a280bc7c6130123c9fa926c273f4688a5c5429d Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 12:18:23 +0200 Subject: [PATCH 26/45] added callback on connected --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 60 +++++++++---------- .../jomjol_flowcontroll/ClassFlowMQTT.h | 1 - .../components/jomjol_mqtt/interface_mqtt.cpp | 33 ++++++---- code/components/jomjol_mqtt/interface_mqtt.h | 3 +- 4 files changed, 52 insertions(+), 45 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index c2801114..de90e30c 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -16,7 +16,31 @@ static const char *TAG = "class_flow_MQTT"; -extern ClassFlowControll tfliteflow; +void publishRuntimeData(std::string maintopic, int SetRetainFlag) { + char tmp_char[50]; + + sprintf(tmp_char, "%ld", (long)getUpTime()); + MQTTPublish(maintopic + "/" + "uptime", std::string(tmp_char), SetRetainFlag); + + sprintf(tmp_char, "%zu", esp_get_free_heap_size()); + MQTTPublish(maintopic + "/" + "freeMem", std::string(tmp_char), SetRetainFlag); + + sprintf(tmp_char, "%d", get_WIFI_RSSI()); + MQTTPublish(maintopic + "/" + "wifiRSSI", std::string(tmp_char), SetRetainFlag); + + sprintf(tmp_char, "%d", (int)temperatureRead()); + MQTTPublish(maintopic + "/" + "CPUtemp", std::string(tmp_char), SetRetainFlag); +} + +void GotConnected(std::string maintopic, int SetRetainFlag) { + MQTTPublish(maintopic + "/" + "mac", getMac(), SetRetainFlag); + MQTTPublish(maintopic + "/" + "ip", *getIPAddress(), SetRetainFlag); + MQTTPublish(maintopic + "/" + "hostname", hostname, SetRetainFlag); + + publishRuntimeData(maintopic, SetRetainFlag); +} + + void ClassFlowMQTT::SetInitialParameter(void) { @@ -25,7 +49,7 @@ void ClassFlowMQTT::SetInitialParameter(void) topicError = ""; topicRate = ""; topicTimeStamp = ""; - maintopic = ""; + maintopic = hostname; topicUptime = ""; topicFreeMem = ""; @@ -133,25 +157,15 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph) { maintopic = zerlegt[1]; } - else { // Main topic not set, use the hostname - maintopic = hostname; - } } - - MQTT_Configure(uri, clientname, user, password, maintopic, "connection", keepAlive); + + MQTT_Configure(uri, clientname, user, password, maintopic, "connection", keepAlive, SetRetainFlag, (void *)&GotConnected); if (!MQTT_Init()) { if (!MQTT_Init()) { // Retry return false; } } - - MQTTPublish(maintopic + "/" + "mac", getMac(), SetRetainFlag); - MQTTPublish(maintopic + "/" + "ip", *getIPAddress(), SetRetainFlag); - MQTTPublish(maintopic + "/" + "hostname", hostname, SetRetainFlag); - - publishRuntimeData(); - return true; } @@ -161,22 +175,6 @@ string ClassFlowMQTT::GetMQTTMainTopic() return maintopic; } -void ClassFlowMQTT::publishRuntimeData() { - char tmp_char[50]; - - sprintf(tmp_char, "%ld", (long)getUpTime()); - MQTTPublish(maintopic + "/" + "uptime", std::string(tmp_char), SetRetainFlag); - - sprintf(tmp_char, "%zu", esp_get_free_heap_size()); - MQTTPublish(maintopic + "/" + "freeMem", std::string(tmp_char), SetRetainFlag); - - sprintf(tmp_char, "%d", get_WIFI_RSSI()); - MQTTPublish(maintopic + "/" + "wifiRSSI", std::string(tmp_char), SetRetainFlag); - - sprintf(tmp_char, "%d", (int)temperatureRead()); - MQTTPublish(maintopic + "/" + "CPUtemp", std::string(tmp_char), SetRetainFlag); -} - bool ClassFlowMQTT::doFlow(string zwtime) { @@ -189,7 +187,7 @@ bool ClassFlowMQTT::doFlow(string zwtime) string zw = ""; string namenumber = ""; - publishRuntimeData(); + publishRuntimeData(maintopic, SetRetainFlag); if (flowpostprocessing) { diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h index 78213a50..62e07d52 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.h +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.h @@ -27,7 +27,6 @@ public: string GetMQTTMainTopic(); bool ReadParameter(FILE* pfile, string& aktparamgraph); - void publishRuntimeData(); bool doFlow(string time); string name(){return "ClassFlowMQTT";}; }; diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index 5d7e97a8..7d3ed0ff 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -19,8 +19,9 @@ esp_mqtt_event_id_t esp_mmqtt_ID = MQTT_EVENT_ANY; bool mqtt_connected = false; esp_mqtt_client_handle_t client = NULL; -std::string uri, client_id, lwt_topic, user, password; -int keepalive; +std::string uri, client_id, lwt_topic, user, password, maintopic; +int keepalive, SetRetainFlag; +void (*callbackOnConnected)(std::string, int) = NULL; bool MQTTPublish(std::string _key, std::string _content, int retained_flag) { @@ -115,13 +116,14 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ } -void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, std::string _maintopic, std::string _lwt, int _keepalive){ +void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, + std::string _maintopic, std::string _lwt, int _keepalive, int _SetRetainFlag, void *_callbackOnConnected){ #ifdef __HIDE_PASSWORD LogFile.WriteToFile(ESP_LOG_INFO, "MQTT Configuration: uri: " + _mqttURI + ", clientname: " + _clientid + - ", user: " + _user + ", password: XXXXXXXX, last-will-topic: " + _maintopic + "/" + _lwt + ", keepAlive: " + std::to_string(_keepalive)); + ", user: " + _user + ", password: XXXXXXXX, maintopic: " + _maintopic + ", last-will-topic: " + _maintopic + "/" + _lwt + ", keepAlive: " + std::to_string(_keepalive)); #else LogFile.WriteToFile(ESP_LOG_INFO, "MQTT Configuration: uri: " + _mqttURI + ", clientname: " + _clientid + - ", user: " + _user + ", password: " + _password + ", last-will-topic: " + _maintopic + "/" + _lwt + ", keepAlive: " + std::to_string(_keepalive)); + ", user: " + _user + ", password: " + _password + ", maintopic: " + _maintopic + ", last-will-topic: " + _maintopic + "/" + _lwt + ", keepAlive: " + std::to_string(_keepalive)); #endif @@ -129,17 +131,18 @@ void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _us client_id = _clientid; lwt_topic = _maintopic + "/" + _lwt; keepalive = _keepalive; + SetRetainFlag = _SetRetainFlag; + maintopic = _maintopic; + callbackOnConnected = ( void (*)(std::string, int) )(_callbackOnConnected); if (_user.length() && _password.length()){ user = _user; password = _password; } - - - LogFile.WriteToFile(ESP_LOG_INFO, "MQTT maintopic: " + _maintopic); } bool MQTT_Init() { + esp_err_t ret; LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Init"); MQTTdestroy_client(); @@ -164,14 +167,16 @@ bool MQTT_Init() { client = esp_mqtt_client_init(&mqtt_cfg); if (client) { - if (esp_mqtt_client_register_event(client, esp_mmqtt_ID, mqtt_event_handler, client) != ESP_OK) + ret = esp_mqtt_client_register_event(client, esp_mmqtt_ID, mqtt_event_handler, client); + if (ret != ESP_OK) { - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not register event!"); + LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not register event (ret=" + std::to_string(ret) + ")!"); return false; } - if (esp_mqtt_client_start(client) != ESP_OK) + ret = esp_mqtt_client_start(client); + if (ret != ESP_OK) { - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not start client!"); + LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not start client (ret=" + std::to_string(ret) + ")!"); return false; } } @@ -260,6 +265,10 @@ void MQTTconnected(){ LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - topic " + it->first + " subscribe successful, msg_id=" + std::to_string(msg_id)); } } + + if (callbackOnConnected) { + callbackOnConnected(maintopic, SetRetainFlag); + } } } diff --git a/code/components/jomjol_mqtt/interface_mqtt.h b/code/components/jomjol_mqtt/interface_mqtt.h index fa1227ee..e2d25c47 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.h +++ b/code/components/jomjol_mqtt/interface_mqtt.h @@ -5,7 +5,8 @@ #include #include -void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, std::string _maintopic, std::string _lwt, int _keepalive); +void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, + std::string _maintopic, std::string _lwt, int _keepalive, int SetRetainFlag, void *callbackOnConnected); bool MQTT_Init(); void MQTTdestroy_client(); From 08f90de6831e0f3366b7f65684d4f6fa73233e3e Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 19:05:00 +0200 Subject: [PATCH 27/45] . --- code/components/jomjol_mqtt/interface_mqtt.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index 7d3ed0ff..cf1f3119 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -173,11 +173,17 @@ bool MQTT_Init() { LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not register event (ret=" + std::to_string(ret) + ")!"); return false; } + ret = esp_mqtt_client_start(client); if (ret != ESP_OK) { - LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not start client (ret=" + std::to_string(ret) + ")!"); - return false; + LogFile.WriteToFile(ESP_LOG_WARN, "MQTT - Could not start client (ret=" + std::to_string(ret) + "), retrying..."); + ret = esp_mqtt_client_start(client); + if (ret != ESP_OK) + { + LogFile.WriteToFile(ESP_LOG_ERROR, "MQTT - Could not start client (ret=" + std::to_string(ret) + ")!"); + return false; + } } } else From bfc7c2b8b744352b3f038c2b6d3c58b003eff58b Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 19:06:47 +0200 Subject: [PATCH 28/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 1 - code/components/jomjol_mqtt/interface_mqtt.cpp | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index de90e30c..8693c6aa 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -147,7 +147,6 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph) SetRetainFlag = 1; } - if ((toUpper(zerlegt[0]) == "CLIENTID") && (zerlegt.size() > 1)) { this->clientname = zerlegt[1]; diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index cf1f3119..f01e8630 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -12,7 +12,6 @@ static const char *TAG_INTERFACEMQTT = "interface_mqtt"; std::map>* connectFunktionMap = NULL; std::map>* subscribeFunktionMap = NULL; -// #define CONFIG_BROKER_URL "mqtt://192.168.178.43:1883" esp_mqtt_event_id_t esp_mmqtt_ID = MQTT_EVENT_ANY; // ESP_EVENT_ANY_ID @@ -126,7 +125,6 @@ void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _us ", user: " + _user + ", password: " + _password + ", maintopic: " + _maintopic + ", last-will-topic: " + _maintopic + "/" + _lwt + ", keepAlive: " + std::to_string(_keepalive)); #endif - uri = _mqttURI; client_id = _clientid; lwt_topic = _maintopic + "/" + _lwt; @@ -291,4 +289,4 @@ void MQTTdestroySubscribeFunction(){ delete subscribeFunktionMap; subscribeFunktionMap = NULL; } -} \ No newline at end of file +} From 648a35e4d701c618e96773f09c6b03e0dc8fc2ab Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 22:02:21 +0200 Subject: [PATCH 29/45] Add HomeAssistant Discovery Topics --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 104 +++++++++++++++++- 1 file changed, 100 insertions(+), 4 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 8693c6aa..e3fc8a81 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -2,11 +2,11 @@ #include "ClassFlowMQTT.h" #include "Helper.h" #include "connect_wlan.h" +#include "ClassLogFile.h" #include "time_sntp.h" #include "interface_mqtt.h" #include "ClassFlowPostProcessing.h" -#include "ClassFlowPostProcessing.h" #include "ClassFlowControll.h" #include @@ -14,7 +14,99 @@ #define __HIDE_PASSWORD static const char *TAG = "class_flow_MQTT"; +#define LWT_TOPIC "connection" +extern const char* libfive_git_version(void); +extern const char* libfive_git_revision(void); +extern const char* libfive_git_branch(void); + +std::vector* NUMBERS; + +void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, std::string field, std::string icon, std::string unit) { + std::string version = std::string(libfive_git_version()); + + if (version == "") { + version = std::string(libfive_git_branch()) + " (" + std::string(libfive_git_revision()) + ")"; + } + + std::string topic; + std::string topicT; + std::string payload; + std::string nl = "\n"; + std::string name; + + if (group != "") { + topic = group + "/" + field; + topicT = group + "_" + field; + } + else { + topic = field; + topicT = field; + } + + name = field; + if (group != "") { + name = group + " " + name; + } + + topic = "homeassistant/sensor/" + maintopic + "-" + topicT + "/config"; + + payload = "{" + nl + + "\"~\": \"" + maintopic + "\"," + nl + + "\"unique_id\": \"" + maintopic + "-" +topicT + "\"," + nl + + "\"name\": \"" + name + "\"," + nl + + "\"icon\": \"mdi:" + icon + "\"," + nl + + "\"unit_of_meas\": \"" + unit + "\"," + nl; + + if (group != "") { + payload += "\"state_topic\": \"~/" + group + "/" + field + "\"," + nl; + } + else { + payload += "\"state_topic\": \"~/" + field + "\"," + nl; + } + + payload += + "\"availability_topic\": \"~/connection\"," + nl + + "\"payload_available\": \"connected\"," + nl + + "\"payload_not_available\": \"connection lost\"," + nl; + + payload += + "\"device\": {" + nl + + "\"identifiers\": [\"" + maintopic + "\"]," + nl + + "\"name\": \"" + maintopic + "\"," + nl + + "\"model\": \"HomeAssistant Discovery for AI on the Edge Device\"," + nl + + "\"manufacturer\": \"AI on the Edge Device\"," + nl + + "\"sw_version\": \"" + version + "\"" + nl + + "}" + nl + + "}" + nl; + + MQTTPublish(topic, payload, true); +} + +void MQTThomeassistantDiscovery(std::string maintopic) { + LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Sending Homeassistant Discovery Topics..."); + + sendHomeAssistantDiscoveryTopic(maintopic, "", "uptime", "clock-time-eight-outline", "s"); + sendHomeAssistantDiscoveryTopic(maintopic, "", "IP", "network-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, "", "MAC", "network-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, "", "hostname", "network-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, "", "freeMem", "memory", "B"); + sendHomeAssistantDiscoveryTopic(maintopic, "", "wifiRSSI", "file-question-outline", "dBm"); + sendHomeAssistantDiscoveryTopic(maintopic, "", "CPUtemp", "thermometer", "°C"); + + for (int i = 0; i < (*NUMBERS).size(); ++i) { + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "value", "gauge", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "alert-circle-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "rate", "file-question-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "changeabsolut", "file-question-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "raw", "file-question-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "clock-time-eight-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "code-json", ""); + } + + // Send LWT once more to indicate that we are online + //MQTTPublish(LWT_TOPIC, "connected", true); +} void publishRuntimeData(std::string maintopic, int SetRetainFlag) { char tmp_char[50]; @@ -33,8 +125,10 @@ void publishRuntimeData(std::string maintopic, int SetRetainFlag) { } void GotConnected(std::string maintopic, int SetRetainFlag) { - MQTTPublish(maintopic + "/" + "mac", getMac(), SetRetainFlag); - MQTTPublish(maintopic + "/" + "ip", *getIPAddress(), SetRetainFlag); + MQTThomeassistantDiscovery(maintopic); + + MQTTPublish(maintopic + "/" + "MAC", getMac(), SetRetainFlag); + MQTTPublish(maintopic + "/" + "IP", *getIPAddress(), SetRetainFlag); MQTTPublish(maintopic + "/" + "hostname", hostname, SetRetainFlag); publishRuntimeData(maintopic, SetRetainFlag); @@ -94,6 +188,8 @@ ClassFlowMQTT::ClassFlowMQTT(std::vector* lfc) ESP_LOGW(TAG, "KEEPALIVE: %d", this->keepAlive); }*/ } + + NUMBERS = flowpostprocessing->GetNumbers(); } ClassFlowMQTT::ClassFlowMQTT(std::vector* lfc, ClassFlow *_prev) @@ -158,7 +254,7 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph) } } - MQTT_Configure(uri, clientname, user, password, maintopic, "connection", keepAlive, SetRetainFlag, (void *)&GotConnected); + MQTT_Configure(uri, clientname, user, password, maintopic, LWT_TOPIC, keepAlive, SetRetainFlag, (void *)&GotConnected); if (!MQTT_Init()) { if (!MQTT_Init()) { // Retry From af8b7d682410c62f0fd03dcf0c0b6acb8b70e0c9 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 22:26:56 +0200 Subject: [PATCH 30/45] . --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 27 ++++++++++--------- .../components/jomjol_mqtt/interface_mqtt.cpp | 11 +++++--- code/components/jomjol_mqtt/interface_mqtt.h | 3 ++- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index e3fc8a81..0a6e4ac7 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -14,7 +14,10 @@ #define __HIDE_PASSWORD static const char *TAG = "class_flow_MQTT"; -#define LWT_TOPIC "connection" + +#define LWT_TOPIC "connection" +#define LWT_CONNECTED "connected" +#define LWT_DISCONNECTED "connection lost" extern const char* libfive_git_version(void); extern const char* libfive_git_revision(void); @@ -51,6 +54,7 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s topic = "homeassistant/sensor/" + maintopic + "-" + topicT + "/config"; + /* See https://www.home-assistant.io/docs/mqtt/discovery/ */ payload = "{" + nl + "\"~\": \"" + maintopic + "\"," + nl + "\"unique_id\": \"" + maintopic + "-" +topicT + "\"," + nl + @@ -66,17 +70,19 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s } payload += - "\"availability_topic\": \"~/connection\"," + nl + - "\"payload_available\": \"connected\"," + nl + - "\"payload_not_available\": \"connection lost\"," + nl; + "\"avty_t\": \"~/" + std::string(LWT_TOPIC) + "\"," + nl + + "\"pl_avail\": \"" + LWT_CONNECTED + "\"," + nl + + "\"pl_not_avail\": \"" + LWT_DISCONNECTED + "\"," + nl; payload += "\"device\": {" + nl + - "\"identifiers\": [\"" + maintopic + "\"]," + nl + + "\"ids\": [\"" + maintopic + "\"]," + nl + "\"name\": \"" + maintopic + "\"," + nl + - "\"model\": \"HomeAssistant Discovery for AI on the Edge Device\"," + nl + - "\"manufacturer\": \"AI on the Edge Device\"," + nl + - "\"sw_version\": \"" + version + "\"" + nl + + "\"model\": \"Meter Digitizer\"," + nl + + "\"mf\": \"AI on the Edge Device\"," + nl + + "\"sw\": \"" + version + "\"" + nl + + "\"hw\": \"ESP32-CAM\"" + nl + + "\"cu\": \"https://" + *getIPAddress() + "\"" + nl + "}" + nl + "}" + nl; @@ -103,9 +109,6 @@ void MQTThomeassistantDiscovery(std::string maintopic) { sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "clock-time-eight-outline", ""); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "code-json", ""); } - - // Send LWT once more to indicate that we are online - //MQTTPublish(LWT_TOPIC, "connected", true); } void publishRuntimeData(std::string maintopic, int SetRetainFlag) { @@ -254,7 +257,7 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph) } } - MQTT_Configure(uri, clientname, user, password, maintopic, LWT_TOPIC, keepAlive, SetRetainFlag, (void *)&GotConnected); + MQTT_Configure(uri, clientname, user, password, maintopic, LWT_TOPIC, LWT_CONNECTED, LWT_DISCONNECTED, keepAlive, SetRetainFlag, (void *)&GotConnected); if (!MQTT_Init()) { if (!MQTT_Init()) { // Retry diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index f01e8630..6fdb0f21 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -18,7 +18,7 @@ esp_mqtt_event_id_t esp_mmqtt_ID = MQTT_EVENT_ANY; bool mqtt_connected = false; esp_mqtt_client_handle_t client = NULL; -std::string uri, client_id, lwt_topic, user, password, maintopic; +std::string uri, client_id, lwt_topic, lwt_connected, lwt_disconnected, user, password, maintopic; int keepalive, SetRetainFlag; void (*callbackOnConnected)(std::string, int) = NULL; @@ -116,7 +116,8 @@ static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_ void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, - std::string _maintopic, std::string _lwt, int _keepalive, int _SetRetainFlag, void *_callbackOnConnected){ + std::string _maintopic, std::string _lwt, std::string _lwt_connected, std::string _lwt_disconnected, + int _keepalive, int _SetRetainFlag, void *_callbackOnConnected){ #ifdef __HIDE_PASSWORD LogFile.WriteToFile(ESP_LOG_INFO, "MQTT Configuration: uri: " + _mqttURI + ", clientname: " + _clientid + ", user: " + _user + ", password: XXXXXXXX, maintopic: " + _maintopic + ", last-will-topic: " + _maintopic + "/" + _lwt + ", keepAlive: " + std::to_string(_keepalive)); @@ -128,6 +129,8 @@ void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _us uri = _mqttURI; client_id = _clientid; lwt_topic = _maintopic + "/" + _lwt; + lwt_connected = _lwt_connected; + lwt_disconnected = _lwt_disconnected; keepalive = _keepalive; SetRetainFlag = _SetRetainFlag; maintopic = _maintopic; @@ -145,7 +148,7 @@ bool MQTT_Init() { MQTTdestroy_client(); - std::string lw = "connection lost"; + std::string lw = lwt_disconnected; esp_mqtt_client_config_t mqtt_cfg = { .uri = uri.c_str(), @@ -254,7 +257,7 @@ void MQTTconnected(){ if (mqtt_connected) { LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Connected"); - MQTTPublish(lwt_topic, "connected", true); + MQTTPublish(lwt_topic, lwt_connected, true); if (connectFunktionMap != NULL) { for(std::map>::iterator it = connectFunktionMap->begin(); it != connectFunktionMap->end(); ++it) { diff --git a/code/components/jomjol_mqtt/interface_mqtt.h b/code/components/jomjol_mqtt/interface_mqtt.h index e2d25c47..63d513a8 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.h +++ b/code/components/jomjol_mqtt/interface_mqtt.h @@ -6,7 +6,8 @@ #include void MQTT_Configure(std::string _mqttURI, std::string _clientid, std::string _user, std::string _password, - std::string _maintopic, std::string _lwt, int _keepalive, int SetRetainFlag, void *callbackOnConnected); + std::string _maintopic, std::string _lwt, std::string _lwt_connected, std::string _lwt_disconnected, + int _keepalive, int SetRetainFlag, void *callbackOnConnected); bool MQTT_Init(); void MQTTdestroy_client(); From 44f61c7c91ebb3b263de2e4205120c099c5afaea Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 23:10:39 +0200 Subject: [PATCH 31/45] . --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 0a6e4ac7..634a3939 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -70,19 +70,17 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s } payload += - "\"avty_t\": \"~/" + std::string(LWT_TOPIC) + "\"," + nl + - "\"pl_avail\": \"" + LWT_CONNECTED + "\"," + nl + - "\"pl_not_avail\": \"" + LWT_DISCONNECTED + "\"," + nl; + "\"availability_topic\": \"~/connection\"," + nl + + "\"payload_available\": \"connected\"," + nl + + "\"payload_not_available\": \"connection lost\"," + nl; payload += "\"device\": {" + nl + - "\"ids\": [\"" + maintopic + "\"]," + nl + + "\"identifiers\": [\"" + maintopic + "\"]," + nl + "\"name\": \"" + maintopic + "\"," + nl + - "\"model\": \"Meter Digitizer\"," + nl + - "\"mf\": \"AI on the Edge Device\"," + nl + - "\"sw\": \"" + version + "\"" + nl + - "\"hw\": \"ESP32-CAM\"" + nl + - "\"cu\": \"https://" + *getIPAddress() + "\"" + nl + + "\"model\": \"HomeAssistant Discovery for AI on the Edge Device\"," + nl + + "\"manufacturer\": \"AI on the Edge Device\"," + nl + + "\"sw_version\": \"" + version + "\"" + nl + "}" + nl + "}" + nl; From fe0d0c2590a821cd0d7b20757695e6124ac07dfc Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 23:16:15 +0200 Subject: [PATCH 32/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 634a3939..7d3b2f06 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -70,9 +70,9 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s } payload += - "\"availability_topic\": \"~/connection\"," + nl + - "\"payload_available\": \"connected\"," + nl + - "\"payload_not_available\": \"connection lost\"," + nl; + "\"availability_topic\": \"~/" + std::string(LWT_TOPIC) + "\"," + nl + + "\"payload_available\": \"" + LWT_CONNECTED + "\"," + nl + + "\"payload_not_available\": \"" + LWT_DISCONNECTED + "\"," + nl; payload += "\"device\": {" + nl + From 6cdbe38717fc462bb4f2caea41cc9193d5d7c1c2 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Thu, 27 Oct 2022 23:35:48 +0200 Subject: [PATCH 33/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 7d3b2f06..c580e7f9 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -78,9 +78,10 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s "\"device\": {" + nl + "\"identifiers\": [\"" + maintopic + "\"]," + nl + "\"name\": \"" + maintopic + "\"," + nl + - "\"model\": \"HomeAssistant Discovery for AI on the Edge Device\"," + nl + + "\"model\": \"Meter Digitizer\"," + nl + "\"manufacturer\": \"AI on the Edge Device\"," + nl + - "\"sw_version\": \"" + version + "\"" + nl + + "\"sw_version\": \"" + version + "\"," + nl + + "\"configuration_url\": \"http://" + *getIPAddress() + "\"" + nl + "}" + nl + "}" + nl; From deecc128be4d7debb16ee1aa0107c0b38084c2f1 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Fri, 28 Oct 2022 16:00:13 +0200 Subject: [PATCH 34/45] added user friendly name, corrected Wifi icon --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index c580e7f9..0a18c20e 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -25,7 +25,7 @@ extern const char* libfive_git_branch(void); std::vector* NUMBERS; -void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, std::string field, std::string icon, std::string unit) { +void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, std::string field, std::string userFriendlyName, std::string icon, std::string unit) { std::string version = std::string(libfive_git_version()); if (version == "") { @@ -50,6 +50,7 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s name = field; if (group != "") { name = group + " " + name; + userFriendlyName = group + " " + userFriendlyName; } topic = "homeassistant/sensor/" + maintopic + "-" + topicT + "/config"; @@ -58,7 +59,7 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s payload = "{" + nl + "\"~\": \"" + maintopic + "\"," + nl + "\"unique_id\": \"" + maintopic + "-" +topicT + "\"," + nl + - "\"name\": \"" + name + "\"," + nl + + "\"name\": \"" + userFriendlyName + "\"," + nl + "\"icon\": \"mdi:" + icon + "\"," + nl + "\"unit_of_meas\": \"" + unit + "\"," + nl; @@ -90,23 +91,24 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s void MQTThomeassistantDiscovery(std::string maintopic) { LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Sending Homeassistant Discovery Topics..."); - - sendHomeAssistantDiscoveryTopic(maintopic, "", "uptime", "clock-time-eight-outline", "s"); - sendHomeAssistantDiscoveryTopic(maintopic, "", "IP", "network-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, "", "MAC", "network-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, "", "hostname", "network-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, "", "freeMem", "memory", "B"); - sendHomeAssistantDiscoveryTopic(maintopic, "", "wifiRSSI", "file-question-outline", "dBm"); - sendHomeAssistantDiscoveryTopic(maintopic, "", "CPUtemp", "thermometer", "°C"); + // maintopic group field User Friendly Name icon unit + sendHomeAssistantDiscoveryTopic(maintopic, "", "uptime", "Uptime", "clock-time-eight-outline", "s"); + sendHomeAssistantDiscoveryTopic(maintopic, "", "IP", "IP", "network-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, "", "MAC", "MAC Address", "network-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, "", "hostname", "Hostname", "network-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, "", "FreeMem", "Free Memory", "memory", "B"); + sendHomeAssistantDiscoveryTopic(maintopic, "", "wifiRSSI", "Wi-Fi RSSI", "wifi", "dBm"); + sendHomeAssistantDiscoveryTopic(maintopic, "", "CPUtemp", "CPU Temperature", "thermometer", "°C"); for (int i = 0; i < (*NUMBERS).size(); ++i) { - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "value", "gauge", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "alert-circle-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "rate", "file-question-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "changeabsolut", "file-question-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "raw", "file-question-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "clock-time-eight-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "code-json", ""); + // maintopic group field User Friendly Name icon unit + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "value", "Value", "gauge", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "Error", "alert-circle-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "rate", "Rate", "file-question-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "changeabsolut", "Absolute Change", "file-question-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "raw", "Raw Value", "file-question-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "Timestamp", "clock-time-eight-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "JSON", "code-json", ""); } } From f6b44ac905fe6c1198308499dcfcda743aa1b392 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Fri, 28 Oct 2022 16:11:09 +0200 Subject: [PATCH 35/45] renaming --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 0a18c20e..8b4c9008 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -33,6 +33,7 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s } std::string topic; + std::string topicFull; std::string topicT; std::string payload; std::string nl = "\n"; @@ -53,7 +54,7 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s userFriendlyName = group + " " + userFriendlyName; } - topic = "homeassistant/sensor/" + maintopic + "-" + topicT + "/config"; + topicFull = "homeassistant/sensor/" + maintopic + "/" + topicT + "/config"; /* See https://www.home-assistant.io/docs/mqtt/discovery/ */ payload = "{" + nl + @@ -86,7 +87,7 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s "}" + nl + "}" + nl; - MQTTPublish(topic, payload, true); + MQTTPublish(topicFull, payload, true); } void MQTThomeassistantDiscovery(std::string maintopic) { From 7a037a325412c448f1360911e23ea6175a5285f4 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Fri, 28 Oct 2022 16:27:00 +0200 Subject: [PATCH 36/45] adjusted icons --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 8b4c9008..b4867907 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -105,9 +105,9 @@ void MQTThomeassistantDiscovery(std::string maintopic) { // maintopic group field User Friendly Name icon unit sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "value", "Value", "gauge", ""); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "Error", "alert-circle-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "rate", "Rate", "file-question-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "changeabsolut", "Absolute Change", "file-question-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "raw", "Raw Value", "file-question-outline", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "rate", "Rate", "swap-vertical", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "changeabsolut", "Absolute Change", "arrow-expand-vertical", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "raw", "Raw Value", "raw", ""); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "Timestamp", "clock-time-eight-outline", ""); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "JSON", "code-json", ""); } From 4e476a75ca883f3e45c2652c2af224ec762e977c Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Fri, 28 Oct 2022 16:53:55 +0200 Subject: [PATCH 37/45] changed error topic to a binary sensor, removed meas unit if it has no unit --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index b4867907..25cf07ac 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -25,7 +25,13 @@ extern const char* libfive_git_branch(void); std::vector* NUMBERS; -void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, std::string field, std::string userFriendlyName, std::string icon, std::string unit) { +enum TopicType { + TOPIC_TYPE_NORMAL, + TOPIC_TYPE_BINARY +}; + +void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, std::string field, + std::string userFriendlyName, std::string icon, std::string unit, TopicType topicType) { std::string version = std::string(libfive_git_version()); if (version == "") { @@ -61,8 +67,7 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s "\"~\": \"" + maintopic + "\"," + nl + "\"unique_id\": \"" + maintopic + "-" +topicT + "\"," + nl + "\"name\": \"" + userFriendlyName + "\"," + nl + - "\"icon\": \"mdi:" + icon + "\"," + nl + - "\"unit_of_meas\": \"" + unit + "\"," + nl; + "\"icon\": \"mdi:" + icon + "\"," + nl; if (group != "") { payload += "\"state_topic\": \"~/" + group + "/" + field + "\"," + nl; @@ -71,6 +76,14 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s payload += "\"state_topic\": \"~/" + field + "\"," + nl; } + if (unit != "-") { + payload += "\"unit_of_meas\": \"" + unit + "\"," + nl; + } + + if (topicType == TOPIC_TYPE_BINARY) { + payload += "\"value_template\": \"{{ 'OFF' if 'no error' in value else 'ON'}}\"," + nl; + } + payload += "\"availability_topic\": \"~/" + std::string(LWT_TOPIC) + "\"," + nl + "\"payload_available\": \"" + LWT_CONNECTED + "\"," + nl + @@ -92,24 +105,24 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s void MQTThomeassistantDiscovery(std::string maintopic) { LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Sending Homeassistant Discovery Topics..."); - // maintopic group field User Friendly Name icon unit - sendHomeAssistantDiscoveryTopic(maintopic, "", "uptime", "Uptime", "clock-time-eight-outline", "s"); - sendHomeAssistantDiscoveryTopic(maintopic, "", "IP", "IP", "network-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, "", "MAC", "MAC Address", "network-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, "", "hostname", "Hostname", "network-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, "", "FreeMem", "Free Memory", "memory", "B"); - sendHomeAssistantDiscoveryTopic(maintopic, "", "wifiRSSI", "Wi-Fi RSSI", "wifi", "dBm"); - sendHomeAssistantDiscoveryTopic(maintopic, "", "CPUtemp", "CPU Temperature", "thermometer", "°C"); + // maintopic group field User Friendly Name icon unit Topic Type + sendHomeAssistantDiscoveryTopic(maintopic, "", "uptime", "Uptime", "clock-time-eight-outline", "s", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, "", "IP", "IP", "network-outline", "-", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, "", "MAC", "MAC Address", "network-outline", "-", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, "", "hostname", "Hostname", "network-outline", "-", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, "", "FreeMem", "Free Memory", "memory", "B", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, "", "wifiRSSI", "Wi-Fi RSSI", "wifi", "dBm", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, "", "CPUtemp", "CPU Temperature", "thermometer", "°C", TOPIC_TYPE_NORMAL); for (int i = 0; i < (*NUMBERS).size(); ++i) { - // maintopic group field User Friendly Name icon unit - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "value", "Value", "gauge", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "Error", "alert-circle-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "rate", "Rate", "swap-vertical", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "changeabsolut", "Absolute Change", "arrow-expand-vertical", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "raw", "Raw Value", "raw", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "Timestamp", "clock-time-eight-outline", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "JSON", "code-json", ""); + // maintopic group field User Friendly Name icon unit Topic Type + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "value", "Value", "gauge", "", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "Error", "alert-circle-outline", "-", TOPIC_TYPE_BINARY); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "rate", "Rate", "swap-vertical", "", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "changeabsolut", "Absolute Change", "arrow-expand-vertical", "", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "raw", "Raw Value", "raw", "", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "Timestamp", "clock-time-eight-outline", "-", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "JSON", "code-json", "-", TOPIC_TYPE_NORMAL); } } From 5188734c8bb4d9a14f11c7f63ead0ca754304417 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Fri, 28 Oct 2022 17:09:32 +0200 Subject: [PATCH 38/45] added device classes --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 25cf07ac..640655be 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -27,7 +27,10 @@ std::vector* NUMBERS; enum TopicType { TOPIC_TYPE_NORMAL, - TOPIC_TYPE_BINARY + TOPIC_TYPE_ERROR, + TOPIC_TYPE_SIGNAL_STRENGTH, + TOPIC_TYPE_TEMPERATURE, + TOPIC_TYPE_TIMESTAMP }; void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, std::string field, @@ -80,8 +83,22 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s payload += "\"unit_of_meas\": \"" + unit + "\"," + nl; } - if (topicType == TOPIC_TYPE_BINARY) { - payload += "\"value_template\": \"{{ 'OFF' if 'no error' in value else 'ON'}}\"," + nl; + if (topicType == TOPIC_TYPE_ERROR) { + payload += std::string("") + + "\"value_template\": \"{{ 'OFF' if 'no error' in value else 'ON'}}\"," + nl + + "\"device_class\": \"problem\"," + nl; + } + else if (topicType == TOPIC_TYPE_SIGNAL_STRENGTH) { + payload += std::string("") + + "\"device_class\": \"signal_strength\"," + nl; + } + else if (topicType == TOPIC_TYPE_TEMPERATURE) { + payload += std::string("") + + "\"device_class\": \"temperature\"," + nl; + } + else if (topicType == TOPIC_TYPE_TIMESTAMP) { + payload += std::string("") + + "\"device_class\": \"timestamp\"," + nl; } payload += @@ -107,22 +124,22 @@ void MQTThomeassistantDiscovery(std::string maintopic) { LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Sending Homeassistant Discovery Topics..."); // maintopic group field User Friendly Name icon unit Topic Type sendHomeAssistantDiscoveryTopic(maintopic, "", "uptime", "Uptime", "clock-time-eight-outline", "s", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, "", "IP", "IP", "network-outline", "-", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, "", "MAC", "MAC Address", "network-outline", "-", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, "", "hostname", "Hostname", "network-outline", "-", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, "", "IP", "IP", "network-outline", "-", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, "", "MAC", "MAC Address", "network-outline", "-", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, "", "hostname", "Hostname", "network-outline", "-", TOPIC_TYPE_NORMAL); sendHomeAssistantDiscoveryTopic(maintopic, "", "FreeMem", "Free Memory", "memory", "B", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, "", "wifiRSSI", "Wi-Fi RSSI", "wifi", "dBm", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, "", "CPUtemp", "CPU Temperature", "thermometer", "°C", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, "", "wifiRSSI", "Wi-Fi RSSI", "wifi", "dBm", TOPIC_TYPE_SIGNAL_STRENGTH); + sendHomeAssistantDiscoveryTopic(maintopic, "", "CPUtemp", "CPU Temperature", "thermometer", "°C", TOPIC_TYPE_TEMPERATURE); for (int i = 0; i < (*NUMBERS).size(); ++i) { // maintopic group field User Friendly Name icon unit Topic Type sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "value", "Value", "gauge", "", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "Error", "alert-circle-outline", "-", TOPIC_TYPE_BINARY); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "Error", "alert-circle-outline", "-", TOPIC_TYPE_ERROR); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "rate", "Rate", "swap-vertical", "", TOPIC_TYPE_NORMAL); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "changeabsolut", "Absolute Change", "arrow-expand-vertical", "", TOPIC_TYPE_NORMAL); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "raw", "Raw Value", "raw", "", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "Timestamp", "clock-time-eight-outline", "-", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "JSON", "code-json", "-", TOPIC_TYPE_NORMAL); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "Timestamp", "clock-time-eight-outline", "-", TOPIC_TYPE_TIMESTAMP); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "JSON", "code-json", "-", TOPIC_TYPE_NORMAL); } } From 7ebbba3cf2d79e3deb2137ed3ec872cdefbc89d5 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Fri, 28 Oct 2022 17:50:27 +0200 Subject: [PATCH 39/45] refactoring --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 69 ++++++++----------- 1 file changed, 27 insertions(+), 42 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 640655be..69f2d149 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -25,16 +25,8 @@ extern const char* libfive_git_branch(void); std::vector* NUMBERS; -enum TopicType { - TOPIC_TYPE_NORMAL, - TOPIC_TYPE_ERROR, - TOPIC_TYPE_SIGNAL_STRENGTH, - TOPIC_TYPE_TEMPERATURE, - TOPIC_TYPE_TIMESTAMP -}; - void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, std::string field, - std::string userFriendlyName, std::string icon, std::string unit, TopicType topicType) { + std::string userFriendlyName, std::string icon, std::string unit, std::string deviceClass, std::string stateClass) { std::string version = std::string(libfive_git_version()); if (version == "") { @@ -79,28 +71,21 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s payload += "\"state_topic\": \"~/" + field + "\"," + nl; } - if (unit != "-") { + if (unit != "") { payload += "\"unit_of_meas\": \"" + unit + "\"," + nl; } - if (topicType == TOPIC_TYPE_ERROR) { - payload += std::string("") + - "\"value_template\": \"{{ 'OFF' if 'no error' in value else 'ON'}}\"," + nl + - "\"device_class\": \"problem\"," + nl; - } - else if (topicType == TOPIC_TYPE_SIGNAL_STRENGTH) { - payload += std::string("") + - "\"device_class\": \"signal_strength\"," + nl; - } - else if (topicType == TOPIC_TYPE_TEMPERATURE) { - payload += std::string("") + - "\"device_class\": \"temperature\"," + nl; - } - else if (topicType == TOPIC_TYPE_TIMESTAMP) { - payload += std::string("") + - "\"device_class\": \"timestamp\"," + nl; + if (deviceClass != "") { + payload += "\"device_class\": \"" + deviceClass + "\"," + nl; + if (deviceClass == "problem") { + payload += "\"value_template\": \"{{ 'OFF' if 'no error' in value else 'ON'}}\"," + nl; + } } + if (stateClass != "") { + payload += "\"state_class\": \"" + stateClass + "\"," + nl; + } + payload += "\"availability_topic\": \"~/" + std::string(LWT_TOPIC) + "\"," + nl + "\"payload_available\": \"" + LWT_CONNECTED + "\"," + nl + @@ -122,24 +107,24 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s void MQTThomeassistantDiscovery(std::string maintopic) { LogFile.WriteToFile(ESP_LOG_INFO, "MQTT - Sending Homeassistant Discovery Topics..."); - // maintopic group field User Friendly Name icon unit Topic Type - sendHomeAssistantDiscoveryTopic(maintopic, "", "uptime", "Uptime", "clock-time-eight-outline", "s", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, "", "IP", "IP", "network-outline", "-", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, "", "MAC", "MAC Address", "network-outline", "-", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, "", "hostname", "Hostname", "network-outline", "-", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, "", "FreeMem", "Free Memory", "memory", "B", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, "", "wifiRSSI", "Wi-Fi RSSI", "wifi", "dBm", TOPIC_TYPE_SIGNAL_STRENGTH); - sendHomeAssistantDiscoveryTopic(maintopic, "", "CPUtemp", "CPU Temperature", "thermometer", "°C", TOPIC_TYPE_TEMPERATURE); + // maintopic group field User Friendly Name icon unit Device Class State Class + sendHomeAssistantDiscoveryTopic(maintopic, "", "uptime", "Uptime", "clock-time-eight-outline", "s", "", ""); + sendHomeAssistantDiscoveryTopic(maintopic, "", "IP", "IP", "network-outline", "", "", ""); + sendHomeAssistantDiscoveryTopic(maintopic, "", "MAC", "MAC Address", "network-outline", "", "", ""); + sendHomeAssistantDiscoveryTopic(maintopic, "", "hostname", "Hostname", "network-outline", "", "", ""); + sendHomeAssistantDiscoveryTopic(maintopic, "", "freeMem", "Free Memory", "memory", "B", "", "measurement"); + sendHomeAssistantDiscoveryTopic(maintopic, "", "wifiRSSI", "Wi-Fi RSSI", "wifi", "dBm", "signal_strength", ""); + sendHomeAssistantDiscoveryTopic(maintopic, "", "CPUtemp", "CPU Temperature", "thermometer", "°C", "temperature", "measurement"); for (int i = 0; i < (*NUMBERS).size(); ++i) { - // maintopic group field User Friendly Name icon unit Topic Type - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "value", "Value", "gauge", "", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "Error", "alert-circle-outline", "-", TOPIC_TYPE_ERROR); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "rate", "Rate", "swap-vertical", "", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "changeabsolut", "Absolute Change", "arrow-expand-vertical", "", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "raw", "Raw Value", "raw", "", TOPIC_TYPE_NORMAL); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "Timestamp", "clock-time-eight-outline", "-", TOPIC_TYPE_TIMESTAMP); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "JSON", "code-json", "-", TOPIC_TYPE_NORMAL); + // maintopic group field User Friendly Name icon unit Device Class State Class + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "value", "Value", "gauge", "", "", "total_increasing"); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "Error", "alert-circle-outline", "", "problem", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "rate", "Rate", "swap-vertical", "", "", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "changeabsolut", "Absolute Change", "arrow-expand-vertical", "", "", "measurement"); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "raw", "Raw Value", "raw", "", "", "total_increasing"); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "Timestamp", "clock-time-eight-outline", "", "timestamp", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "JSON", "code-json", "", "", ""); } } From b9f57edb92392507f40df661e6ccbefb7fd6dd61 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Fri, 28 Oct 2022 22:53:23 +0200 Subject: [PATCH 40/45] added separate binary sensor "problem" indicating an error state --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 69f2d149..241d773d 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -65,10 +65,16 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s "\"icon\": \"mdi:" + icon + "\"," + nl; if (group != "") { - payload += "\"state_topic\": \"~/" + group + "/" + field + "\"," + nl; + if (field == "problem") { // Special binary sensor which is based on error topic + payload += "\"state_topic\": \"~/" + group + "/error\"," + nl; + payload += "\"value_template\": \"{{ 'OFF' if 'no error' in value else 'ON'}}\"," + nl; + } + else { + payload += "\"state_topic\": \"~/" + group + "/" + field + "\"," + nl; + } } else { - payload += "\"state_topic\": \"~/" + field + "\"," + nl; + payload += "\"state_topic\": \"~/" + field + "\"," + nl; } if (unit != "") { @@ -77,9 +83,9 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s if (deviceClass != "") { payload += "\"device_class\": \"" + deviceClass + "\"," + nl; - if (deviceClass == "problem") { + /* if (deviceClass == "problem") { payload += "\"value_template\": \"{{ 'OFF' if 'no error' in value else 'ON'}}\"," + nl; - } + }*/ } if (stateClass != "") { @@ -119,12 +125,14 @@ void MQTThomeassistantDiscovery(std::string maintopic) { for (int i = 0; i < (*NUMBERS).size(); ++i) { // maintopic group field User Friendly Name icon unit Device Class State Class sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "value", "Value", "gauge", "", "", "total_increasing"); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "Error", "alert-circle-outline", "", "problem", ""); + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "error", "Error", "alert-circle-outline", "", "", ""); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "rate", "Rate", "swap-vertical", "", "", ""); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "changeabsolut", "Absolute Change", "arrow-expand-vertical", "", "", "measurement"); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "raw", "Raw Value", "raw", "", "", "total_increasing"); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "Timestamp", "clock-time-eight-outline", "", "timestamp", ""); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "JSON", "code-json", "", "", ""); + + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "problem", "Problem", "code-json", "", "", ""); // Special binary sensor which is based on error topic } } From 0867dcc6dacc0e03992f1123d8f88c879739c9c2 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Fri, 28 Oct 2022 22:58:39 +0200 Subject: [PATCH 41/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 241d773d..f0d1c174 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -132,7 +132,7 @@ void MQTThomeassistantDiscovery(std::string maintopic) { sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "timestamp", "Timestamp", "clock-time-eight-outline", "", "timestamp", ""); sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "json", "JSON", "code-json", "", "", ""); - sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "problem", "Problem", "code-json", "", "", ""); // Special binary sensor which is based on error topic + sendHomeAssistantDiscoveryTopic(maintopic, (*NUMBERS)[i]->name, "problem", "Problem", "alert-outline", "", "", ""); // Special binary sensor which is based on error topic } } From fc24db7d5944e21189598d30abb6ea3f191810a6 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Fri, 28 Oct 2022 23:42:04 +0200 Subject: [PATCH 42/45] truncate log MQTT contents when they are too long and remove all newline characters in logfile writes --- code/components/jomjol_logfile/ClassLogFile.cpp | 3 +++ code/components/jomjol_mqtt/interface_mqtt.cpp | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/code/components/jomjol_logfile/ClassLogFile.cpp b/code/components/jomjol_logfile/ClassLogFile.cpp index 05667514..d866eb53 100644 --- a/code/components/jomjol_logfile/ClassLogFile.cpp +++ b/code/components/jomjol_logfile/ClassLogFile.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { @@ -206,6 +207,8 @@ void ClassLogFile::WriteToFile(esp_log_level_t level, std::string info, bool _ti strftime(buffer, 30, logfile.c_str(), timeinfo); std::string logpath = logroot + "/" + buffer; + std::replace(info.begin(), info.end(), '\n', ' '); // Replace all newline characters + WriteToDedicatedFile(logpath, level, info, _time); ESP_LOG_LEVEL(level, TAG, "%s", info.c_str()); } diff --git a/code/components/jomjol_mqtt/interface_mqtt.cpp b/code/components/jomjol_mqtt/interface_mqtt.cpp index 8becc4a7..1f30d525 100644 --- a/code/components/jomjol_mqtt/interface_mqtt.cpp +++ b/code/components/jomjol_mqtt/interface_mqtt.cpp @@ -49,6 +49,11 @@ bool MQTTPublish(std::string _key, std::string _content, int retained_flag) { } } + if (_content.length() > 80) { // Truncate message if too long + _content.resize(80); + _content.append(".."); + } + zw = "MQTT - Published topic: " + _key + ", content: " + _content + " (msg_id=" + std::to_string(msg_id) + ")"; LogFile.WriteToFile(ESP_LOG_DEBUG, zw); From 56d8c65008e07cfc52b9e66ac0715efe8e61f2ad Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Sat, 29 Oct 2022 11:50:19 +0200 Subject: [PATCH 43/45] add maintopic to entity name to get a better entity ID. For some undocumented reason, HA removes the maintopic again in the name, so it looks ok :) --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index f0d1c174..917d0147 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -26,7 +26,7 @@ extern const char* libfive_git_branch(void); std::vector* NUMBERS; void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, std::string field, - std::string userFriendlyName, std::string icon, std::string unit, std::string deviceClass, std::string stateClass) { + std::string name, std::string icon, std::string unit, std::string deviceClass, std::string stateClass) { std::string version = std::string(libfive_git_version()); if (version == "") { @@ -38,30 +38,29 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s std::string topicT; std::string payload; std::string nl = "\n"; - std::string name; - if (group != "") { - topic = group + "/" + field; - topicT = group + "_" + field; - } - else { + if (group == "") { topic = field; topicT = field; } - - name = field; - if (group != "") { - name = group + " " + name; - userFriendlyName = group + " " + userFriendlyName; + else { + topic = group + "/" + field; + topicT = group + "_" + field; } + /* The name is used as Friendly Name but also to generate the Entity ID! */ + if (group != "") { // Prepend the group to the name + name = group + " " + name; + } + name = maintopic + " " + name; // Prepend device name to make the entities unique + topicFull = "homeassistant/sensor/" + maintopic + "/" + topicT + "/config"; /* See https://www.home-assistant.io/docs/mqtt/discovery/ */ payload = "{" + nl + "\"~\": \"" + maintopic + "\"," + nl + - "\"unique_id\": \"" + maintopic + "-" +topicT + "\"," + nl + - "\"name\": \"" + userFriendlyName + "\"," + nl + + "\"unique_id\": \"" + maintopic + "-" + topicT + "\"," + nl + + "\"name\": \"" + name + "\"," + nl + "\"icon\": \"mdi:" + icon + "\"," + nl; if (group != "") { From 9b9a7537f17ab5e5b03a7a56343062d39d9ab340 Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Sat, 29 Oct 2022 12:06:20 +0200 Subject: [PATCH 44/45] . --- code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index 917d0147..c8489ee9 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -48,11 +48,9 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s topicT = group + "_" + field; } - /* The name is used as Friendly Name but also to generate the Entity ID! */ if (group != "") { // Prepend the group to the name name = group + " " + name; } - name = maintopic + " " + name; // Prepend device name to make the entities unique topicFull = "homeassistant/sensor/" + maintopic + "/" + topicT + "/config"; @@ -60,6 +58,7 @@ void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, s payload = "{" + nl + "\"~\": \"" + maintopic + "\"," + nl + "\"unique_id\": \"" + maintopic + "-" + topicT + "\"," + nl + + "\"object_id\": \"" + maintopic + "_" + topicT + "\"," + nl + // This used to generate the Entity ID "\"name\": \"" + name + "\"," + nl + "\"icon\": \"mdi:" + icon + "\"," + nl; From d21a38f42faf746fc646e3b7753eb28b18c1397a Mon Sep 17 00:00:00 2001 From: CaCO3 Date: Sat, 29 Oct 2022 18:28:08 +0200 Subject: [PATCH 45/45] Added parameter to enable/disable Homeassistant Discovery --- .../jomjol_flowcontroll/ClassFlowMQTT.cpp | 12 +++++++++-- sd-card/html/edit_config_param.html | 20 ++++++++++++++++++- sd-card/html/readconfigparam.js | 1 + 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp index c8489ee9..2892b648 100644 --- a/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp +++ b/code/components/jomjol_flowcontroll/ClassFlowMQTT.cpp @@ -24,6 +24,7 @@ extern const char* libfive_git_revision(void); extern const char* libfive_git_branch(void); std::vector* NUMBERS; +bool HomeassistantDiscovery = false; void sendHomeAssistantDiscoveryTopic(std::string maintopic, std::string group, std::string field, std::string name, std::string icon, std::string unit, std::string deviceClass, std::string stateClass) { @@ -151,7 +152,9 @@ void publishRuntimeData(std::string maintopic, int SetRetainFlag) { } void GotConnected(std::string maintopic, int SetRetainFlag) { - MQTThomeassistantDiscovery(maintopic); + if (HomeassistantDiscovery) { + MQTThomeassistantDiscovery(maintopic); + } MQTTPublish(maintopic + "/" + "MAC", getMac(), SetRetainFlag); MQTTPublish(maintopic + "/" + "IP", *getIPAddress(), SetRetainFlag); @@ -180,7 +183,7 @@ void ClassFlowMQTT::SetInitialParameter(void) flowpostprocessing = NULL; user = ""; password = ""; - SetRetainFlag = 0; + SetRetainFlag = 0; previousElement = NULL; ListFlowControll = NULL; disabled = false; @@ -268,6 +271,11 @@ bool ClassFlowMQTT::ReadParameter(FILE* pfile, string& aktparamgraph) if (toUpper(zerlegt[1]) == "TRUE") SetRetainFlag = 1; } + if ((toUpper(zerlegt[0]) == "HOMEASSISTANTDISCOVERY") && (zerlegt.size() > 1)) + { + if (toUpper(zerlegt[1]) == "TRUE") + HomeassistantDiscovery = true; + } if ((toUpper(zerlegt[0]) == "CLIENTID") && (zerlegt.size() > 1)) { diff --git a/sd-card/html/edit_config_param.html b/sd-card/html/edit_config_param.html index ac6b5a46..b58d23dd 100644 --- a/sd-card/html/edit_config_param.html +++ b/sd-card/html/edit_config_param.html @@ -625,7 +625,23 @@ textarea { Enable or disable the retain flag for all MQTT entries - + + + + + + + + + + Enable or disable the Homeassistand Discovery + + + +

@@ -1715,6 +1731,7 @@ function UpdateInput() { WriteParameter(param, category, "MQTT", "user", true); WriteParameter(param, category, "MQTT", "password", true); WriteParameter(param, category, "MQTT", "SetRetainFlag", true); + WriteParameter(param, category, "MQTT", "HomeassistantDiscovery", true); WriteParameter(param, category, "InfluxDB", "Uri", true); WriteParameter(param, category, "InfluxDB", "Database", true); @@ -1831,6 +1848,7 @@ function ReadParameterAll() ReadParameter(param, "MQTT", "user", true); ReadParameter(param, "MQTT", "password", true); ReadParameter(param, "MQTT", "SetRetainFlag", true); + ReadParameter(param, "MQTT", "HomeassistantDiscovery", true); ReadParameter(param, "InfluxDB", "Uri", true); ReadParameter(param, "InfluxDB", "Database", true); diff --git a/sd-card/html/readconfigparam.js b/sd-card/html/readconfigparam.js index ffacacf8..60c57ba9 100644 --- a/sd-card/html/readconfigparam.js +++ b/sd-card/html/readconfigparam.js @@ -187,6 +187,7 @@ function ParseConfig() { ParamAddValue(param, catname, "user"); ParamAddValue(param, catname, "password"); ParamAddValue(param, catname, "SetRetainFlag"); + ParamAddValue(param, catname, "HomeassistantDiscovery"); var catname = "InfluxDB"; category[catname] = new Object();