From 21ff2524c283d02cc187714c149554d155069085 Mon Sep 17 00:00:00 2001 From: kwadra Date: Sat, 2 Aug 2025 20:41:15 -0700 Subject: [PATCH 1/4] Add a reconnect if the mqtt connection is lost --- .gitignore | 4 +++- src/SplitFlapDisplay.cpp | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 18af49a..dd2367e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,6 @@ .vscode node_modules/ build/web/* -.idea \ No newline at end of file +.idea +*.code-workspace +.gitignore diff --git a/src/SplitFlapDisplay.cpp b/src/SplitFlapDisplay.cpp index ebe0fe2..9705d01 100644 --- a/src/SplitFlapDisplay.cpp +++ b/src/SplitFlapDisplay.cpp @@ -199,6 +199,10 @@ void SplitFlapDisplay::writeString(String inputString, float speed, bool centeri if (mqtt && mqtt->isConnected()) { mqtt->publishState(displayString); + } else if (mqtt) { + // reconnect to MQTT if not connected + mqtt->setup(); + } } From f219982ed8b8437b0ea1fc931ff8a4305fa20eec Mon Sep 17 00:00:00 2001 From: kwadra Date: Sun, 3 Aug 2025 11:49:38 -0700 Subject: [PATCH 2/4] Pub regular message to availability queue and re-connect logic --- src/SplitFlapMqtt.cpp | 21 ++++++++++++++++++++- src/SplitFlapMqtt.h | 2 ++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/SplitFlapMqtt.cpp b/src/SplitFlapMqtt.cpp index 452d144..c92b784 100644 --- a/src/SplitFlapMqtt.cpp +++ b/src/SplitFlapMqtt.cpp @@ -81,7 +81,8 @@ void SplitFlapMqtt::connectToMqtt() { // clang-format on mqttClient.subscribe(topic_command.c_str()); - mqttClient.publish(topic_avail.c_str(), "online", true); + setAvailable(); // publish availability status + mqttClient.publish(topic_state.c_str(), "", true); mqttClient.publish(topic_config_text.c_str(), payload_text.c_str(), true); @@ -101,8 +102,26 @@ void SplitFlapMqtt::publishState(const String &message) { mqttClient.publish(topic_state.c_str(), message.c_str(), true); } +void SplitFlapMqtt::setAvailable() { + mqttClient.publish(topic_avail.c_str(), "online" , true); +} + void SplitFlapMqtt::loop() { mqttClient.loop(); + // Check if MQTT client is connected, if not try to reconnect + if (! mqttClient.connected()) { + unsigned long now = millis(); + if (now - lastAttempt > 5000) { // retry every 5 seconds + connectToMqtt(); + lastAttempt = now; + } + } + // Publish availability status every 60 seconds + if (millis() - lastAvailabilityPublish > 60000) { + setAvailable(); + lastAvailabilityPublish = millis(); + } + } bool SplitFlapMqtt::isConnected() { diff --git a/src/SplitFlapMqtt.h b/src/SplitFlapMqtt.h index fbc4d1e..163d6e7 100644 --- a/src/SplitFlapMqtt.h +++ b/src/SplitFlapMqtt.h @@ -13,6 +13,7 @@ class SplitFlapMqtt { void setup(); void loop(); // needed for PubSubClient3 void publishState(const String &message); + void setAvailable(); // publish availability status void setDisplay(SplitFlapDisplay *display); bool isConnected(); @@ -37,5 +38,6 @@ class SplitFlapMqtt { String topic_config_sensor; unsigned long lastAttempt = 0; + unsigned long lastAvailabilityPublish = 0; int retryCount = 0; }; From d572d02f40400b134c7cb8b1476b380923d2e5d8 Mon Sep 17 00:00:00 2001 From: kwadra Date: Tue, 5 Aug 2025 20:17:21 -0700 Subject: [PATCH 3/4] Don't need the extra re-connect since it's handled in the loop() --- src/SplitFlapDisplay.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/SplitFlapDisplay.cpp b/src/SplitFlapDisplay.cpp index 9705d01..ebe0fe2 100644 --- a/src/SplitFlapDisplay.cpp +++ b/src/SplitFlapDisplay.cpp @@ -199,10 +199,6 @@ void SplitFlapDisplay::writeString(String inputString, float speed, bool centeri if (mqtt && mqtt->isConnected()) { mqtt->publishState(displayString); - } else if (mqtt) { - // reconnect to MQTT if not connected - mqtt->setup(); - } } From da75a9a6879a3162032a17f60e7b41f76f23c6de Mon Sep 17 00:00:00 2001 From: kwadra Date: Tue, 5 Aug 2025 20:27:18 -0700 Subject: [PATCH 4/4] Fix formatting w/ formatter --- src/SplitFlapMqtt.cpp | 5 ++--- src/SplitFlapMqtt.h | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/SplitFlapMqtt.cpp b/src/SplitFlapMqtt.cpp index c92b784..9fe4502 100644 --- a/src/SplitFlapMqtt.cpp +++ b/src/SplitFlapMqtt.cpp @@ -103,7 +103,7 @@ void SplitFlapMqtt::publishState(const String &message) { } void SplitFlapMqtt::setAvailable() { - mqttClient.publish(topic_avail.c_str(), "online" , true); + mqttClient.publish(topic_avail.c_str(), "online", true); } void SplitFlapMqtt::loop() { @@ -117,11 +117,10 @@ void SplitFlapMqtt::loop() { } } // Publish availability status every 60 seconds - if (millis() - lastAvailabilityPublish > 60000) { + if (millis() - lastAvailabilityPublish > 60000) { setAvailable(); lastAvailabilityPublish = millis(); } - } bool SplitFlapMqtt::isConnected() { diff --git a/src/SplitFlapMqtt.h b/src/SplitFlapMqtt.h index 163d6e7..7ddc8e7 100644 --- a/src/SplitFlapMqtt.h +++ b/src/SplitFlapMqtt.h @@ -13,7 +13,7 @@ class SplitFlapMqtt { void setup(); void loop(); // needed for PubSubClient3 void publishState(const String &message); - void setAvailable(); // publish availability status + void setAvailable(); // publish availability status void setDisplay(SplitFlapDisplay *display); bool isConnected();