diff --git a/Config.h b/Config.h index b98de92..2919bbc 100644 --- a/Config.h +++ b/Config.h @@ -1,4 +1,4 @@ #pragma once -#define MQTT_QOS_LEVEL 0 -#define MQTT_CLEAN_SESSIONS true \ No newline at end of file +#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 9a3a64c..3598d6d 100644 --- a/Network.cpp +++ b/Network.cpp @@ -237,7 +237,7 @@ int Network::update() bool Network::reconnect() { - _mqttConnected = false; + _mqttConnectionState = 0; int port = _preferences->getInt(preference_mqtt_broker_port); while (!_device->mqttClient()->connected() && millis() > _nextReconnect) @@ -260,7 +260,7 @@ bool Network::reconnect() if (success) { Log->println(F("MQTT connected")); - _mqttConnected = true; + _mqttConnectionState = 1; delay(100); _device->mqttClient()->onMessage(Network::onMqttDataReceivedCallback); for(const String& topic : _subscribedTopics) @@ -277,6 +277,12 @@ bool Network::reconnect() _device->mqttClient()->endMessage(); } } + for(int i=0; i<10; i++) + { + _device->mqttClient()->poll(); + delay(100); + } + _mqttConnectionState = 2; } else { @@ -284,11 +290,11 @@ bool Network::reconnect() Log->println(_device->mqttClient()->connectError()); _device->printError(); _device->mqttClient()->stop(); - _mqttConnected = false; + _mqttConnectionState = 0; _nextReconnect = millis() + 5000; } } - return _mqttConnected; + return _mqttConnectionState > 0; } void Network::subscribe(const char* prefix, const char *path) @@ -382,9 +388,9 @@ void Network::disableAutoRestarts() _restartOnDisconnect = false; } -bool Network::isMqttConnected() +int Network::mqttConnectionState() { - return _mqttConnected; + return _mqttConnectionState; } diff --git a/Network.h b/Network.h index 8785cf7..953094b 100644 --- a/Network.h +++ b/Network.h @@ -44,7 +44,7 @@ public: void publishPresenceDetection(char* csv); MqttClient* mqttClient(); - bool isMqttConnected(); + int mqttConnectionState(); // 0 = not connected; 1 = connected; 2 = connected and mqtt processed const NetworkDeviceType networkDeviceType(); @@ -60,7 +60,7 @@ private: Preferences* _preferences; String _hostname; NetworkDevice* _device = nullptr; - bool _mqttConnected = false; + int _mqttConnectionState = 0; unsigned long _nextReconnect = 0; char _mqttBrokerAddr[101] = {0}; diff --git a/NetworkLock.cpp b/NetworkLock.cpp index 3c61cba..d9a4109 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -81,14 +81,16 @@ void NetworkLock::onMqttDataReceived(const char* topic, byte* payload, const uns value[i] = payload[i]; } - if(comparePrefixedPath(topic, mqtt_topic_reset) && strcmp(value, "1") == 0) + bool processActions = _network->mqttConnectionState() >= 2; + + if(processActions && comparePrefixedPath(topic, mqtt_topic_reset) && strcmp(value, "1") == 0) { Log->println(F("Restart requested via MQTT.")); delay(200); ESP.restart(); } - if(comparePrefixedPath(topic, mqtt_topic_lock_action)) + if(processActions && comparePrefixedPath(topic, mqtt_topic_lock_action)) { if(strcmp(value, "") == 0 || strcmp(value, "--") == 0 || strcmp(value, "ack") == 0 || strcmp(value, "unknown_action") == 0) return; @@ -102,7 +104,7 @@ void NetworkLock::onMqttDataReceived(const char* topic, byte* payload, const uns publishString(mqtt_topic_lock_action, success ? "ack" : "unknown_action"); } - if(comparePrefixedPath(topic, mqtt_topic_keypad_command_action)) + if(processActions && comparePrefixedPath(topic, mqtt_topic_keypad_command_action)) { if(_keypadCommandReceivedReceivedCallback != nullptr) { diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 3000ea6..534fc71 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -67,7 +67,9 @@ void NetworkOpener::onMqttDataReceived(const char* topic, byte* payload, const u value[i] = payload[i]; } - if(comparePrefixedPath(topic, mqtt_topic_lock_action)) + bool processActions = _network->mqttConnectionState() >= 2; + + if(processActions && comparePrefixedPath(topic, mqtt_topic_lock_action)) { if(strcmp(value, "") == 0 || strcmp(value, "--") == 0 || strcmp(value, "ack") == 0 || strcmp(value, "unknown_action") == 0) return; diff --git a/NukiOpenerWrapper.cpp b/NukiOpenerWrapper.cpp index 3b29e26..75908c4 100644 --- a/NukiOpenerWrapper.cpp +++ b/NukiOpenerWrapper.cpp @@ -133,6 +133,7 @@ void NukiOpenerWrapper::update() setupHASS(); } } + if(_rssiPublishInterval > 0 && (_nextRssiTs == 0 || ts > _nextRssiTs)) { _nextRssiTs = ts + _rssiPublishInterval; diff --git a/NukiOpenerWrapper.h b/NukiOpenerWrapper.h index ed2c4ac..152d9cf 100644 --- a/NukiOpenerWrapper.h +++ b/NukiOpenerWrapper.h @@ -77,7 +77,7 @@ private: bool _paired = false; bool _statusUpdated = false; - unsigned long _rssiPublishInterval = 0; + long _rssiPublishInterval = 0; unsigned long _nextLockStateUpdateTs = 0; unsigned long _nextBatteryReportTs = 0; unsigned long _nextConfigUpdateTs = 0; diff --git a/WebCfgServer.cpp b/WebCfgServer.cpp index e168fa5..554e289 100644 --- a/WebCfgServer.cpp +++ b/WebCfgServer.cpp @@ -460,7 +460,7 @@ void WebCfgServer::buildHtml(String& response) response.concat("