From ac629b4e35492c6a4ca7b135431f935597cae74c Mon Sep 17 00:00:00 2001 From: technyon Date: Thu, 9 Feb 2023 19:31:14 +0100 Subject: [PATCH] publishh autodiscovery topics after reconnect --- Config.h | 2 +- Network.cpp | 9 +++++++++ Network.h | 4 +++- NetworkLock.cpp | 12 ++++++++++++ NetworkLock.h | 3 +++ NetworkOpener.cpp | 12 ++++++++++++ NetworkOpener.h | 4 ++++ NukiOpenerWrapper.cpp | 5 ++++- NukiWrapper.cpp | 4 ++++ 9 files changed, 52 insertions(+), 3 deletions(-) diff --git a/Config.h b/Config.h index 39950a1..2b9969f 100644 --- a/Config.h +++ b/Config.h @@ -1,6 +1,6 @@ #pragma once -#define NUKI_HUB_VERSION "8.7" +#define NUKI_HUB_VERSION "8.8-pre-1" #define MQTT_QOS_LEVEL 1 #define MQTT_CLEAN_SESSIONS false \ No newline at end of file diff --git a/Network.cpp b/Network.cpp index d059f65..cc897e0 100644 --- a/Network.cpp +++ b/Network.cpp @@ -375,6 +375,10 @@ bool Network::reconnect() } delay(1000); _mqttConnectionState = 2; + for(const auto& callback : _reconnectedCallbacks) + { + callback(); + } } else { @@ -938,3 +942,8 @@ void Network::setKeepAliveCallback(std::function reconnectTick) { _keepAliveCallback = reconnectTick; } + +void Network::addReconnectedCallback(std::function reconnectedCallback) +{ + _reconnectedCallbacks.push_back(reconnectedCallback); +} diff --git a/Network.h b/Network.h index f10770f..7907727 100644 --- a/Network.h +++ b/Network.h @@ -52,6 +52,7 @@ public: uint16_t subscribe(const char* topic, uint8_t qos); void setKeepAliveCallback(std::function reconnectTick); + void addReconnectedCallback(std::function reconnectedCallback); private: static void onMqttDataReceivedCallback(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total); @@ -91,7 +92,8 @@ private: unsigned long _lastMaintenanceTs = 0; unsigned long _lastRssiTs = 0; long _rssiPublishInterval = 0; - std::function _keepAliveCallback; + std::function _keepAliveCallback = nullptr; + std::vector> _reconnectedCallbacks; NetworkDeviceType _networkDeviceType = (NetworkDeviceType)-1; diff --git a/NetworkLock.cpp b/NetworkLock.cpp index e317dfe..7d14f77 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -70,6 +70,11 @@ void NetworkLock::initialize() _network->initTopic(_mqttPath, mqtt_topic_keypad_command_code, "000000"); _network->initTopic(_mqttPath, mqtt_topic_keypad_command_enabled, "1"); } + + _network->addReconnectedCallback([&]() + { + _reconnected = true; + }); } void NetworkLock::onMqttDataReceived(const char* topic, byte* payload, const unsigned int length) @@ -557,3 +562,10 @@ String NetworkLock::concat(String a, String b) c.concat(b); return c; } + +bool NetworkLock::reconnected() +{ + bool r = _reconnected; + _reconnected = false; + return r; +} diff --git a/NetworkLock.h b/NetworkLock.h index 49c68f1..b113f32 100644 --- a/NetworkLock.h +++ b/NetworkLock.h @@ -40,6 +40,8 @@ public: void onMqttDataReceived(const char* topic, byte* payload, const unsigned int length) override; + bool reconnected(); + private: bool comparePrefixedPath(const char* fullPath, const char* subPath); @@ -66,6 +68,7 @@ private: bool _firstTunerStatePublish = true; unsigned long _lastMaintenanceTs = 0; bool _haEnabled= false; + bool _reconnected = false; String _keypadCommandName = ""; String _keypadCommandCode = ""; diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 51b838f..68c8569 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -56,6 +56,11 @@ void NetworkOpener::initialize() _network->initTopic(_mqttPath, mqtt_topic_keypad_command_code, "000000"); _network->initTopic(_mqttPath, mqtt_topic_keypad_command_enabled, "1"); } + + _network->addReconnectedCallback([&]() + { + _reconnected = true; + }); } void NetworkOpener::update() @@ -600,3 +605,10 @@ String NetworkOpener::concat(String a, String b) c.concat(b); return c; } + +bool NetworkOpener::reconnected() +{ + bool r = _reconnected; + _reconnected = false; + return r; +} \ No newline at end of file diff --git a/NetworkOpener.h b/NetworkOpener.h index 82b9d41..6b9ce9c 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -41,6 +41,8 @@ public: void onMqttDataReceived(const char* topic, byte* payload, const unsigned int length) override; + bool reconnected(); + private: bool comparePrefixedPath(const char* fullPath, const char* subPath); @@ -70,6 +72,8 @@ private: bool _firstTunerStatePublish = true; bool _haEnabled= false; + bool _reconnected = false; + String _keypadCommandName = ""; String _keypadCommandCode = ""; uint _keypadCommandId = 0; diff --git a/NukiOpenerWrapper.cpp b/NukiOpenerWrapper.cpp index 26a0c39..a549220 100644 --- a/NukiOpenerWrapper.cpp +++ b/NukiOpenerWrapper.cpp @@ -167,7 +167,10 @@ void NukiOpenerWrapper::update() setupHASS(); } } - + if(_hassEnabled && _configRead && _network->reconnected()) + { + setupHASS(); + } if(_rssiPublishInterval > 0 && (_nextRssiTs == 0 || ts > _nextRssiTs)) { _nextRssiTs = ts + _rssiPublishInterval; diff --git a/NukiWrapper.cpp b/NukiWrapper.cpp index e287826..e32c6a0 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -168,6 +168,10 @@ void NukiWrapper::update() setupHASS(); } } + if(_hassEnabled && _configRead && _network->reconnected()) + { + setupHASS(); + } if(_rssiPublishInterval > 0 && (_nextRssiTs == 0 || ts > _nextRssiTs)) { _nextRssiTs = ts + _rssiPublishInterval;