From 3d598a1217fb2a63e23d8babfc1fa7f93845b076 Mon Sep 17 00:00:00 2001 From: Andrey Klimov Date: Sat, 6 Apr 2019 23:53:59 +0300 Subject: [PATCH] More stability: MQTT Publish suppressed if input Loop invoked from ethernet Idle (reentrance issue? low-memory for stack?) Side effects - some MQTT publishings may lost Watchdog enabled when MQTT connection pending --- lighthub/inputs.cpp | 15 ++++++++------- lighthub/item.cpp | 7 ++++--- lighthub/main.cpp | 32 ++++++++++++++++++++++---------- 3 files changed, 34 insertions(+), 20 deletions(-) diff --git a/lighthub/inputs.cpp b/lighthub/inputs.cpp index 1a8aa66..cb316d6 100644 --- a/lighthub/inputs.cpp +++ b/lighthub/inputs.cpp @@ -33,6 +33,7 @@ e-mail anklimov@gmail.com extern PubSubClient mqttClient; extern aJsonObject *root; +extern int8_t ethernetIdleCount; #if !defined(DHT_DISABLE) || !defined(COUNTER_DISABLE) static volatile unsigned long nextPollMillisValue[5]; @@ -223,7 +224,7 @@ void Input::counterPoll() { strncpy(addrstr,emit->valuestring,sizeof(addrstr)); if (!strchr(addrstr,'/')) setTopic(addrstr,sizeof(addrstr),T_OUT,emit->valuestring); sprintf(valstr, "%d", counterValue); - if (mqttClient.connected()) + if (mqttClient.connected() && !ethernetIdleCount) mqttClient.publish(addrstr, valstr); setNextPollTime(millis() + DHT_POLL_DELAY_DEFAULT); debugSerial<valuestring,sizeof(addrstr)); -if (mqttClient.connected()) +if (mqttClient.connected() && !ethernetIdleCount) { if (!strchr(addrstr,'/')) setTopic(addrstr,sizeof(addrstr),T_OUT,emit->valuestring); if (newValue) { //send set command @@ -578,7 +579,7 @@ void Input::onAnalogChanged(int newValue) { if (!strchr(addrstr,'/')) setTopic(addrstr,sizeof(addrstr),T_OUT,emit->valuestring); char strVal[16]; itoa(newValue,strVal,10); - if (mqttClient.connected()) + if (mqttClient.connected() && !ethernetIdleCount) mqttClient.publish(addrstr, strVal, true); } @@ -601,7 +602,7 @@ bool Input::publishDataToDomoticz(int pollTimeIncrement, aJsonObject *emit, cons vsnprintf(valstr, sizeof(valstr) - 1, format, args); va_end(args); debugSerial << valstr; - if (mqttClient.connected()) + if (mqttClient.connected() && !ethernetIdleCount) mqttClient.publish(emit->valuestring, valstr); if (pollTimeIncrement) setNextPollTime(millis() + pollTimeIncrement); diff --git a/lighthub/item.cpp b/lighthub/item.cpp index ed2b954..fc76499 100644 --- a/lighthub/item.cpp +++ b/lighthub/item.cpp @@ -63,6 +63,7 @@ extern aJsonObject *pollingItem; //int modbusSet(int addr, uint16_t _reg, int _mask, uint16_t value); extern PubSubClient mqttClient; +extern int8_t ethernetIdleCount; //extern char outprefix[]; //const char outprefix[] PROGMEM = OUTTOPIC; @@ -1049,14 +1050,14 @@ int Item::checkFM() { else aJson.addNumberToObject(out, "pwr", 0); if (ftemp > FM_OVERHEAT_CELSIUS && set) { - if (mqttClient.connected()) + if (mqttClient.connected() && !ethernetIdleCount) mqttClient.publish("/alarm/ovrht", itemArr->name); Ctrl(CMD_OFF); //Shut down } } else debugSerial << F("Modbus polling error=") << _HEX(result); outch = aJson.print(out); - if (mqttClient.connected()) + if (mqttClient.connected() && !ethernetIdleCount) mqttClient.publish(addrstr, outch); free(outch); aJson.deleteItem(out); @@ -1296,7 +1297,7 @@ int Item::SendStatus(short cmd, short n, int *Par, boolean deffered) { return -1; } debugSerial<")<valuestring, currentTemp); debugSerial << valstr; - if (mqttClient.connected()) + if (mqttClient.connected() && !ethernetIdleCount) mqttClient.publish(owEmitString, valstr); return; } @@ -785,7 +798,7 @@ void Changed(int i, DeviceAddress addr, float currentTemp) { //strcpy_P(addrstr, outprefix); setTopic(addrstr,sizeof(addrstr),T_OUT); strncat(addrstr, owEmitString, sizeof(addrstr)); - if (mqttClient.connected()) + if (mqttClient.connected() && !ethernetIdleCount) mqttClient.publish(addrstr, valstr); } // And translate temp to internal items @@ -944,6 +957,7 @@ void printConfigSummary() { printBool(udpSyslogArr); #endif debugSerial << endl; + debugSerial<