diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 6b3dc84..38deea6 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -382,6 +382,11 @@ void NetworkOpener::publishRssi(const int &rssi) publishInt(mqtt_topic_lock_rssi, rssi); } +void NetworkOpener::publishRetry(const std::string& message) +{ + publishString(mqtt_topic_lock_retry, message.c_str()); +} + void NetworkOpener::publishBleAddress(const std::string &address) { publishString(mqtt_topic_lock_address, address.c_str()); diff --git a/NetworkOpener.h b/NetworkOpener.h index eb52a22..489de0d 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -29,6 +29,7 @@ public: void publishConfig(const NukiOpener::Config& config); void publishAdvancedConfig(const NukiOpener::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/NukiOpenerWrapper.cpp b/NukiOpenerWrapper.cpp index aa4025d..0e074c7 100644 --- a/NukiOpenerWrapper.cpp +++ b/NukiOpenerWrapper.cpp @@ -43,6 +43,8 @@ void NukiOpenerWrapper::initialize() _publishAuthData = _preferences->getBool(preference_publish_authdata); _restartBeaconTimeout = _preferences->getInt(preference_restart_ble_beacon_lost); _hassEnabled = _preferences->getString(preference_mqtt_hass_discovery) != ""; + _nrOfRetries = _preferences->getInt(preference_command_nr_of_retries); + _retryDelay = _preferences->getInt(preference_command_retry_delay); if(_intervalLockstate == 0) { @@ -142,22 +144,53 @@ void NukiOpenerWrapper::update() } } - if(_nextLockAction != (NukiOpener::LockAction)0xff) + if(_nextLockAction != (NukiOpener::LockAction)0xff && ts > _nextRetryTs) { - NukiOpener::CmdResult cmdResult = _nukiOpener.lockAction(_nextLockAction, 0, 0); + Nuki::CmdResult cmdResult = _nukiOpener.lockAction(_nextLockAction, 0, 0); char resultStr[15] = {0}; NukiOpener::cmdResultToString(cmdResult, resultStr); _network->publishCommandResult(resultStr); - Log->print(F("Opener lock action result: ")); + Log->print(F("Lock action result: ")); Log->println(resultStr); - _nextLockAction = (NukiOpener::LockAction)0xff; - if(_intervalLockstate > 10) + if(cmdResult == Nuki::CmdResult::Success) { - _nextLockStateUpdateTs = ts + 10 * 1000; + _retryCount = 0; + _nextLockAction = (NukiOpener::LockAction) 0xff; + _network->publishRetry("--"); + if (_intervalLockstate > 10) + { + _nextLockStateUpdateTs = ts + 10 * 1000; + } + } + else + { + if(_retryCount < _nrOfRetries) + { + Log->print(F("Opener: 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)); + + _nextRetryTs = millis() + _retryDelay; + + ++_retryCount; + } + else + { + Log->println(F("Opener: Maximum number of retries exceeded, aborting.")); + _network->publishRetry("failed"); + _retryCount = 0; + _nextRetryTs = 0; + _nextLockAction = (NukiOpener::LockAction) 0xff; + } } } diff --git a/NukiOpenerWrapper.h b/NukiOpenerWrapper.h index 434f0b1..59f216a 100644 --- a/NukiOpenerWrapper.h +++ b/NukiOpenerWrapper.h @@ -57,6 +57,10 @@ private: int _restartBeaconTimeout = 0; // seconds bool _publishAuthData = false; bool _clearAuthData = false; + int _nrOfRetries = 0; + int _retryDelay = 0; + int _retryCount = 0; + unsigned long _nextRetryTs = 0; NukiOpener::OpenerState _lastKeyTurnerState; NukiOpener::OpenerState _keyTurnerState; diff --git a/NukiWrapper.cpp b/NukiWrapper.cpp index 00b66b3..02ade66 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -202,7 +202,7 @@ void NukiWrapper::update() { if(_retryCount < _nrOfRetries) { - Log->print(F("Last command failed, retrying after ")); + Log->print(F("Lock: Last command failed, retrying after ")); Log->print(_retryDelay); Log->print(F(" milliseconds. Retry ")); Log->print(_retryCount + 1); @@ -217,7 +217,7 @@ void NukiWrapper::update() } else { - Log->println(F("Maximum number of retries exceeded, aborting.")); + Log->println(F("Lock: Maximum number of retries exceeded, aborting.")); _network->publishRetry("failed"); _retryCount = 0; _nextRetryTs = 0; diff --git a/Version.h b/Version.h index d7cd96c..9c9efe4 100644 --- a/Version.h +++ b/Version.h @@ -1,3 +1,3 @@ #pragma once -#define nuki_hub_version "6.10-retry-3" \ No newline at end of file +#define nuki_hub_version "6.11" \ No newline at end of file