diff --git a/MqttTopics.h b/MqttTopics.h index 2b09c82..998222a 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -21,6 +21,7 @@ #define mqtt_topic_lock_action "/lock/action" #define mqtt_topic_lock_rssi "/lock/rssi" #define mqtt_topic_lock_address "/lock/address" +#define mqtt_topic_lock_retry "/lock/retry" #define mqtt_topic_config_button_enabled "/configuration/buttonEnabled" #define mqtt_topic_config_led_enabled "/configuration/ledEnabled" diff --git a/NetworkLock.cpp b/NetworkLock.cpp index e683e77..4a6e996 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -388,6 +388,11 @@ void NetworkLock::publishRssi(const int& rssi) publishInt(mqtt_topic_lock_rssi, rssi); } +void NetworkLock::publishRetry(const std::string& message) +{ + publishString(mqtt_topic_lock_retry, message.c_str()); +} + void NetworkLock::publishBleAddress(const std::string &address) { publishString(mqtt_topic_lock_address, address.c_str()); diff --git a/NetworkLock.h b/NetworkLock.h index b313b30..ca07013 100644 --- a/NetworkLock.h +++ b/NetworkLock.h @@ -28,6 +28,7 @@ public: void publishConfig(const NukiLock::Config& config); void publishAdvancedConfig(const NukiLock::AdvancedConfig& config); void publishRssi(const int& rssi); + void publishRetry(const std::string& message); void publishBleAddress(const std::string& address); void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); void removeHASSConfig(char* uidString); diff --git a/NukiWrapper.cpp b/NukiWrapper.cpp index 0ce774c..99c46ff 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -185,6 +185,7 @@ void NukiWrapper::update() if(cmdResult == Nuki::CmdResult::Success) { + _retryCount = 0; _nextLockAction = (NukiLock::LockAction) 0xff; if (_intervalLockstate > 10) { @@ -193,27 +194,28 @@ void NukiWrapper::update() } else { - if(_retryCount == -1) + if(_retryCount < _nrOfRetries) { - _retryCount = _nrOfRetries; + Log->print(F("Last command failed, retrying after ")); + Log->print(_retryDelay); + Log->print(F(" milliseconds. Retry ")); + Log->print(_retryCount + 1); + Log->print(" of "); + Log->println(_nrOfRetries); + + _network->publishRetry(std::to_string(_retryCount + 1)); + + _nextLockStateUpdateTs = millis() + _retryDelay; + + ++_retryCount; } - else if(_retryCount == 0) + else { + Log->println(F("Maximum number of retries exceeded, aborting.")); + _network->publishRetry("failed"); + _retryCount = 0; _nextLockAction = (NukiLock::LockAction) 0xff; - _retryCount = -1; - if (_intervalLockstate > 10) - { - _nextLockStateUpdateTs = ts + 10 * 1000; - } - return; } - - Log->print(F("Last command failed, retrying after ")); - Log->print(_retryDelay); - Log->print(F(" milliseconds.")); - - --_retryCount; - _nextLockStateUpdateTs = millis() + _retryDelay; } } diff --git a/NukiWrapper.h b/NukiWrapper.h index ef054b5..f343252 100644 --- a/NukiWrapper.h +++ b/NukiWrapper.h @@ -86,7 +86,7 @@ private: uint _maxKeypadCodeCount = 0; int _nrOfRetries = 0; int _retryDelay = 0; - int _retryCount = -1; + int _retryCount = 0; unsigned long _nextLockStateUpdateTs = 0; unsigned long _nextBatteryReportTs = 0; unsigned long _nextConfigUpdateTs = 0; diff --git a/Version.h b/Version.h index 807b224..222ae51 100644 --- a/Version.h +++ b/Version.h @@ -1,3 +1,3 @@ #pragma once -#define nuki_hub_version "6.10-retry-1" \ No newline at end of file +#define nuki_hub_version "6.10-retry-2" \ No newline at end of file