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/SplitFlapMqtt.cpp b/src/SplitFlapMqtt.cpp index 452d144..9fe4502 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,25 @@ 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..7ddc8e7 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; };