implement retry mechanic for opener
This commit is contained in:
@@ -382,6 +382,11 @@ void NetworkOpener::publishRssi(const int &rssi)
|
|||||||
publishInt(mqtt_topic_lock_rssi, 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)
|
void NetworkOpener::publishBleAddress(const std::string &address)
|
||||||
{
|
{
|
||||||
publishString(mqtt_topic_lock_address, address.c_str());
|
publishString(mqtt_topic_lock_address, address.c_str());
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ public:
|
|||||||
void publishConfig(const NukiOpener::Config& config);
|
void publishConfig(const NukiOpener::Config& config);
|
||||||
void publishAdvancedConfig(const NukiOpener::AdvancedConfig& config);
|
void publishAdvancedConfig(const NukiOpener::AdvancedConfig& config);
|
||||||
void publishRssi(const int& rssi);
|
void publishRssi(const int& rssi);
|
||||||
|
void publishRetry(const std::string& message);
|
||||||
void publishBleAddress(const std::string& address);
|
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 publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState);
|
||||||
void removeHASSConfig(char* uidString);
|
void removeHASSConfig(char* uidString);
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ void NukiOpenerWrapper::initialize()
|
|||||||
_publishAuthData = _preferences->getBool(preference_publish_authdata);
|
_publishAuthData = _preferences->getBool(preference_publish_authdata);
|
||||||
_restartBeaconTimeout = _preferences->getInt(preference_restart_ble_beacon_lost);
|
_restartBeaconTimeout = _preferences->getInt(preference_restart_ble_beacon_lost);
|
||||||
_hassEnabled = _preferences->getString(preference_mqtt_hass_discovery) != "";
|
_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)
|
if(_intervalLockstate == 0)
|
||||||
{
|
{
|
||||||
@@ -142,24 +144,55 @@ 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};
|
char resultStr[15] = {0};
|
||||||
NukiOpener::cmdResultToString(cmdResult, resultStr);
|
NukiOpener::cmdResultToString(cmdResult, resultStr);
|
||||||
|
|
||||||
_network->publishCommandResult(resultStr);
|
_network->publishCommandResult(resultStr);
|
||||||
|
|
||||||
Log->print(F("Opener lock action result: "));
|
Log->print(F("Lock action result: "));
|
||||||
Log->println(resultStr);
|
Log->println(resultStr);
|
||||||
|
|
||||||
_nextLockAction = (NukiOpener::LockAction)0xff;
|
if(cmdResult == Nuki::CmdResult::Success)
|
||||||
if(_intervalLockstate > 10)
|
{
|
||||||
|
_retryCount = 0;
|
||||||
|
_nextLockAction = (NukiOpener::LockAction) 0xff;
|
||||||
|
_network->publishRetry("--");
|
||||||
|
if (_intervalLockstate > 10)
|
||||||
{
|
{
|
||||||
_nextLockStateUpdateTs = ts + 10 * 1000;
|
_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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(_clearAuthData)
|
if(_clearAuthData)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -57,6 +57,10 @@ private:
|
|||||||
int _restartBeaconTimeout = 0; // seconds
|
int _restartBeaconTimeout = 0; // seconds
|
||||||
bool _publishAuthData = false;
|
bool _publishAuthData = false;
|
||||||
bool _clearAuthData = false;
|
bool _clearAuthData = false;
|
||||||
|
int _nrOfRetries = 0;
|
||||||
|
int _retryDelay = 0;
|
||||||
|
int _retryCount = 0;
|
||||||
|
unsigned long _nextRetryTs = 0;
|
||||||
|
|
||||||
NukiOpener::OpenerState _lastKeyTurnerState;
|
NukiOpener::OpenerState _lastKeyTurnerState;
|
||||||
NukiOpener::OpenerState _keyTurnerState;
|
NukiOpener::OpenerState _keyTurnerState;
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ void NukiWrapper::update()
|
|||||||
{
|
{
|
||||||
if(_retryCount < _nrOfRetries)
|
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(_retryDelay);
|
||||||
Log->print(F(" milliseconds. Retry "));
|
Log->print(F(" milliseconds. Retry "));
|
||||||
Log->print(_retryCount + 1);
|
Log->print(_retryCount + 1);
|
||||||
@@ -217,7 +217,7 @@ void NukiWrapper::update()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log->println(F("Maximum number of retries exceeded, aborting."));
|
Log->println(F("Lock: Maximum number of retries exceeded, aborting."));
|
||||||
_network->publishRetry("failed");
|
_network->publishRetry("failed");
|
||||||
_retryCount = 0;
|
_retryCount = 0;
|
||||||
_nextRetryTs = 0;
|
_nextRetryTs = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user