diff --git a/src/NukiNetwork.cpp b/src/NukiNetwork.cpp index 86f855c..e8408af 100644 --- a/src/NukiNetwork.cpp +++ b/src/NukiNetwork.cpp @@ -616,6 +616,7 @@ bool NukiNetwork::reconnect() if (_device->mqttConnected()) { Log->println(F("MQTT connected")); + _mqttConnectedTs = millis(); _mqttConnectionState = 1; delay(100); @@ -718,6 +719,8 @@ void NukiNetwork::onMqttDataReceivedCallback(const espMqttClientTypes::MessagePr void NukiNetwork::onMqttDataReceived(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t& len, size_t& index, size_t& total) { + if(_mqttConnectedTs == -1 || (millis() - _mqttConnectedTs < 2000)) return; + parseGpioTopics(properties, topic, payload, len, index, total); for(auto receiver : _mqttReceivers) @@ -786,6 +789,22 @@ bool NukiNetwork::encryptionSupported() return _device->supportsEncryption(); } +bool NukiNetwork::mqttRecentlyConnected() +{ + return _mqttConnectedTs != -1 && (millis() - _mqttConnectedTs < 6000); +} + +bool NukiNetwork::pathEquals(const char* prefix, const char* path, const char* referencePath) +{ + char prefixedPath[500]; + buildMqttPath(prefixedPath, { prefix, path }); + + Log->println(prefixedPath); + Log->println(referencePath); + + return strcmp(prefixedPath, referencePath) == 0; +} + void NukiNetwork::publishFloat(const char* prefix, const char* topic, const float value, bool retain, const uint8_t precision) { char str[30]; diff --git a/src/NukiNetwork.h b/src/NukiNetwork.h index 8269e32..99a0ba2 100644 --- a/src/NukiNetwork.h +++ b/src/NukiNetwork.h @@ -97,6 +97,8 @@ public: int mqttConnectionState(); // 0 = not connected; 1 = connected; 2 = connected and mqtt processed bool encryptionSupported(); + bool mqttRecentlyConnected(); + bool pathEquals(const char* prefix, const char* path, const char* referencePath); uint16_t subscribe(const char* topic, uint8_t qos); @@ -156,6 +158,7 @@ private: Gpio* _gpio; int _mqttConnectionState = 0; + long _mqttConnectedTs = -1; bool _connectReplyReceived = false; bool _firstDisconnected = true; diff --git a/src/NukiNetworkLock.cpp b/src/NukiNetworkLock.cpp index a7b8f7f..5990dc9 100644 --- a/src/NukiNetworkLock.cpp +++ b/src/NukiNetworkLock.cpp @@ -182,6 +182,11 @@ void NukiNetworkLock::onMqttDataReceived(const char* topic, byte* payload, const { char* value = (char*)payload; + if(_network->mqttRecentlyConnected() && _network->pathEquals(_mqttPath, mqtt_topic_lock_action, topic)) + { + Log->println("MQTT recently connected, ignoring lock action."); + } + if(comparePrefixedPath(topic, mqtt_topic_reset) && strcmp(value, "1") == 0) { Log->println(F("Restart requested via MQTT.")); diff --git a/src/NukiNetworkOpener.cpp b/src/NukiNetworkOpener.cpp index 62f4b76..24fbc03 100644 --- a/src/NukiNetworkOpener.cpp +++ b/src/NukiNetworkOpener.cpp @@ -133,6 +133,11 @@ void NukiNetworkOpener::onMqttDataReceived(const char* topic, byte* payload, con { char* value = (char*)payload; + if(_network->mqttRecentlyConnected() && _network->pathEquals(_mqttPath, mqtt_topic_lock_action, topic)) + { + Log->println("MQTT recently connected, ignoring opener action."); + } + if(comparePrefixedPath(topic, mqtt_topic_lock_log_rolling_last)) { if(strcmp(value, "") == 0 ||