Improve Nuki device config read functions (#442)
This commit is contained in:
@@ -211,7 +211,7 @@ void NukiOpenerWrapper::update()
|
||||
_waitTimeControlUpdateTs = 0;
|
||||
updateTimeControl(true);
|
||||
}
|
||||
if(_hassEnabled && _configRead && _network->reconnected())
|
||||
if(_hassEnabled && _nukiConfigValid && _nukiAdvancedConfigValid && _network->reconnected())
|
||||
{
|
||||
setupHASS();
|
||||
}
|
||||
@@ -360,7 +360,7 @@ void NukiOpenerWrapper::updateKeyTurnerState()
|
||||
{
|
||||
Log->print(F("Querying opener state: "));
|
||||
result =_nukiOpener.requestOpenerState(&_keyTurnerState);
|
||||
|
||||
|
||||
if(result != Nuki::CmdResult::Success) {
|
||||
++_retryCount;
|
||||
}
|
||||
@@ -453,15 +453,21 @@ void NukiOpenerWrapper::updateBatteryState()
|
||||
|
||||
void NukiOpenerWrapper::updateConfig()
|
||||
{
|
||||
readConfig();
|
||||
readAdvancedConfig();
|
||||
_configRead = true;
|
||||
bool expectedConfig = true;
|
||||
|
||||
readConfig();
|
||||
|
||||
if(_nukiConfigValid)
|
||||
{
|
||||
if(_preferences->getUInt(preference_nuki_id_opener, 0) == 0 || _retryConfigCount == 10)
|
||||
if(_preferences->getUInt(preference_nuki_id_opener, 0) == 0 || _retryConfigCount == 10)
|
||||
{
|
||||
char uidString[20];
|
||||
itoa(_nukiConfig.nukiId, uidString, 16);
|
||||
Log->print(F("Saving Opener Nuki ID to preferences ("));
|
||||
Log->print(_nukiConfig.nukiId);
|
||||
Log->print(" / ");
|
||||
Log->print(uidString);
|
||||
Log->println(")");
|
||||
_preferences->putUInt(preference_nuki_id_opener, _nukiConfig.nukiId);
|
||||
}
|
||||
|
||||
@@ -471,8 +477,6 @@ void NukiOpenerWrapper::updateConfig()
|
||||
_firmwareVersion = std::to_string(_nukiConfig.firmwareVersion[0]) + "." + std::to_string(_nukiConfig.firmwareVersion[1]) + "." + std::to_string(_nukiConfig.firmwareVersion[2]);
|
||||
_hardwareVersion = std::to_string(_nukiConfig.hardwareRevision[0]) + "." + std::to_string(_nukiConfig.hardwareRevision[1]);
|
||||
if(_preferences->getBool(preference_conf_info_enabled, true)) _network->publishConfig(_nukiConfig);
|
||||
_retryConfigCount = 0;
|
||||
|
||||
if(_preferences->getBool(preference_timecontrol_info_enabled)) updateTimeControl(false);
|
||||
|
||||
const int pinStatus = _preferences->getInt(preference_opener_pin_status, 4);
|
||||
@@ -480,11 +484,12 @@ void NukiOpenerWrapper::updateConfig()
|
||||
if(isPinSet()) {
|
||||
Nuki::CmdResult result = (Nuki::CmdResult)-1;
|
||||
_retryCount = 0;
|
||||
Log->println(F("Nuki opener PIN is set"));
|
||||
|
||||
while(_retryCount < _nrOfRetries + 1)
|
||||
{
|
||||
result = _nukiOpener.verifySecurityPin();
|
||||
|
||||
|
||||
if(result != Nuki::CmdResult::Success) {
|
||||
++_retryCount;
|
||||
}
|
||||
@@ -493,12 +498,14 @@ void NukiOpenerWrapper::updateConfig()
|
||||
|
||||
if(result != Nuki::CmdResult::Success)
|
||||
{
|
||||
Log->println(F("Nuki opener PIN is invalid"));
|
||||
if(pinStatus != 2) {
|
||||
_preferences->putInt(preference_opener_pin_status, 2);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log->println(F("Nuki opener PIN is valid"));
|
||||
if(pinStatus != 1) {
|
||||
_preferences->putInt(preference_opener_pin_status, 1);
|
||||
}
|
||||
@@ -506,6 +513,7 @@ void NukiOpenerWrapper::updateConfig()
|
||||
}
|
||||
else
|
||||
{
|
||||
Log->println(F("Nuki opener PIN is not set"));
|
||||
if(pinStatus != 0) {
|
||||
_preferences->putInt(preference_opener_pin_status, 0);
|
||||
}
|
||||
@@ -513,29 +521,42 @@ void NukiOpenerWrapper::updateConfig()
|
||||
}
|
||||
else
|
||||
{
|
||||
Log->println(F("Invalid/Unexpected opener config recieved, ID does not matched saved ID"));
|
||||
expectedConfig = false;
|
||||
++_retryConfigCount;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log->println(F("Invalid/Unexpected opener config recieved, Config is not valid"));
|
||||
expectedConfig = false;
|
||||
++_retryConfigCount;
|
||||
}
|
||||
if(_nukiAdvancedConfigValid && _preferences->getUInt(preference_nuki_id_opener, 0) == _nukiConfig.nukiId)
|
||||
|
||||
if(expectedConfig)
|
||||
{
|
||||
readAdvancedConfig();
|
||||
|
||||
if(_nukiAdvancedConfigValid)
|
||||
{
|
||||
if(_preferences->getBool(preference_conf_info_enabled, true)) _network->publishAdvancedConfig(_nukiAdvancedConfig);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log->println(F("Invalid/Unexpected opener advanced config recieved, Advanced config is not valid"));
|
||||
expectedConfig = false;
|
||||
}
|
||||
}
|
||||
|
||||
if(expectedConfig && _nukiConfigValid && _nukiAdvancedConfigValid)
|
||||
{
|
||||
if(_preferences->getBool(preference_conf_info_enabled, true)) _network->publishAdvancedConfig(_nukiAdvancedConfig);
|
||||
_retryConfigCount = 0;
|
||||
Log->println(F("Done retrieving opener config and advanced config"));
|
||||
}
|
||||
else
|
||||
{
|
||||
expectedConfig = false;
|
||||
++_retryConfigCount;
|
||||
}
|
||||
if(!expectedConfig && _retryConfigCount < 11)
|
||||
{
|
||||
Log->println(F("Invalid/Unexpected opener config and/or advanced config recieved, retrying in 10 seconds"));
|
||||
int64_t ts = (esp_timer_get_time() / 1000);
|
||||
_nextConfigUpdateTs = ts + 60000;
|
||||
_nextConfigUpdateTs = ts + 10000;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -556,7 +577,7 @@ void NukiOpenerWrapper::updateAuthData(bool retrieved)
|
||||
{
|
||||
Log->print(F("Retrieve log entries: "));
|
||||
result = _nukiOpener.retrieveLogEntries(0, _preferences->getInt(preference_authlog_max_entries, MAX_AUTHLOG), 1, false);
|
||||
|
||||
|
||||
if(result != Nuki::CmdResult::Success) {
|
||||
++_retryCount;
|
||||
}
|
||||
@@ -629,7 +650,7 @@ void NukiOpenerWrapper::updateKeypad(bool retrieved)
|
||||
{
|
||||
Log->print(F("Querying opener keypad: "));
|
||||
result = _nukiOpener.retrieveKeypadEntries(0, _preferences->getInt(preference_keypad_max_entries, MAX_KEYPAD));
|
||||
|
||||
|
||||
if(result != Nuki::CmdResult::Success) {
|
||||
++_retryCount;
|
||||
}
|
||||
@@ -696,7 +717,7 @@ void NukiOpenerWrapper::updateTimeControl(bool retrieved)
|
||||
{
|
||||
Log->print(F("Querying opener time control: "));
|
||||
result = _nukiOpener.retrieveTimeControlEntries();
|
||||
|
||||
|
||||
if(result != Nuki::CmdResult::Success) {
|
||||
++_retryCount;
|
||||
}
|
||||
@@ -940,7 +961,7 @@ void NukiOpenerWrapper::onConfigUpdateReceived(const char *value)
|
||||
JsonDocument jsonResult;
|
||||
char _resbuf[2048];
|
||||
|
||||
if(!_configRead || !_nukiConfigValid)
|
||||
if(!_nukiConfigValid)
|
||||
{
|
||||
jsonResult["general"] = "configNotReady";
|
||||
serializeJson(jsonResult, _resbuf, sizeof(_resbuf));
|
||||
@@ -1488,7 +1509,7 @@ void NukiOpenerWrapper::onKeypadCommandReceived(const char *command, const uint
|
||||
|
||||
if(!_hasKeypad)
|
||||
{
|
||||
if(_configRead)
|
||||
if(_nukiConfigValid)
|
||||
{
|
||||
_network->publishKeypadCommandResult("KeypadNotAvailable");
|
||||
}
|
||||
@@ -1624,7 +1645,7 @@ void NukiOpenerWrapper::onKeypadJsonCommandReceived(const char *value)
|
||||
|
||||
if(!_hasKeypad)
|
||||
{
|
||||
if(_configRead && _nukiConfigValid)
|
||||
if(_nukiConfigValid)
|
||||
{
|
||||
_network->publishKeypadJsonCommandResult("keypadNotAvailable");
|
||||
return;
|
||||
@@ -2064,7 +2085,7 @@ void NukiOpenerWrapper::onKeypadJsonCommandReceived(const char *value)
|
||||
|
||||
void NukiOpenerWrapper::onTimeControlCommandReceived(const char *value)
|
||||
{
|
||||
if(!_configRead || !_nukiConfigValid)
|
||||
if(!_nukiConfigValid)
|
||||
{
|
||||
_network->publishTimeControlCommandResult("configNotReady");
|
||||
return;
|
||||
@@ -2388,30 +2409,9 @@ void NukiOpenerWrapper::setupHASS()
|
||||
|
||||
void NukiOpenerWrapper::disableHASS()
|
||||
{
|
||||
if(!_nukiConfigValid) // only ask for config once to save battery life
|
||||
{
|
||||
Nuki::CmdResult result = (Nuki::CmdResult)-1;
|
||||
_retryCount = 0;
|
||||
|
||||
while(_retryCount < _nrOfRetries + 1)
|
||||
{
|
||||
result = _nukiOpener.requestConfig(&_nukiConfig);
|
||||
_nukiConfigValid = result == Nuki::CmdResult::Success;
|
||||
|
||||
if(!_nukiConfigValid) {
|
||||
++_retryCount;
|
||||
}
|
||||
else break;
|
||||
}
|
||||
}
|
||||
|
||||
if(_nukiConfigValid)
|
||||
{
|
||||
char uidString[20];
|
||||
itoa(_nukiConfig.nukiId, uidString, 16);
|
||||
_network->removeHASSConfig(uidString);
|
||||
}
|
||||
else Log->println(F("Unable to disable HASS. Invalid config received."));
|
||||
char uidString[20];
|
||||
itoa(_preferences->getUInt(preference_nuki_id_opener, 0), uidString, 16);
|
||||
_network->removeHASSConfig(uidString);
|
||||
}
|
||||
|
||||
void NukiOpenerWrapper::printCommandResult(Nuki::CmdResult result)
|
||||
|
||||
@@ -128,7 +128,6 @@ private:
|
||||
bool _keypadEnabled = false;
|
||||
uint _maxKeypadCodeCount = 0;
|
||||
uint _maxTimeControlEntryCount = 0;
|
||||
bool _configRead = false;
|
||||
int _rssiPublishInterval = 0;
|
||||
int64_t _nextLockStateUpdateTs = 0;
|
||||
int64_t _nextBatteryReportTs = 0;
|
||||
|
||||
@@ -342,7 +342,7 @@ void NukiWrapper::update()
|
||||
_waitTimeControlUpdateTs = 0;
|
||||
updateTimeControl(true);
|
||||
}
|
||||
if(_hassEnabled && _configRead && _network->reconnected())
|
||||
if(_hassEnabled && _nukiConfigValid && _nukiAdvancedConfigValid && _network->reconnected())
|
||||
{
|
||||
setupHASS();
|
||||
}
|
||||
@@ -467,7 +467,7 @@ void NukiWrapper::updateKeyTurnerState()
|
||||
}
|
||||
|
||||
_retryLockstateCount = 0;
|
||||
|
||||
|
||||
const NukiLock::LockState& lockState = _keyTurnerState.lockState;
|
||||
|
||||
if(lockState != _lastKeyTurnerState.lockState) _statusUpdatedTs = esp_timer_get_time() / 1000;
|
||||
@@ -489,10 +489,10 @@ void NukiWrapper::updateKeyTurnerState()
|
||||
}
|
||||
else if(!_network->_offConnected && (esp_timer_get_time() / 1000) < _statusUpdatedTs + 10000)
|
||||
{
|
||||
_statusUpdated = true;
|
||||
_statusUpdated = true;
|
||||
Log->println(F("Lock: Keep updating status on intermediate lock state"));
|
||||
}
|
||||
|
||||
|
||||
_network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState);
|
||||
|
||||
char lockStateStr[20];
|
||||
@@ -516,7 +516,7 @@ void NukiWrapper::updateBatteryState()
|
||||
Log->print(_retryCount + 1);
|
||||
Log->print("): ");
|
||||
result = _nukiLock.requestBatteryReport(&_batteryReport);
|
||||
|
||||
|
||||
if(result != Nuki::CmdResult::Success) {
|
||||
++_retryCount;
|
||||
}
|
||||
@@ -534,18 +534,17 @@ void NukiWrapper::updateBatteryState()
|
||||
|
||||
void NukiWrapper::updateConfig()
|
||||
{
|
||||
readConfig();
|
||||
readAdvancedConfig();
|
||||
_configRead = true;
|
||||
bool expectedConfig = true;
|
||||
|
||||
readConfig();
|
||||
|
||||
if(_nukiConfigValid)
|
||||
{
|
||||
if(_preferences->getUInt(preference_nuki_id_lock, 0) == 0 || _retryConfigCount == 10)
|
||||
{
|
||||
char uidString[20];
|
||||
itoa(_nukiConfig.nukiId, uidString, 16);
|
||||
Log->print(F("Saving Nuki ID to preferences ("));
|
||||
Log->print(F("Saving Lock Nuki ID to preferences ("));
|
||||
Log->print(_nukiConfig.nukiId);
|
||||
Log->print(" / ");
|
||||
Log->print(uidString);
|
||||
@@ -559,8 +558,6 @@ void NukiWrapper::updateConfig()
|
||||
_firmwareVersion = std::to_string(_nukiConfig.firmwareVersion[0]) + "." + std::to_string(_nukiConfig.firmwareVersion[1]) + "." + std::to_string(_nukiConfig.firmwareVersion[2]);
|
||||
_hardwareVersion = std::to_string(_nukiConfig.hardwareRevision[0]) + "." + std::to_string(_nukiConfig.hardwareRevision[1]);
|
||||
if(_preferences->getBool(preference_conf_info_enabled, true)) _network->publishConfig(_nukiConfig);
|
||||
_retryConfigCount = 0;
|
||||
|
||||
if(_preferences->getBool(preference_timecontrol_info_enabled)) updateTimeControl(false);
|
||||
|
||||
const int pinStatus = _preferences->getInt(preference_lock_pin_status, 4);
|
||||
@@ -605,32 +602,42 @@ void NukiWrapper::updateConfig()
|
||||
}
|
||||
else
|
||||
{
|
||||
Log->println(F("Invalid/Unexpected config recieved, retrying"));
|
||||
Log->println(F("Invalid/Unexpected lock config recieved, ID does not matched saved ID"));
|
||||
expectedConfig = false;
|
||||
++_retryConfigCount;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Log->println(F("Invalid/Unexpected config recieved, retrying"));
|
||||
Log->println(F("Invalid/Unexpected lock config recieved, Config is not valid"));
|
||||
expectedConfig = false;
|
||||
++_retryConfigCount;
|
||||
}
|
||||
if(_nukiAdvancedConfigValid && _preferences->getUInt(preference_nuki_id_lock, 0) == _nukiConfig.nukiId)
|
||||
|
||||
if(expectedConfig)
|
||||
{
|
||||
readAdvancedConfig();
|
||||
|
||||
if(_nukiAdvancedConfigValid)
|
||||
{
|
||||
if(_preferences->getBool(preference_conf_info_enabled, true)) _network->publishAdvancedConfig(_nukiAdvancedConfig);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log->println(F("Invalid/Unexpected lock advanced config recieved, Advanced config is not valid"));
|
||||
expectedConfig = false;
|
||||
}
|
||||
}
|
||||
|
||||
if(expectedConfig && _nukiConfigValid && _nukiAdvancedConfigValid)
|
||||
{
|
||||
if(_preferences->getBool(preference_conf_info_enabled, true)) _network->publishAdvancedConfig(_nukiAdvancedConfig);
|
||||
_retryConfigCount = 0;
|
||||
Log->println(F("Done retrieving lock config and advanced config"));
|
||||
}
|
||||
else
|
||||
{
|
||||
Log->println(F("Invalid/Unexpected advanced config recieved, retrying"));
|
||||
expectedConfig = false;
|
||||
++_retryConfigCount;
|
||||
}
|
||||
if(!expectedConfig && _retryConfigCount < 11)
|
||||
{
|
||||
Log->println(F("Invalid/Unexpected lock config and/or advanced config recieved, retrying in 10 seconds"));
|
||||
int64_t ts = (esp_timer_get_time() / 1000);
|
||||
_nextConfigUpdateTs = ts + 60000;
|
||||
_nextConfigUpdateTs = ts + 10000;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1158,7 +1165,7 @@ void NukiWrapper::onConfigUpdateReceived(const char *value)
|
||||
JsonDocument jsonResult;
|
||||
char _resbuf[2048];
|
||||
|
||||
if(!_configRead || !_nukiConfigValid)
|
||||
if(!_nukiConfigValid)
|
||||
{
|
||||
jsonResult["general"] = "configNotReady";
|
||||
serializeJson(jsonResult, _resbuf, sizeof(_resbuf));
|
||||
@@ -1791,7 +1798,7 @@ void NukiWrapper::onKeypadCommandReceived(const char *command, const uint &id, c
|
||||
|
||||
if(!_hasKeypad)
|
||||
{
|
||||
if(_configRead)
|
||||
if(_nukiConfigValid)
|
||||
{
|
||||
_network->publishKeypadCommandResult("KeypadNotAvailable");
|
||||
}
|
||||
@@ -1927,7 +1934,7 @@ void NukiWrapper::onKeypadJsonCommandReceived(const char *value)
|
||||
|
||||
if(!_hasKeypad)
|
||||
{
|
||||
if(_configRead && _nukiConfigValid)
|
||||
if(_nukiConfigValid)
|
||||
{
|
||||
_network->publishKeypadJsonCommandResult("keypadNotAvailable");
|
||||
return;
|
||||
@@ -2367,7 +2374,7 @@ void NukiWrapper::onKeypadJsonCommandReceived(const char *value)
|
||||
|
||||
void NukiWrapper::onTimeControlCommandReceived(const char *value)
|
||||
{
|
||||
if(!_configRead || !_nukiConfigValid)
|
||||
if(!_nukiConfigValid)
|
||||
{
|
||||
_network->publishTimeControlCommandResult("configNotReady");
|
||||
return;
|
||||
@@ -2641,17 +2648,18 @@ void NukiWrapper::readConfig()
|
||||
result = _nukiLock.requestConfig(&_nukiConfig);
|
||||
_nukiConfigValid = result == Nuki::CmdResult::Success;
|
||||
|
||||
if(!_nukiConfigValid) {
|
||||
char resultStr[20];
|
||||
NukiLock::cmdResultToString(result, resultStr);
|
||||
Log->print(F("Lock config result: "));
|
||||
Log->println(resultStr);
|
||||
|
||||
if(result != Nuki::CmdResult::Success) {
|
||||
++_retryCount;
|
||||
Log->println("Retrying in 1s");
|
||||
Log->println("Failed to retrieve lock config, retrying in 1s");
|
||||
delay(1000);
|
||||
}
|
||||
else break;
|
||||
}
|
||||
|
||||
char resultStr[20];
|
||||
NukiLock::cmdResultToString(result, resultStr);
|
||||
Log->print(F("Lock config result: "));
|
||||
Log->println(resultStr);
|
||||
}
|
||||
|
||||
void NukiWrapper::readAdvancedConfig()
|
||||
@@ -2664,16 +2672,18 @@ void NukiWrapper::readAdvancedConfig()
|
||||
result = _nukiLock.requestAdvancedConfig(&_nukiAdvancedConfig);
|
||||
_nukiAdvancedConfigValid = result == Nuki::CmdResult::Success;
|
||||
|
||||
if(!_nukiAdvancedConfigValid) {
|
||||
char resultStr[20];
|
||||
NukiLock::cmdResultToString(result, resultStr);
|
||||
Log->print(F("Lock advanced config result: "));
|
||||
Log->println(resultStr);
|
||||
|
||||
if(result != Nuki::CmdResult::Success) {
|
||||
++_retryCount;
|
||||
Log->println("Failed to retrieve lock advanced config, retrying in 1s");
|
||||
delay(1000);
|
||||
}
|
||||
else break;
|
||||
}
|
||||
|
||||
char resultStr[20];
|
||||
NukiLock::cmdResultToString(result, resultStr);
|
||||
Log->print(F("Lock advanced config result: "));
|
||||
Log->println(resultStr);
|
||||
}
|
||||
|
||||
void NukiWrapper::setupHASS()
|
||||
@@ -2700,30 +2710,9 @@ bool NukiWrapper::hasDoorSensor() const
|
||||
|
||||
void NukiWrapper::disableHASS()
|
||||
{
|
||||
if(!_nukiConfigValid)
|
||||
{
|
||||
Nuki::CmdResult result = (Nuki::CmdResult)-1;
|
||||
_retryCount = 0;
|
||||
|
||||
while(_retryCount < _nrOfRetries + 1)
|
||||
{
|
||||
result = _nukiLock.requestConfig(&_nukiConfig);
|
||||
_nukiConfigValid = result == Nuki::CmdResult::Success;
|
||||
|
||||
if(!_nukiConfigValid) {
|
||||
++_retryCount;
|
||||
}
|
||||
else break;
|
||||
}
|
||||
}
|
||||
|
||||
if(_nukiConfigValid)
|
||||
{
|
||||
char uidString[20];
|
||||
itoa(_nukiConfig.nukiId, uidString, 16);
|
||||
_network->removeHASSConfig(uidString);
|
||||
}
|
||||
else Log->println(F("Unable to disable HASS. Invalid config received."));
|
||||
char uidString[20];
|
||||
itoa(_preferences->getUInt(preference_nuki_id_lock, 0), uidString, 16);
|
||||
_network->removeHASSConfig(uidString);
|
||||
}
|
||||
|
||||
const BLEAddress NukiWrapper::getBleAddress() const
|
||||
@@ -2776,5 +2765,4 @@ void NukiWrapper::updateGpioOutputs()
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -120,7 +120,6 @@ private:
|
||||
bool _keypadEnabled = false;
|
||||
uint _maxKeypadCodeCount = 0;
|
||||
uint _maxTimeControlEntryCount = 0;
|
||||
bool _configRead = false;
|
||||
int _nrOfRetries = 0;
|
||||
int _retryDelay = 0;
|
||||
int _retryCount = 0;
|
||||
|
||||
Reference in New Issue
Block a user