Merge branch 'master' into publish-keypad-code-and-rolling-auth-log

This commit is contained in:
iranl
2024-06-01 06:03:31 +02:00
committed by GitHub
5 changed files with 164 additions and 162 deletions

View File

@@ -409,7 +409,7 @@ Example:
### Home Assistant discovery ### Home Assistant discovery
If Home Assistant discovery is enabled (see the [Home Assistant Discovery](#home-assistant-discovery-optional) section of this README) Nuki Hub will create entities for almost all of the above settings. These entities will be disabled by default in Home Assistant, but can be found in the MQTT devices section of the Home Assistant UI under the "Configuration" section of the Nuki Lock/Opener and enabled there. If Home Assistant discovery is enabled (see the [Home Assistant Discovery](#home-assistant-discovery-optional) section of this README) Nuki Hub will create entities for almost all of the above settings.
## Over-the-air Update (OTA) ## Over-the-air Update (OTA)

View File

@@ -723,14 +723,13 @@ void NetworkOpener::publishBleAddress(const std::string &address)
publishString(mqtt_topic_lock_address, address); publishString(mqtt_topic_lock_address, address);
} }
void NetworkOpener::publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& publishAuthData, char* lockAction, char* unlockAction, char* openAction) void NetworkOpener::publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& publishAuthData, const bool& hasKeypad, char* lockAction, char* unlockAction, char* openAction)
{ {
String availabilityTopic = _preferences->getString("mqttpath"); String availabilityTopic = _preferences->getString("mqttpath");
availabilityTopic.concat("/maintenance/mqttConnectionState"); availabilityTopic.concat("/maintenance/mqttConnectionState");
_network->publishHASSConfig(deviceType, baseTopic, name, uidString, availabilityTopic.c_str(), false, lockAction, unlockAction, openAction); _network->publishHASSConfig(deviceType, baseTopic, name, uidString, availabilityTopic.c_str(), hasKeypad, lockAction, unlockAction, openAction);
_network->publishHASSConfigAdditionalOpenerEntities(deviceType, baseTopic, name, uidString); _network->publishHASSConfigAdditionalOpenerEntities(deviceType, baseTopic, name, uidString);
if(publishAuthData) if(publishAuthData)
{ {
_network->publishHASSConfigAccessLog(deviceType, baseTopic, name, uidString); _network->publishHASSConfigAccessLog(deviceType, baseTopic, name, uidString);
@@ -739,6 +738,15 @@ void NetworkOpener::publishHASSConfig(char* deviceType, const char* baseTopic, c
{ {
_network->removeHASSConfigTopic((char*)"sensor", (char*)"last_action_authorization", uidString); _network->removeHASSConfigTopic((char*)"sensor", (char*)"last_action_authorization", uidString);
_network->removeHASSConfigTopic((char*)"sensor", (char*)"rolling_log", uidString); _network->removeHASSConfigTopic((char*)"sensor", (char*)"rolling_log", uidString);
if(hasKeypad)
{
_network->publishHASSConfigKeypad(deviceType, baseTopic, name, uidString);
}
else
{
_network->removeHASSConfigTopic((char*)"sensor", (char*)"keypad_status", uidString);
_network->removeHASSConfigTopic((char*)"binary_sensor", (char*)"keypad_battery_low", uidString);
} }
} }

View File

@@ -31,7 +31,7 @@ public:
void publishRssi(const int& rssi); void publishRssi(const int& rssi);
void publishRetry(const std::string& message); 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, const bool& publishAuthData, char* lockAction, char* unlockAction, char* openAction); void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& publishAuthData, const bool& hasKeypad, char* lockAction, char* unlockAction, char* openAction);
void removeHASSConfig(char* uidString); void removeHASSConfig(char* uidString);
void publishKeypad(const std::list<NukiLock::KeypadEntry>& entries, uint maxKeypadCodeCount); void publishKeypad(const std::list<NukiLock::KeypadEntry>& entries, uint maxKeypadCodeCount);
void publishTimeControl(const std::list<NukiOpener::TimeControlEntry>& timeControlEntries); void publishTimeControl(const std::list<NukiOpener::TimeControlEntry>& timeControlEntries);

View File

@@ -867,8 +867,8 @@ void NukiOpenerWrapper::onConfigUpdateReceived(const char *value)
} }
Nuki::CmdResult cmdResult; Nuki::CmdResult cmdResult;
const char *basicKeys[] = {"name", "latitude", "longitude", "pairingEnabled", "buttonEnabled", "ledFlashEnabled", "timeZoneOffset", "dstMode", "fobAction1", "fobAction2", "fobAction3", "operatingMode", "advertisingMode", "timeZone"}; const char *basicKeys[14] = {"name", "latitude", "longitude", "pairingEnabled", "buttonEnabled", "ledFlashEnabled", "timeZoneOffset", "dstMode", "fobAction1", "fobAction2", "fobAction3", "operatingMode", "advertisingMode", "timeZone"};
const char *advancedKeys[] = {"intercomID", "busModeSwitch", "shortCircuitDuration", "electricStrikeDelay", "randomElectricStrikeDelay", "electricStrikeDuration", "disableRtoAfterRing", "rtoTimeout", "doorbellSuppression", "doorbellSuppressionDuration", "soundRing", "soundOpen", "soundRto", "soundCm", "soundConfirmation", "soundLevel", "singleButtonPressAction", "doubleButtonPressAction", "batteryType", "automaticBatteryTypeDetection"}; const char *advancedKeys[20] = {"intercomID", "busModeSwitch", "shortCircuitDuration", "electricStrikeDelay", "randomElectricStrikeDelay", "electricStrikeDuration", "disableRtoAfterRing", "rtoTimeout", "doorbellSuppression", "doorbellSuppressionDuration", "soundRing", "soundOpen", "soundRto", "soundCm", "soundConfirmation", "soundLevel", "singleButtonPressAction", "doubleButtonPressAction", "batteryType", "automaticBatteryTypeDetection"};
bool basicUpdated = false; bool basicUpdated = false;
bool advancedUpdated = false; bool advancedUpdated = false;
uint32_t basicOpenerConfigAclPrefs[16]; uint32_t basicOpenerConfigAclPrefs[16];
@@ -879,7 +879,7 @@ void NukiOpenerWrapper::onConfigUpdateReceived(const char *value)
nukiOpenerPreferences->getBytes(preference_conf_opener_basic_acl, &basicOpenerConfigAclPrefs, sizeof(basicOpenerConfigAclPrefs)); nukiOpenerPreferences->getBytes(preference_conf_opener_basic_acl, &basicOpenerConfigAclPrefs, sizeof(basicOpenerConfigAclPrefs));
nukiOpenerPreferences->getBytes(preference_conf_opener_advanced_acl, &advancedOpenerConfigAclPrefs, sizeof(advancedOpenerConfigAclPrefs)); nukiOpenerPreferences->getBytes(preference_conf_opener_advanced_acl, &advancedOpenerConfigAclPrefs, sizeof(advancedOpenerConfigAclPrefs));
for(int i=0; i < 16; i++) for(int i=0; i < 14; i++)
{ {
if(json[basicKeys[i]]) if(json[basicKeys[i]])
{ {
@@ -1060,261 +1060,258 @@ void NukiOpenerWrapper::onConfigUpdateReceived(const char *value)
} }
} }
for(int i=0; i < 20; i++) for(int j=0; j < 20; j++)
{ {
if(json[advancedKeys[i]]) if(json[advancedKeys[j]])
{ {
const char *jsonchar = json[advancedKeys[i]].as<const char*>(); const char *jsonchar = json[advancedKeys[j]].as<const char*>();
if(strlen(jsonchar) == 0) if(strlen(jsonchar) == 0)
{ {
jsonResult[advancedKeys[i]] = "noValueSet"; jsonResult[advancedKeys[j]] = "noValueSet";
continue; continue;
} }
if((int)advancedOpenerConfigAclPrefs[i] == 1) if((int)advancedOpenerConfigAclPrefs[j] == 1)
{ {
cmdResult = Nuki::CmdResult::Error; cmdResult = Nuki::CmdResult::Error;
if(strcmp(advancedKeys[i], "intercomID") == 0) if(strcmp(advancedKeys[j], "intercomID") == 0)
{ {
const uint16_t keyvalue = atoi(jsonchar); const uint16_t keyvalue = atoi(jsonchar);
if(keyvalue >= 0) if(keyvalue >= 0)
{ {
if(_nukiAdvancedConfig.intercomID == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.intercomID == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setIntercomID(keyvalue); else cmdResult = _nukiOpener.setIntercomID(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "busModeSwitch") == 0) else if(strcmp(advancedKeys[j], "busModeSwitch") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.busModeSwitch == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.busModeSwitch == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setBusModeSwitch((keyvalue > 0)); else cmdResult = _nukiOpener.setBusModeSwitch((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "shortCircuitDuration") == 0) else if(strcmp(advancedKeys[j], "shortCircuitDuration") == 0)
{ {
const uint16_t keyvalue = atoi(jsonchar); const uint16_t keyvalue = atoi(jsonchar);
if(keyvalue >= 0) if(keyvalue >= 0)
{ {
if(_nukiAdvancedConfig.shortCircuitDuration == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.shortCircuitDuration == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setShortCircuitDuration(keyvalue); else cmdResult = _nukiOpener.setShortCircuitDuration(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "electricStrikeDelay") == 0) else if(strcmp(advancedKeys[j], "electricStrikeDelay") == 0)
{ {
const uint16_t keyvalue = atoi(jsonchar); const uint16_t keyvalue = atoi(jsonchar);
if(keyvalue >= 0 && keyvalue <= 30000) if(keyvalue >= 0 && keyvalue <= 30000)
{ {
if(_nukiAdvancedConfig.electricStrikeDelay == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.electricStrikeDelay == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setElectricStrikeDelay(keyvalue); else cmdResult = _nukiOpener.setElectricStrikeDelay(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "randomElectricStrikeDelay") == 0) else if(strcmp(advancedKeys[j], "randomElectricStrikeDelay") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.randomElectricStrikeDelay == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.randomElectricStrikeDelay == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.enableRandomElectricStrikeDelay((keyvalue > 0)); else cmdResult = _nukiOpener.enableRandomElectricStrikeDelay((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "electricStrikeDuration") == 0) else if(strcmp(advancedKeys[j], "electricStrikeDuration") == 0)
{ {
const uint16_t keyvalue = atoi(jsonchar); const uint16_t keyvalue = atoi(jsonchar);
if(keyvalue >= 1000 && keyvalue <= 30000) if(keyvalue >= 1000 && keyvalue <= 30000)
{ {
if(_nukiAdvancedConfig.electricStrikeDuration == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.electricStrikeDuration == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setElectricStrikeDuration(keyvalue); else cmdResult = _nukiOpener.setElectricStrikeDuration(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "disableRtoAfterRing") == 0) else if(strcmp(advancedKeys[j], "disableRtoAfterRing") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.disableRtoAfterRing == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.disableRtoAfterRing == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.disableRtoAfterRing((keyvalue > 0)); else cmdResult = _nukiOpener.disableRtoAfterRing((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "rtoTimeout") == 0) else if(strcmp(advancedKeys[j], "rtoTimeout") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue >= 5 && keyvalue <= 60) if(keyvalue >= 5 && keyvalue <= 60)
{ {
if(_nukiAdvancedConfig.rtoTimeout == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.rtoTimeout == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setRtoTimeout(keyvalue); else cmdResult = _nukiOpener.setRtoTimeout(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "doorbellSuppression") == 0) else if(strcmp(advancedKeys[j], "doorbellSuppression") == 0)
{ {
const uint8_t dbsupr = nukiOpenerInst->doorbellSuppressionToInt(jsonchar); const uint8_t dbsupr = nukiOpenerInst->doorbellSuppressionToInt(jsonchar);
if(dbsupr != 99) if(dbsupr != 99)
{ {
if(_nukiAdvancedConfig.doorbellSuppression == dbsupr) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.doorbellSuppression == dbsupr) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setDoorbellSuppression(dbsupr); else cmdResult = _nukiOpener.setDoorbellSuppression(dbsupr);
} }
else jsonResult[basicKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "doorbellSuppressionDuration") == 0) else if(strcmp(advancedKeys[j], "doorbellSuppressionDuration") == 0)
{ {
const uint16_t keyvalue = atoi(jsonchar); const uint16_t keyvalue = atoi(jsonchar);
if(keyvalue >= 500 && keyvalue <= 10000) if(keyvalue >= 500 && keyvalue <= 10000)
{ {
if(_nukiAdvancedConfig.doorbellSuppressionDuration == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.doorbellSuppressionDuration == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setDoorbellSuppressionDuration(keyvalue); else cmdResult = _nukiOpener.setDoorbellSuppressionDuration(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "soundRing") == 0) else if(strcmp(advancedKeys[j], "soundRing") == 0)
{ {
const uint8_t sound = nukiOpenerInst->soundToInt(jsonchar); const uint8_t sound = nukiOpenerInst->soundToInt(jsonchar);
if(sound != 99) if(sound != 99)
{ {
if(_nukiAdvancedConfig.soundRing == sound) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.soundRing == sound) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setSoundRing(sound); else cmdResult = _nukiOpener.setSoundRing(sound);
} }
else jsonResult[basicKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "soundOpen") == 0) else if(strcmp(advancedKeys[j], "soundOpen") == 0)
{ {
const uint8_t sound = nukiOpenerInst->soundToInt(jsonchar); const uint8_t sound = nukiOpenerInst->soundToInt(jsonchar);
if(sound != 99) if(sound != 99)
{ {
if(_nukiAdvancedConfig.soundOpen == sound) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.soundOpen == sound) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setSoundOpen(sound); else cmdResult = _nukiOpener.setSoundOpen(sound);
} }
else jsonResult[basicKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "soundRto") == 0) else if(strcmp(advancedKeys[j], "soundRto") == 0)
{ {
const uint8_t sound = nukiOpenerInst->soundToInt(jsonchar); const uint8_t sound = nukiOpenerInst->soundToInt(jsonchar);
if(sound != 99) if(sound != 99)
{ {
if(_nukiAdvancedConfig.soundRto == sound) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.soundRto == sound) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setSoundRto(sound); else cmdResult = _nukiOpener.setSoundRto(sound);
} }
else jsonResult[basicKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "soundCm") == 0) else if(strcmp(advancedKeys[j], "soundCm") == 0)
{ {
const uint8_t sound = nukiOpenerInst->soundToInt(jsonchar); const uint8_t sound = nukiOpenerInst->soundToInt(jsonchar);
if(sound != 99) if(sound != 99)
{ {
if(_nukiAdvancedConfig.soundCm == sound) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.soundCm == sound) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setSoundCm(sound); else cmdResult = _nukiOpener.setSoundCm(sound);
} }
else jsonResult[basicKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "soundConfirmation") == 0) else if(strcmp(advancedKeys[j], "soundConfirmation") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.soundConfirmation == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.soundConfirmation == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.enableSoundConfirmation((keyvalue > 0)); else cmdResult = _nukiOpener.enableSoundConfirmation((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "soundLevel") == 0) else if(strcmp(advancedKeys[j], "soundLevel") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue >= 0 && keyvalue <= 255) if(keyvalue >= 0 && keyvalue <= 255)
{ {
if(_nukiAdvancedConfig.soundLevel == keyvalue) jsonResult[basicKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.soundLevel == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setSoundLevel(keyvalue); else cmdResult = _nukiOpener.setSoundLevel(keyvalue);
} }
else jsonResult[basicKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "singleButtonPressAction") == 0) else if(strcmp(advancedKeys[j], "singleButtonPressAction") == 0)
{ {
NukiOpener::ButtonPressAction sbpa = nukiOpenerInst->buttonPressActionToEnum(jsonchar); NukiOpener::ButtonPressAction sbpa = nukiOpenerInst->buttonPressActionToEnum(jsonchar);
if(!(int)sbpa == 0xff) if(!(int)sbpa == 0xff)
{ {
if(_nukiAdvancedConfig.singleButtonPressAction == sbpa) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.singleButtonPressAction == sbpa) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setSingleButtonPressAction(sbpa); else cmdResult = _nukiOpener.setSingleButtonPressAction(sbpa);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "doubleButtonPressAction") == 0) else if(strcmp(advancedKeys[j], "doubleButtonPressAction") == 0)
{ {
NukiOpener::ButtonPressAction dbpa = nukiOpenerInst->buttonPressActionToEnum(jsonchar); NukiOpener::ButtonPressAction dbpa = nukiOpenerInst->buttonPressActionToEnum(jsonchar);
if(!(int)dbpa == 0xff) if(!(int)dbpa == 0xff)
{ {
if(_nukiAdvancedConfig.doubleButtonPressAction == dbpa) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.doubleButtonPressAction == dbpa) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setDoubleButtonPressAction(dbpa); else cmdResult = _nukiOpener.setDoubleButtonPressAction(dbpa);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "batteryType") == 0) else if(strcmp(advancedKeys[j], "batteryType") == 0)
{ {
Nuki::BatteryType battype = nukiOpenerInst->batteryTypeToEnum(jsonchar); Nuki::BatteryType battype = nukiOpenerInst->batteryTypeToEnum(jsonchar);
if(!(int)battype == 0xff) if(!(int)battype == 0xff)
{ {
if(_nukiAdvancedConfig.batteryType == battype) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.batteryType == battype) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.setBatteryType(battype); else cmdResult = _nukiOpener.setBatteryType(battype);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "automaticBatteryTypeDetection") == 0) else if(strcmp(advancedKeys[j], "automaticBatteryTypeDetection") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.automaticBatteryTypeDetection == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.automaticBatteryTypeDetection == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiOpener.enableAutoBatteryTypeDetection((keyvalue > 0)); else cmdResult = _nukiOpener.enableAutoBatteryTypeDetection((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
if(cmdResult == Nuki::CmdResult::Success) advancedUpdated = true; if(cmdResult == Nuki::CmdResult::Success) advancedUpdated = true;
if(!jsonResult[advancedKeys[i]]) { if(!jsonResult[advancedKeys[j]]) {
char resultStr[15] = {0}; char resultStr[15] = {0};
NukiOpener::cmdResultToString(cmdResult, resultStr); NukiOpener::cmdResultToString(cmdResult, resultStr);
jsonResult[advancedKeys[i]] = resultStr; jsonResult[advancedKeys[j]] = resultStr;
} }
} }
else jsonResult[advancedKeys[i]] = "accessDenied"; else jsonResult[advancedKeys[j]] = "accessDenied";
} }
} }
nukiOpenerPreferences->end(); nukiOpenerPreferences->end();
if(basicUpdated || advancedUpdated) if(basicUpdated || advancedUpdated) jsonResult["general"] = "success";
{
jsonResult["general"] = "success";
}
else jsonResult["general"] = "noChange"; else jsonResult["general"] = "noChange";
_nextConfigUpdateTs = millis() + 300; _nextConfigUpdateTs = millis() + 300;
@@ -2077,11 +2074,11 @@ void NukiOpenerWrapper::setupHASS()
if(_preferences->getBool(preference_opener_continuous_mode)) if(_preferences->getBool(preference_opener_continuous_mode))
{ {
_network->publishHASSConfig((char*)"Opener", baseTopic.c_str(), (char*)_nukiConfig.name, uidString, _publishAuthData, (char*)"deactivateCM", (char*)"activateCM", (char*)"electricStrikeActuation"); _network->publishHASSConfig((char*)"Opener", baseTopic.c_str(), (char*)_nukiConfig.name, uidString, _publishAuthData, _hasKeypad, (char*)"deactivateCM", (char*)"activateCM", (char*)"electricStrikeActuation");
} }
else else
{ {
_network->publishHASSConfig((char*)"Opener", baseTopic.c_str(), (char*)_nukiConfig.name, uidString, _publishAuthData, (char*)"deactivateRTO", (char*)"activateRTO", (char*)"electricStrikeActuation"); _network->publishHASSConfig((char*)"Opener", baseTopic.c_str(), (char*)_nukiConfig.name, uidString, _publishAuthData, _hasKeypad, (char*)"deactivateRTO", (char*)"activateRTO", (char*)"electricStrikeActuation");
} }
_hassSetupCompleted = true; _hassSetupCompleted = true;

View File

@@ -811,8 +811,8 @@ void NukiWrapper::onConfigUpdateReceived(const char *value)
} }
Nuki::CmdResult cmdResult; Nuki::CmdResult cmdResult;
const char *basicKeys[] = {"name", "latitude", "longitude", "autoUnlatch", "pairingEnabled", "buttonEnabled", "ledEnabled", "ledBrightness", "timeZoneOffset", "dstMode", "fobAction1", "fobAction2", "fobAction3", "singleLock", "advertisingMode", "timeZone"}; const char *basicKeys[16] = {"name", "latitude", "longitude", "autoUnlatch", "pairingEnabled", "buttonEnabled", "ledEnabled", "ledBrightness", "timeZoneOffset", "dstMode", "fobAction1", "fobAction2", "fobAction3", "singleLock", "advertisingMode", "timeZone"};
const char *advancedKeys[] = {"unlockedPositionOffsetDegrees", "lockedPositionOffsetDegrees", "singleLockedPositionOffsetDegrees", "unlockedToLockedTransitionOffsetDegrees", "lockNgoTimeout", "singleButtonPressAction", "doubleButtonPressAction", "detachedCylinder", "batteryType", "automaticBatteryTypeDetection", "unlatchDuration", "autoLockTimeOut", "autoUnLockDisabled", "nightModeEnabled", "nightModeStartTime", "nightModeEndTime", "nightModeAutoLockEnabled", "nightModeAutoUnlockDisabled", "nightModeImmediateLockOnStart", "autoLockEnabled", "immediateAutoLockEnabled", "autoUpdateEnabled"}; const char *advancedKeys[22] = {"unlockedPositionOffsetDegrees", "lockedPositionOffsetDegrees", "singleLockedPositionOffsetDegrees", "unlockedToLockedTransitionOffsetDegrees", "lockNgoTimeout", "singleButtonPressAction", "doubleButtonPressAction", "detachedCylinder", "batteryType", "automaticBatteryTypeDetection", "unlatchDuration", "autoLockTimeOut", "autoUnLockDisabled", "nightModeEnabled", "nightModeStartTime", "nightModeEndTime", "nightModeAutoLockEnabled", "nightModeAutoUnlockDisabled", "nightModeImmediateLockOnStart", "autoLockEnabled", "immediateAutoLockEnabled", "autoUpdateEnabled"};
bool basicUpdated = false; bool basicUpdated = false;
bool advancedUpdated = false; bool advancedUpdated = false;
uint32_t basicLockConfigAclPrefs[16]; uint32_t basicLockConfigAclPrefs[16];
@@ -1026,177 +1026,177 @@ void NukiWrapper::onConfigUpdateReceived(const char *value)
} }
} }
for(int i=0; i < 22; i++) for(int j=0; j < 22; j++)
{ {
if(json[advancedKeys[i]]) if(json[advancedKeys[j]])
{ {
const char *jsonchar = json[advancedKeys[i]].as<const char*>(); const char *jsonchar = json[advancedKeys[j]].as<const char*>();
if(strlen(jsonchar) == 0) if(strlen(jsonchar) == 0)
{ {
jsonResult[advancedKeys[i]] = "noValueSet"; jsonResult[advancedKeys[j]] = "noValueSet";
continue; continue;
} }
if((int)advancedLockConfigAclPrefs[i] == 1) if((int)advancedLockConfigAclPrefs[j] == 1)
{ {
cmdResult = Nuki::CmdResult::Error; cmdResult = Nuki::CmdResult::Error;
if(strcmp(advancedKeys[i], "unlockedPositionOffsetDegrees") == 0) if(strcmp(advancedKeys[j], "unlockedPositionOffsetDegrees") == 0)
{ {
const int16_t keyvalue = atoi(jsonchar); const int16_t keyvalue = atoi(jsonchar);
if(keyvalue >= -90 && keyvalue <= 180) if(keyvalue >= -90 && keyvalue <= 180)
{ {
if(_nukiAdvancedConfig.unlockedPositionOffsetDegrees == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.unlockedPositionOffsetDegrees == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setUnlockedPositionOffsetDegrees(keyvalue); else cmdResult = _nukiLock.setUnlockedPositionOffsetDegrees(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "lockedPositionOffsetDegrees") == 0) else if(strcmp(advancedKeys[j], "lockedPositionOffsetDegrees") == 0)
{ {
const int16_t keyvalue = atoi(jsonchar); const int16_t keyvalue = atoi(jsonchar);
if(keyvalue >= -180 && keyvalue <= 90) if(keyvalue >= -180 && keyvalue <= 90)
{ {
if(_nukiAdvancedConfig.lockedPositionOffsetDegrees == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.lockedPositionOffsetDegrees == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setLockedPositionOffsetDegrees(keyvalue); else cmdResult = _nukiLock.setLockedPositionOffsetDegrees(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "singleLockedPositionOffsetDegrees") == 0) else if(strcmp(advancedKeys[j], "singleLockedPositionOffsetDegrees") == 0)
{ {
const int16_t keyvalue = atoi(jsonchar); const int16_t keyvalue = atoi(jsonchar);
if(keyvalue >= -180 && keyvalue <= 180) if(keyvalue >= -180 && keyvalue <= 180)
{ {
if(_nukiAdvancedConfig.singleLockedPositionOffsetDegrees == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.singleLockedPositionOffsetDegrees == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setSingleLockedPositionOffsetDegrees(keyvalue); else cmdResult = _nukiLock.setSingleLockedPositionOffsetDegrees(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "unlockedToLockedTransitionOffsetDegrees") == 0) else if(strcmp(advancedKeys[j], "unlockedToLockedTransitionOffsetDegrees") == 0)
{ {
const int16_t keyvalue = atoi(jsonchar); const int16_t keyvalue = atoi(jsonchar);
if(keyvalue >= -180 && keyvalue <= 180) if(keyvalue >= -180 && keyvalue <= 180)
{ {
if(_nukiAdvancedConfig.unlockedToLockedTransitionOffsetDegrees == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.unlockedToLockedTransitionOffsetDegrees == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setUnlockedToLockedTransitionOffsetDegrees(keyvalue); else cmdResult = _nukiLock.setUnlockedToLockedTransitionOffsetDegrees(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "lockNgoTimeout") == 0) else if(strcmp(advancedKeys[j], "lockNgoTimeout") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue >= 5 && keyvalue <= 60) if(keyvalue >= 5 && keyvalue <= 60)
{ {
if(_nukiAdvancedConfig.lockNgoTimeout == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.lockNgoTimeout == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setLockNgoTimeout(keyvalue); else cmdResult = _nukiLock.setLockNgoTimeout(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "singleButtonPressAction") == 0) else if(strcmp(advancedKeys[j], "singleButtonPressAction") == 0)
{ {
NukiLock::ButtonPressAction sbpa = nukiInst->buttonPressActionToEnum(jsonchar); NukiLock::ButtonPressAction sbpa = nukiInst->buttonPressActionToEnum(jsonchar);
if((int)sbpa != 0xff) if((int)sbpa != 0xff)
{ {
if(_nukiAdvancedConfig.singleButtonPressAction == sbpa) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.singleButtonPressAction == sbpa) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setSingleButtonPressAction(sbpa); else cmdResult = _nukiLock.setSingleButtonPressAction(sbpa);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "doubleButtonPressAction") == 0) else if(strcmp(advancedKeys[j], "doubleButtonPressAction") == 0)
{ {
NukiLock::ButtonPressAction dbpa = nukiInst->buttonPressActionToEnum(jsonchar); NukiLock::ButtonPressAction dbpa = nukiInst->buttonPressActionToEnum(jsonchar);
if((int)dbpa != 0xff) if((int)dbpa != 0xff)
{ {
if(_nukiAdvancedConfig.doubleButtonPressAction == dbpa) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.doubleButtonPressAction == dbpa) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setDoubleButtonPressAction(dbpa); else cmdResult = _nukiLock.setDoubleButtonPressAction(dbpa);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "detachedCylinder") == 0) else if(strcmp(advancedKeys[j], "detachedCylinder") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.detachedCylinder == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.detachedCylinder == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.enableDetachedCylinder((keyvalue > 0)); else cmdResult = _nukiLock.enableDetachedCylinder((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "batteryType") == 0) else if(strcmp(advancedKeys[j], "batteryType") == 0)
{ {
Nuki::BatteryType battype = nukiInst->batteryTypeToEnum(jsonchar); Nuki::BatteryType battype = nukiInst->batteryTypeToEnum(jsonchar);
if((int)battype != 0xff) if((int)battype != 0xff)
{ {
if(_nukiAdvancedConfig.batteryType == battype) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.batteryType == battype) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setBatteryType(battype); else cmdResult = _nukiLock.setBatteryType(battype);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "automaticBatteryTypeDetection") == 0) else if(strcmp(advancedKeys[j], "automaticBatteryTypeDetection") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.automaticBatteryTypeDetection == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.automaticBatteryTypeDetection == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.enableAutoBatteryTypeDetection((keyvalue > 0)); else cmdResult = _nukiLock.enableAutoBatteryTypeDetection((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "unlatchDuration") == 0) else if(strcmp(advancedKeys[j], "unlatchDuration") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue >= 1 && keyvalue <= 30) if(keyvalue >= 1 && keyvalue <= 30)
{ {
if(_nukiAdvancedConfig.unlatchDuration == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.unlatchDuration == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setUnlatchDuration(keyvalue); else cmdResult = _nukiLock.setUnlatchDuration(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "autoLockTimeOut") == 0) else if(strcmp(advancedKeys[j], "autoLockTimeOut") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue >= 30 && keyvalue <= 180) if(keyvalue >= 30 && keyvalue <= 180)
{ {
if(_nukiAdvancedConfig.autoLockTimeOut == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.autoLockTimeOut == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setAutoLockTimeOut(keyvalue); else cmdResult = _nukiLock.setAutoLockTimeOut(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "autoUnLockDisabled") == 0) else if(strcmp(advancedKeys[j], "autoUnLockDisabled") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.autoUnLockDisabled == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.autoUnLockDisabled == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.disableAutoUnlock((keyvalue > 0)); else cmdResult = _nukiLock.disableAutoUnlock((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "nightModeEnabled") == 0) else if(strcmp(advancedKeys[j], "nightModeEnabled") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.nightModeEnabled == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.nightModeEnabled == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.enableNightMode((keyvalue > 0)); else cmdResult = _nukiLock.enableNightMode((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "nightModeStartTime") == 0) else if(strcmp(advancedKeys[j], "nightModeStartTime") == 0)
{ {
String keystr = jsonchar; String keystr = jsonchar;
unsigned char keyvalue[2]; unsigned char keyvalue[2];
@@ -1204,12 +1204,12 @@ void NukiWrapper::onConfigUpdateReceived(const char *value)
keyvalue[1] = (uint8_t)keystr.substring(3, 5).toInt(); keyvalue[1] = (uint8_t)keystr.substring(3, 5).toInt();
if(keyvalue[0] >= 0 && keyvalue[0] <= 23 && keyvalue[1] >= 0 && keyvalue[1] <= 59) if(keyvalue[0] >= 0 && keyvalue[0] <= 23 && keyvalue[1] >= 0 && keyvalue[1] <= 59)
{ {
if(_nukiAdvancedConfig.nightModeStartTime == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.nightModeStartTime == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setNightModeStartTime(keyvalue); else cmdResult = _nukiLock.setNightModeStartTime(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "nightModeEndTime") == 0) else if(strcmp(advancedKeys[j], "nightModeEndTime") == 0)
{ {
String keystr = jsonchar; String keystr = jsonchar;
unsigned char keyvalue[2]; unsigned char keyvalue[2];
@@ -1217,96 +1217,93 @@ void NukiWrapper::onConfigUpdateReceived(const char *value)
keyvalue[1] = (uint8_t)keystr.substring(3, 5).toInt(); keyvalue[1] = (uint8_t)keystr.substring(3, 5).toInt();
if(keyvalue[0] >= 0 && keyvalue[0] <= 23 && keyvalue[1] >= 0 && keyvalue[1] <= 59) if(keyvalue[0] >= 0 && keyvalue[0] <= 23 && keyvalue[1] >= 0 && keyvalue[1] <= 59)
{ {
if(_nukiAdvancedConfig.nightModeEndTime == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.nightModeEndTime == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.setNightModeEndTime(keyvalue); else cmdResult = _nukiLock.setNightModeEndTime(keyvalue);
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "nightModeAutoLockEnabled") == 0) else if(strcmp(advancedKeys[j], "nightModeAutoLockEnabled") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.nightModeAutoLockEnabled == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.nightModeAutoLockEnabled == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.enableNightModeAutoLock((keyvalue > 0)); else cmdResult = _nukiLock.enableNightModeAutoLock((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "nightModeAutoUnlockDisabled") == 0) else if(strcmp(advancedKeys[j], "nightModeAutoUnlockDisabled") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.nightModeAutoUnlockDisabled == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.nightModeAutoUnlockDisabled == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.disableNightModeAutoUnlock((keyvalue > 0)); else cmdResult = _nukiLock.disableNightModeAutoUnlock((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "nightModeImmediateLockOnStart") == 0) else if(strcmp(advancedKeys[j], "nightModeImmediateLockOnStart") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.nightModeImmediateLockOnStart == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.nightModeImmediateLockOnStart == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.enableNightModeImmediateLockOnStart((keyvalue > 0)); else cmdResult = _nukiLock.enableNightModeImmediateLockOnStart((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "autoLockEnabled") == 0) else if(strcmp(advancedKeys[j], "autoLockEnabled") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.autoLockEnabled == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.autoLockEnabled == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.enableAutoLock((keyvalue > 0)); else cmdResult = _nukiLock.enableAutoLock((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "immediateAutoLockEnabled") == 0) else if(strcmp(advancedKeys[j], "immediateAutoLockEnabled") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.immediateAutoLockEnabled == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.immediateAutoLockEnabled == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.enableImmediateAutoLock((keyvalue > 0)); else cmdResult = _nukiLock.enableImmediateAutoLock((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
else if(strcmp(advancedKeys[i], "autoUpdateEnabled") == 0) else if(strcmp(advancedKeys[j], "autoUpdateEnabled") == 0)
{ {
const uint8_t keyvalue = atoi(jsonchar); const uint8_t keyvalue = atoi(jsonchar);
if(keyvalue == 0 || keyvalue == 1) if(keyvalue == 0 || keyvalue == 1)
{ {
if(_nukiAdvancedConfig.autoUpdateEnabled == keyvalue) jsonResult[advancedKeys[i]] = "unchanged"; if(_nukiAdvancedConfig.autoUpdateEnabled == keyvalue) jsonResult[advancedKeys[j]] = "unchanged";
else cmdResult = _nukiLock.enableAutoUpdate((keyvalue > 0)); else cmdResult = _nukiLock.enableAutoUpdate((keyvalue > 0));
} }
else jsonResult[advancedKeys[i]] = "invalidValue"; else jsonResult[advancedKeys[j]] = "invalidValue";
} }
if(cmdResult == Nuki::CmdResult::Success) advancedUpdated = true; if(cmdResult == Nuki::CmdResult::Success) advancedUpdated = true;
if(!jsonResult[advancedKeys[i]]) { if(!jsonResult[advancedKeys[j]]) {
char resultStr[15] = {0}; char resultStr[15] = {0};
NukiLock::cmdResultToString(cmdResult, resultStr); NukiLock::cmdResultToString(cmdResult, resultStr);
jsonResult[advancedKeys[i]] = resultStr; jsonResult[advancedKeys[j]] = resultStr;
} }
} }
else jsonResult[advancedKeys[i]] = "accessDenied"; else jsonResult[advancedKeys[j]] = "accessDenied";
} }
} }
nukiLockPreferences->end(); nukiLockPreferences->end();
if(basicUpdated || advancedUpdated) if(basicUpdated || advancedUpdated) jsonResult["general"] = "success";
{
jsonResult["general"] = "success";
}
else jsonResult["general"] = "noChange"; else jsonResult["general"] = "noChange";
_nextConfigUpdateTs = millis() + 300; _nextConfigUpdateTs = millis() + 300;