diff --git a/src/NukiOpenerWrapper.cpp b/src/NukiOpenerWrapper.cpp index 651f2d0..3918d0e 100644 --- a/src/NukiOpenerWrapper.cpp +++ b/src/NukiOpenerWrapper.cpp @@ -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) diff --git a/src/NukiOpenerWrapper.h b/src/NukiOpenerWrapper.h index fa5f227..b95eceb 100644 --- a/src/NukiOpenerWrapper.h +++ b/src/NukiOpenerWrapper.h @@ -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; diff --git a/src/NukiWrapper.cpp b/src/NukiWrapper.cpp index b8d9136..2c63a06 100644 --- a/src/NukiWrapper.cpp +++ b/src/NukiWrapper.cpp @@ -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; } } -} - +} \ No newline at end of file diff --git a/src/NukiWrapper.h b/src/NukiWrapper.h index 5f09cfe..424e3b8 100644 --- a/src/NukiWrapper.h +++ b/src/NukiWrapper.h @@ -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;