Squashed commit of the following:

commit ea34708fd1
Merge: e14877b 1dcef13
Author: Jan-Ole Schümann <j.o.schuemann@gmx.de>
Date:   Tue Mar 26 20:16:00 2024 +0700

    Merge pull request #328 from iranl/ha-fixes

    Multiple fixes (Nuki ID + README + ACL + DoorSensor/Keypad)

commit 1dcef135fc
Author: iranl <iranl@users.noreply.github.com>
Date:   Sun Mar 24 22:28:44 2024 +0100

    Add extra checks and auto retries

commit 56d718bc00
Author: iranl <iranl@users.noreply.github.com>
Date:   Sat Mar 23 19:52:50 2024 +0100

    Remove Force options

commit a3658bfd3c
Author: iranl <iranl@users.noreply.github.com>
Date:   Sun Mar 17 22:57:24 2024 +0100

    Update README.md

commit ef7fe751ed
Author: iranl <iranl@users.noreply.github.com>
Date:   Sun Mar 17 22:50:46 2024 +0100

    Update WebCfgServer.cpp

commit ac375df39f
Author: iranl <iranl@users.noreply.github.com>
Date:   Sun Mar 17 22:47:42 2024 +0100

    Redact Nuki ID

commit 516af39fe6
Author: iranl <iranl@users.noreply.github.com>
Date:   Sun Mar 17 22:40:22 2024 +0100

    ACL Info WebCfg + Force Keypad/DoorSensor

commit 3db4c0699e
Author: iranl <iranl@users.noreply.github.com>
Date:   Sun Mar 17 21:59:57 2024 +0100

    Nuki ID + README + ACL fix
This commit is contained in:
iranl
2024-03-29 10:48:20 +01:00
parent e14877b00f
commit e16ba62631
8 changed files with 137 additions and 29 deletions

View File

@@ -314,6 +314,7 @@ void NukiOpenerWrapper::unpair()
{
_nukiOpener.unPairNuki();
_deviceId->assignNewId();
_preferences->remove(preference_nuki_id_opener);
_paired = false;
}
@@ -355,8 +356,8 @@ void NukiOpenerWrapper::updateKeyTurnerState()
{
Log->println(F("Nuki opener: Ring detected (Open)"));
_network->publishRing(false);
}
}
_network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState);
updateGpioOutputs();
@@ -395,17 +396,48 @@ void NukiOpenerWrapper::updateConfig()
readConfig();
readAdvancedConfig();
_configRead = true;
_hasKeypad = _nukiConfig.hasKeypad > 0 || _nukiConfig.hasKeypadV2;
bool expectedConfig = true;
if(_nukiConfigValid)
{
_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]);
_network->publishConfig(_nukiConfig);
if(_preferences->getUInt(preference_nuki_id_opener, 0) == 0 || _retryConfigCount == 10)
{
_preferences->putUInt(preference_nuki_id_opener, _nukiConfig.nukiId);
}
if(_preferences->getUInt(preference_nuki_id_opener, 0) == _nukiConfig.nukiId)
{
_hasKeypad = _nukiConfig.hasKeypad > 0 || _nukiConfig.hasKeypadV2;
_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]);
_network->publishConfig(_nukiConfig);
_retryConfigCount = 0;
}
else
{
expectedConfig = false;
++_retryConfigCount;
}
}
if(_nukiAdvancedConfigValid)
else
{
expectedConfig = false;
++_retryConfigCount;
}
if(_nukiAdvancedConfigValid && _preferences->getUInt(preference_nuki_id_opener, 0) == _nukiConfig.nukiId)
{
_network->publishAdvancedConfig(_nukiAdvancedConfig);
_retryConfigCount = 0;
}
else
{
expectedConfig = false;
++_retryConfigCount;
}
if(!expectedConfig && _retryConfigCount < 11)
{
unsigned long ts = millis();
_nextConfigUpdateTs = ts + 60000;
}
}
@@ -442,7 +474,7 @@ void NukiOpenerWrapper::updateAuthData()
void NukiOpenerWrapper::updateKeypad()
{
if(_preferences->getBool(preference_keypad_info_enabled)) return;
Log->print(F("Querying opener keypad: "));
Nuki::CmdResult result = _nukiOpener.retrieveKeypadEntries(0, 0xffff);
printCommandResult(result);
@@ -498,12 +530,12 @@ LockActionResult NukiOpenerWrapper::onLockActionReceivedCallback(const char *val
{
return LockActionResult::UnknownAction;
}
nukiOpenerPreferences = new Preferences();
nukiOpenerPreferences->begin("nukihub", true);
uint32_t aclPrefs[17];
nukiOpenerPreferences->getBytes(preference_acl, &aclPrefs, sizeof(aclPrefs));
if((action == NukiOpener::LockAction::ActivateRTO && (int)aclPrefs[9] == 1) || (action == NukiOpener::LockAction::DeactivateRTO && (int)aclPrefs[10] == 1) || (action == NukiOpener::LockAction::ElectricStrikeActuation && (int)aclPrefs[11] == 1) || (action == NukiOpener::LockAction::ActivateCM && (int)aclPrefs[12] == 1) || (action == NukiOpener::LockAction::DeactivateCM && (int)aclPrefs[13] == 1) || (action == NukiOpener::LockAction::FobAction1 && (int)aclPrefs[14] == 1) || (action == NukiOpener::LockAction::FobAction2 && (int)aclPrefs[15] == 1) || (action == NukiOpener::LockAction::FobAction3 && (int)aclPrefs[16] == 1))
{
nukiOpenerPreferences->end();
@@ -752,6 +784,7 @@ void NukiOpenerWrapper::readAdvancedConfig()
void NukiOpenerWrapper::setupHASS()
{
if(!_nukiConfigValid) return;
if(_preferences->getUInt(preference_nuki_id_opener, 0) != _nukiConfig.nukiId) return;
String baseTopic = _preferences->getString(preference_mqtt_opener_path);
char uidString[20];