Add Ultra
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
#define NUKI_HUB_VERSION "9.08"
|
||||
#define NUKI_HUB_VERSION_INT (uint32_t)908
|
||||
#define NUKI_HUB_BUILD "unknownbuildnr"
|
||||
#define NUKI_HUB_DATE "2025-01-13"
|
||||
#define NUKI_HUB_DATE "2025-01-14"
|
||||
|
||||
#define GITHUB_LATEST_RELEASE_URL (char*)"https://github.com/technyon/nuki_hub/releases/latest"
|
||||
#define GITHUB_OTA_MANIFEST_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/manifest.json"
|
||||
|
||||
36
src/Gpio.cpp
36
src/Gpio.cpp
@@ -16,12 +16,6 @@ Gpio::Gpio(Preferences* preferences)
|
||||
{
|
||||
_inst = this;
|
||||
loadPinConfiguration();
|
||||
|
||||
if(_preferences->getBool(preference_gpio_locking_enabled, false))
|
||||
{
|
||||
migrateObsoleteSetting();
|
||||
}
|
||||
|
||||
_inst->init();
|
||||
}
|
||||
|
||||
@@ -541,33 +535,3 @@ void Gpio::setPinOutput(const uint8_t& pin, const uint8_t& state)
|
||||
{
|
||||
digitalWrite(pin, state);
|
||||
}
|
||||
|
||||
void Gpio::migrateObsoleteSetting()
|
||||
{
|
||||
_pinConfiguration.clear();
|
||||
|
||||
PinEntry entry1;
|
||||
entry1.pin = 27;
|
||||
entry1.role = PinRole::InputUnlatch;
|
||||
|
||||
PinEntry entry2;
|
||||
entry2.pin = 32;
|
||||
entry2.role = PinRole::InputLock;
|
||||
|
||||
PinEntry entry3;
|
||||
entry3.pin = 33;
|
||||
entry3.role = PinRole::InputUnlock;
|
||||
|
||||
_pinConfiguration.push_back(entry1);
|
||||
_pinConfiguration.push_back(entry2);
|
||||
_pinConfiguration.push_back(entry3);
|
||||
|
||||
savePinConfiguration(_pinConfiguration);
|
||||
|
||||
_preferences->remove(preference_gpio_locking_enabled);
|
||||
Log->println("Migrated gpio control setting");
|
||||
delay(200);
|
||||
restartEsp(RestartReason::GpioConfigurationUpdated);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -59,8 +59,6 @@ public:
|
||||
Gpio(Preferences* preferences);
|
||||
static void init();
|
||||
|
||||
void migrateObsoleteSetting();
|
||||
|
||||
void addCallback(std::function<void(const GpioAction&, const int&)> callback);
|
||||
|
||||
void loadPinConfiguration();
|
||||
|
||||
@@ -772,7 +772,7 @@ void HomeAssistantDiscovery::publishHASSConfigAdditionalLockEntities(char *devic
|
||||
_preferences->getBytes(preference_acl, &aclPrefs, sizeof(aclPrefs));
|
||||
|
||||
uint32_t basicLockConfigAclPrefs[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t advancedLockConfigAclPrefs[23] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t advancedLockConfigAclPrefs[25] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
if(_preferences->getBool(preference_conf_info_enabled, true))
|
||||
{
|
||||
@@ -1878,6 +1878,53 @@ void HomeAssistantDiscovery::publishHASSConfigAdditionalLockEntities(char *devic
|
||||
{
|
||||
removeHassTopic((char*)"switch", (char*)"auto_update_enabled", uidString);
|
||||
}
|
||||
|
||||
// Motor speed
|
||||
if((int)advancedLockConfigAclPrefs[23] == 1)
|
||||
{
|
||||
JsonDocument json;
|
||||
json = createHassJson(uidString, "_motor_speed", "Motor speed", name, baseTopic, String("~") + mqtt_topic_config_advanced_json, deviceType, "", "", "config", String("~") + mqtt_topic_config_action, {{ (char*)"val_tpl", (char*)"{{value_json.motorSpeed}}" }, { (char*)"en", (char*)"true" }, { (char*)"cmd_tpl", (char*)"{ \"motorSpeed\": \"{{ value }}\" }" }});
|
||||
json["options"][0] = "Standard";
|
||||
json["options"][1] = "Insane";
|
||||
json["options"][2] = "Gentle";
|
||||
serializeJson(json, _buffer, _bufferSize);
|
||||
String path = createHassTopicPath("select", "motor_speed", uidString);
|
||||
_device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, _buffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
removeHassTopic((char*)"select", (char*)"motor_speed", uidString);
|
||||
}
|
||||
|
||||
if((int)advancedLockConfigAclPrefs[24] == 1)
|
||||
{
|
||||
// Slow speed during night mode enabled
|
||||
publishHassTopic("switch",
|
||||
"enable_slow_speed_during_nightmode",
|
||||
uidString,
|
||||
"_enable_slow_speed_during_nightmode",
|
||||
"Enable slow speed during nightmode",
|
||||
name,
|
||||
baseTopic,
|
||||
String("~") + mqtt_topic_config_advanced_json,
|
||||
deviceType,
|
||||
"",
|
||||
"",
|
||||
"config",
|
||||
String("~") + mqtt_topic_config_action,
|
||||
{
|
||||
{ (char*)"en", (char*)"true" },
|
||||
{ (char*)"pl_on", (char*)"{ \"enableSlowSpeedDuringNightMode\": \"1\"}" },
|
||||
{ (char*)"pl_off", (char*)"{ \"enableSlowSpeedDuringNightMode\": \"0\"}" },
|
||||
{ (char*)"val_tpl", (char*)"{{value_json.enableSlowSpeedDuringNightMode}}" },
|
||||
{ (char*)"stat_on", (char*)"1" },
|
||||
{ (char*)"stat_off", (char*)"0" }
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
removeHassTopic((char*)"switch", (char*)"enable_slow_speed_during_nightmode", uidString);
|
||||
}
|
||||
|
||||
if((int)advancedLockConfigAclPrefs[22] == 1)
|
||||
{
|
||||
|
||||
@@ -31,12 +31,6 @@ NukiNetwork::NukiNetwork(Preferences *preferences)
|
||||
: _preferences(preferences)
|
||||
#endif
|
||||
{
|
||||
// Remove obsolete W5500 hardware detection configuration
|
||||
if(_preferences->getInt(preference_network_hardware_gpio) != 0)
|
||||
{
|
||||
_preferences->remove(preference_network_hardware_gpio);
|
||||
}
|
||||
|
||||
_inst = this;
|
||||
_webEnabled = _preferences->getBool(preference_webserver_enabled, true);
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ void NukiNetworkLock::initialize()
|
||||
_haEnabled = _preferences->getString(preference_mqtt_hass_discovery, "") != "";
|
||||
_disableNonJSON = _preferences->getBool(preference_disable_non_json, false);
|
||||
_hybridRebootOnDisconnect = _preferences->getBool(preference_hybrid_reboot_on_disconnect, false);
|
||||
_isUltra = _preferences->getBool(preference_lock_gemini_enabled, false);
|
||||
|
||||
_network->initTopic(_mqttPath, mqtt_topic_lock_action, "--");
|
||||
_network->subscribe(_mqttPath, mqtt_topic_lock_action);
|
||||
@@ -532,41 +533,41 @@ void NukiNetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyT
|
||||
json["door_sensor_state"] = str;
|
||||
}
|
||||
|
||||
if (keyTurnerState.network != 255)
|
||||
if (keyTurnerState.remoteAccessStatus != 255)
|
||||
{
|
||||
json["remoteAccessEnabled"] = ((keyTurnerState.network & 1) == 1) ? 1 : 0;
|
||||
json["bridgePaired"] = (((keyTurnerState.network >> 1) & 1) == 1) ? 1 : 0;
|
||||
json["sseConnectedViaWifi"] = (((keyTurnerState.network >> 2) & 1) == 1) ? 1 : 0;
|
||||
json["sseConnectionEstablished"] = (((keyTurnerState.network >> 3) & 1) == 1) ? 1 : 0;
|
||||
json["isSseConnectedViaThread"] = (((keyTurnerState.network >> 4) & 1) == 1) ? 1 : 0;
|
||||
json["threadSseUplinkEnabledByUser"] = (((keyTurnerState.network >> 5) & 1) == 1) ? 1 : 0;
|
||||
json["nat64AvailableViaThread"] = (((keyTurnerState.network >> 6) & 1) == 1) ? 1 : 0;
|
||||
json["remoteAccessEnabled"] = ((keyTurnerState.remoteAccessStatus & 1) == 1) ? 1 : 0;
|
||||
json["bridgePaired"] = (((keyTurnerState.remoteAccessStatus >> 1) & 1) == 1) ? 1 : 0;
|
||||
json["sseConnectedViaWifi"] = (((keyTurnerState.remoteAccessStatus >> 2) & 1) == 1) ? 1 : 0;
|
||||
json["sseConnectionEstablished"] = (((keyTurnerState.remoteAccessStatus >> 3) & 1) == 1) ? 1 : 0;
|
||||
json["isSseConnectedViaThread"] = (((keyTurnerState.remoteAccessStatus >> 4) & 1) == 1) ? 1 : 0;
|
||||
json["threadSseUplinkEnabledByUser"] = (((keyTurnerState.remoteAccessStatus >> 5) & 1) == 1) ? 1 : 0;
|
||||
json["nat64AvailableViaThread"] = (((keyTurnerState.remoteAccessStatus >> 6) & 1) == 1) ? 1 : 0;
|
||||
}
|
||||
if (keyTurnerState.bleConnectionStrength != 255)
|
||||
if (keyTurnerState.bleConnectionStrength != 1)
|
||||
{
|
||||
json["bleConnectionStrength"] = keyTurnerState.bleConnectionStrength;
|
||||
}
|
||||
if (keyTurnerState.wifiConnectionStrength != 255)
|
||||
if (keyTurnerState.wifiConnectionStrength != 1)
|
||||
{
|
||||
json["wifiConnectionStrength"] = keyTurnerState.wifiConnectionStrength;
|
||||
}
|
||||
if (keyTurnerState.wifi != 255)
|
||||
if (keyTurnerState.wifiConnectionStatus != 255)
|
||||
{
|
||||
json["wifiStatus"] = (keyTurnerState.wifi & 3);
|
||||
json["sseStatus"] = ((keyTurnerState.wifi >> 2) & 3);
|
||||
json["wifiQuality"] = ((keyTurnerState.wifi >> 4) & 15);
|
||||
json["wifiStatus"] = (keyTurnerState.wifiConnectionStatus & 3);
|
||||
json["sseStatus"] = ((keyTurnerState.wifiConnectionStatus >> 2) & 3);
|
||||
json["wifiQuality"] = ((keyTurnerState.wifiConnectionStatus >> 4) & 15);
|
||||
}
|
||||
if (keyTurnerState.mqtt != 255)
|
||||
if (keyTurnerState.mqttConnectionStatus != 255)
|
||||
{
|
||||
json["mqttStatus"] = (keyTurnerState.mqtt & 3);
|
||||
json["mqttConnectionChannel"] = ((keyTurnerState.mqtt >> 2) & 1);
|
||||
json["mqttStatus"] = (keyTurnerState.mqttConnectionStatus & 3);
|
||||
json["mqttConnectionChannel"] = ((keyTurnerState.mqttConnectionStatus >> 2) & 1);
|
||||
}
|
||||
if (keyTurnerState.thread != 255)
|
||||
if (keyTurnerState.threadConnectionStatus != 255)
|
||||
{
|
||||
json["threadConnectionStatus"] = (keyTurnerState.thread & 3);
|
||||
json["threadSseStatus"] = ((keyTurnerState.thread >> 2) & 3);
|
||||
json["isCommissioningModeActive"] = (keyTurnerState.thread & 16) != 0 ? 1 : 0;
|
||||
json["isWifiDisabledBecauseOfThread"] = (keyTurnerState.thread & 32) != 0 ? 1 : 0;
|
||||
json["threadConnectionStatus"] = (keyTurnerState.threadConnectionStatus & 3);
|
||||
json["threadSseStatus"] = ((keyTurnerState.threadConnectionStatus >> 2) & 3);
|
||||
json["isCommissioningModeActive"] = (keyTurnerState.threadConnectionStatus & 16) != 0 ? 1 : 0;
|
||||
json["isWifiDisabledBecauseOfThread"] = (keyTurnerState.threadConnectionStatus & 32) != 0 ? 1 : 0;
|
||||
}
|
||||
|
||||
json["auth_id"] = getAuthId();
|
||||
@@ -876,9 +877,8 @@ void NukiNetworkLock::publishConfig(const NukiLock::Config &config)
|
||||
_network->timeZoneIdToString(config.timeZoneId, str);
|
||||
json["timeZone"] = str;
|
||||
json["deviceType"] = (config.deviceType == 255 ? 0 : config.deviceType);
|
||||
json["channel"] = (config.network == 255 ? 0 : config.network);
|
||||
json["wifiCapable"] = (config.network == 255 ? 0 : config.network & 1);
|
||||
json["threadCapable"] = (config.network == 255 ? 0 : ((config.network & 2) != 0 ? 1 : 0));
|
||||
json["wifiCapable"] = (config.capabilities == 255 ? 0 : config.capabilities & 1);
|
||||
json["threadCapable"] = (config.capabilities == 255 ? 0 : ((config.capabilities & 2) != 0 ? 1 : 0));
|
||||
json["matterStatus"] = (config.matterStatus == 255 ? 0 : config.matterStatus);
|
||||
json["productVariant"] = (config.productVariant == 255 ? 0 : config.productVariant);
|
||||
|
||||
@@ -936,6 +936,13 @@ void NukiNetworkLock::publishAdvancedConfig(const NukiLock::AdvancedConfig &conf
|
||||
json["autoLockEnabled"] = config.autoLockEnabled;
|
||||
json["immediateAutoLockEnabled"] = config.immediateAutoLockEnabled;
|
||||
json["autoUpdateEnabled"] = config.autoUpdateEnabled;
|
||||
if (_isUltra)
|
||||
{
|
||||
memset(str, 0, sizeof(str));
|
||||
motorSpeedToString(config.motorSpeed, str);
|
||||
json["motorSpeed"] = str;
|
||||
json["enableSlowSpeedDuringNightMode"] = config.enableSlowSpeedDuringNightMode;
|
||||
}
|
||||
json["rebootNuki"] = 0;
|
||||
|
||||
serializeJson(json, _buffer, _bufferSize);
|
||||
@@ -1659,6 +1666,25 @@ void NukiNetworkLock::buttonPressActionToString(const NukiLock::ButtonPressActio
|
||||
}
|
||||
}
|
||||
|
||||
void NukiNetworkLock::motorSpeedToString(const NukiLock::MotorSpeed speed, char* str)
|
||||
{
|
||||
switch (speed)
|
||||
{
|
||||
case NukiLock::MotorSpeed::Standard:
|
||||
strcpy(str, "Standard");
|
||||
break;
|
||||
case NukiLock::MotorSpeed::Insane:
|
||||
strcpy(str, "Insane");
|
||||
break;
|
||||
case NukiLock::MotorSpeed::Gentle:
|
||||
strcpy(str, "Gentle");
|
||||
break;
|
||||
default:
|
||||
strcpy(str, "undefined");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void NukiNetworkLock::homeKitStatusToString(const int hkstatus, char* str)
|
||||
{
|
||||
switch (hkstatus)
|
||||
|
||||
@@ -68,6 +68,7 @@ private:
|
||||
|
||||
void publishKeypadEntry(const String topic, NukiLock::KeypadEntry entry);
|
||||
void buttonPressActionToString(const NukiLock::ButtonPressAction btnPressAction, char* str);
|
||||
void motorSpeedToString(const NukiLock::MotorSpeed speed, char* str);
|
||||
void homeKitStatusToString(const int hkstatus, char* str);
|
||||
void fobActionToString(const int fobact, char* str);
|
||||
|
||||
@@ -90,6 +91,7 @@ private:
|
||||
bool _disableNonJSON = false;
|
||||
bool _offConnected = false;
|
||||
bool _hybridRebootOnDisconnect = false;
|
||||
bool _isUltra = false;
|
||||
|
||||
String _keypadCommandName = "";
|
||||
String _keypadCommandCode = "";
|
||||
|
||||
@@ -60,7 +60,7 @@ void NukiWrapper::initialize()
|
||||
_nukiLock.setDebugCommand(_preferences->getBool(preference_debug_command, false));
|
||||
_nukiLock.registerLogger(Log);
|
||||
|
||||
if (_preferences->getInt(preference_lock_gemini_pin, 0) > 0)
|
||||
if (_preferences->getInt(preference_lock_gemini_pin, 0) > 0 && _preferences->getBool(preference_lock_gemini_enabled, false))
|
||||
{
|
||||
_nukiLock.saveUltraPincode(_preferences->getInt(preference_lock_gemini_pin, 0), false);
|
||||
}
|
||||
@@ -135,6 +135,7 @@ void NukiWrapper::readSettings()
|
||||
_forceDoorsensor = _preferences->getBool(preference_lock_force_doorsensor, false);
|
||||
_forceKeypad = _preferences->getBool(preference_lock_force_keypad, false);
|
||||
_forceId = _preferences->getBool(preference_lock_force_id, false);
|
||||
_isUltra = _preferences->getBool(preference_lock_gemini_enabled, false);
|
||||
|
||||
_preferences->getBytes(preference_conf_lock_basic_acl, &_basicLockConfigaclPrefs, sizeof(_basicLockConfigaclPrefs));
|
||||
_preferences->getBytes(preference_conf_lock_advanced_acl, &_advancedLockConfigaclPrefs, sizeof(_advancedLockConfigaclPrefs));
|
||||
@@ -428,7 +429,14 @@ void NukiWrapper::lockngounlatch()
|
||||
|
||||
bool NukiWrapper::isPinSet()
|
||||
{
|
||||
return _nukiLock.getSecurityPincode() != 0;
|
||||
if (_isUltra)
|
||||
{
|
||||
return _nukiLock.getUltraPincode() != 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return _nukiLock.getSecurityPincode() != 0;
|
||||
}
|
||||
}
|
||||
|
||||
bool NukiWrapper::isPinValid()
|
||||
@@ -441,11 +449,21 @@ void NukiWrapper::setPin(const uint16_t pin)
|
||||
_nukiLock.saveSecurityPincode(pin);
|
||||
}
|
||||
|
||||
void NukiWrapper::setUltraPin(const uint32_t pin)
|
||||
{
|
||||
_nukiLock.saveUltraPincode(pin);
|
||||
}
|
||||
|
||||
uint16_t NukiWrapper::getPin()
|
||||
{
|
||||
return _nukiLock.getSecurityPincode();
|
||||
}
|
||||
|
||||
uint32_t NukiWrapper::getUltraPin()
|
||||
{
|
||||
return _nukiLock.getUltraPincode();
|
||||
}
|
||||
|
||||
void NukiWrapper::unpair()
|
||||
{
|
||||
_nukiLock.unPairNuki();
|
||||
@@ -1422,6 +1440,23 @@ Nuki::BatteryType NukiWrapper::batteryTypeToEnum(const char* str)
|
||||
return (Nuki::BatteryType)0xff;
|
||||
}
|
||||
|
||||
NukiLock::MotorSpeed NukiWrapper::motorSpeedToEnum(const char* str)
|
||||
{
|
||||
if(strcmp(str, "Standard") == 0)
|
||||
{
|
||||
return NukiLock::MotorSpeed::Standard;
|
||||
}
|
||||
else if(strcmp(str, "Insane") == 0)
|
||||
{
|
||||
return NukiLock::MotorSpeed::Insane;
|
||||
}
|
||||
else if(strcmp(str, "Gentle") == 0)
|
||||
{
|
||||
return NukiLock::MotorSpeed::Gentle;
|
||||
}
|
||||
return (NukiLock::MotorSpeed)0xff;
|
||||
}
|
||||
|
||||
void NukiWrapper::onOfficialUpdateReceived(const char *topic, const char *value)
|
||||
{
|
||||
_nukiOfficial->onOfficialUpdateReceived(topic, value);
|
||||
@@ -1465,7 +1500,7 @@ void NukiWrapper::onConfigUpdateReceived(const char *value)
|
||||
|
||||
Nuki::CmdResult cmdResult;
|
||||
const char *basicKeys[16] = {"name", "latitude", "longitude", "autoUnlatch", "pairingEnabled", "buttonEnabled", "ledEnabled", "ledBrightness", "timeZoneOffset", "dstMode", "fobAction1", "fobAction2", "fobAction3", "singleLock", "advertisingMode", "timeZone"};
|
||||
const char *advancedKeys[23] = {"unlockedPositionOffsetDegrees", "lockedPositionOffsetDegrees", "singleLockedPositionOffsetDegrees", "unlockedToLockedTransitionOffsetDegrees", "lockNgoTimeout", "singleButtonPressAction", "doubleButtonPressAction", "detachedCylinder", "batteryType", "automaticBatteryTypeDetection", "unlatchDuration", "autoLockTimeOut", "autoUnLockDisabled", "nightModeEnabled", "nightModeStartTime", "nightModeEndTime", "nightModeAutoLockEnabled", "nightModeAutoUnlockDisabled", "nightModeImmediateLockOnStart", "autoLockEnabled", "immediateAutoLockEnabled", "autoUpdateEnabled", "rebootNuki"};
|
||||
const char *advancedKeys[25] = {"unlockedPositionOffsetDegrees", "lockedPositionOffsetDegrees", "singleLockedPositionOffsetDegrees", "unlockedToLockedTransitionOffsetDegrees", "lockNgoTimeout", "singleButtonPressAction", "doubleButtonPressAction", "detachedCylinder", "batteryType", "automaticBatteryTypeDetection", "unlatchDuration", "autoLockTimeOut", "autoUnLockDisabled", "nightModeEnabled", "nightModeStartTime", "nightModeEndTime", "nightModeAutoLockEnabled", "nightModeAutoUnlockDisabled", "nightModeImmediateLockOnStart", "autoLockEnabled", "immediateAutoLockEnabled", "autoUpdateEnabled", "rebootNuki", "motorSpeed", "enableSlowSpeedDuringNightMode"};
|
||||
bool basicUpdated = false;
|
||||
bool advancedUpdated = false;
|
||||
|
||||
@@ -1857,7 +1892,7 @@ void NukiWrapper::onConfigUpdateReceived(const char *value)
|
||||
}
|
||||
}
|
||||
|
||||
for(int j=0; j < 23; j++)
|
||||
for(int j=0; j < 25; j++)
|
||||
{
|
||||
if(json[advancedKeys[j]].is<JsonVariantConst>())
|
||||
{
|
||||
@@ -2354,6 +2389,46 @@ void NukiWrapper::onConfigUpdateReceived(const char *value)
|
||||
jsonResult[advancedKeys[j]] = "invalidValue";
|
||||
}
|
||||
}
|
||||
else if(strcmp(advancedKeys[j], "motorSpeed") == 0)
|
||||
{
|
||||
NukiLock::MotorSpeed motorSpeed = nukiInst->motorSpeedToEnum(jsonchar);
|
||||
|
||||
if((int)motorSpeed != 0xff)
|
||||
{
|
||||
if(_nukiAdvancedConfig.motorSpeed == motorSpeed)
|
||||
{
|
||||
jsonResult[advancedKeys[j]] = "unchanged";
|
||||
}
|
||||
else
|
||||
{
|
||||
cmdResult = _nukiLock.setMotorSpeed(motorSpeed);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
jsonResult[advancedKeys[j]] = "invalidValue";
|
||||
}
|
||||
}
|
||||
else if(strcmp(advancedKeys[j], "enableSlowSpeedDuringNightMode") == 0)
|
||||
{
|
||||
const uint8_t keyvalue = atoi(jsonchar);
|
||||
|
||||
if(keyvalue == 0 || keyvalue == 1)
|
||||
{
|
||||
if(_nukiAdvancedConfig.enableSlowSpeedDuringNightMode == keyvalue)
|
||||
{
|
||||
jsonResult[advancedKeys[j]] = "unchanged";
|
||||
}
|
||||
else
|
||||
{
|
||||
cmdResult = _nukiLock.enableSlowSpeedDuringNightMode((keyvalue > 0));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
jsonResult[advancedKeys[j]] = "invalidValue";
|
||||
}
|
||||
}
|
||||
|
||||
if(cmdResult != Nuki::CmdResult::Success)
|
||||
{
|
||||
|
||||
@@ -30,7 +30,9 @@ public:
|
||||
bool isPinSet();
|
||||
bool isPinValid();
|
||||
void setPin(const uint16_t pin);
|
||||
void setUltraPin(const uint32_t pin);
|
||||
uint16_t getPin();
|
||||
uint32_t getUltraPin();
|
||||
void unpair();
|
||||
|
||||
void disableWatchdog();
|
||||
@@ -88,6 +90,7 @@ private:
|
||||
uint8_t fobActionToInt(const char *str);
|
||||
NukiLock::ButtonPressAction buttonPressActionToEnum(const char* str);
|
||||
Nuki::BatteryType batteryTypeToEnum(const char* str);
|
||||
NukiLock::MotorSpeed motorSpeedToEnum(const char* str);
|
||||
|
||||
std::string _deviceName;
|
||||
NukiDeviceId* _deviceId = nullptr;
|
||||
@@ -137,6 +140,7 @@ private:
|
||||
bool _forceKeypad = false;
|
||||
bool _keypadEnabled = false;
|
||||
bool _forceId = false;
|
||||
bool _isUltra = false;
|
||||
uint _maxKeypadCodeCount = 0;
|
||||
uint _maxTimeControlEntryCount = 0;
|
||||
uint _maxAuthEntryCount = 0;
|
||||
@@ -160,7 +164,7 @@ private:
|
||||
int64_t _lastRssi = 0;
|
||||
int64_t _disableBleWatchdogTs = 0;
|
||||
uint32_t _basicLockConfigaclPrefs[16];
|
||||
uint32_t _advancedLockConfigaclPrefs[23];
|
||||
uint32_t _advancedLockConfigaclPrefs[25];
|
||||
std::string _firmwareVersion = "";
|
||||
std::string _hardwareVersion = "";
|
||||
volatile NukiLock::LockAction _nextLockAction = (NukiLock::LockAction)0xff;
|
||||
|
||||
@@ -74,10 +74,10 @@
|
||||
#define preference_update_time (char*)"updateTime"
|
||||
#define preference_mqtt_ssl_enabled (char*)"mqttSSLena"
|
||||
#define preference_lock_gemini_pin (char*)"geminiPin"
|
||||
#define preference_lock_gemini_enabled (char*)"geminiena"
|
||||
|
||||
// CHANGE DOES NOT REQUIRE REBOOT TO TAKE EFFECT
|
||||
#define preference_find_best_rssi (char*)"nwbestrssi"
|
||||
#define preference_ntw_reconfigure (char*)"ntwRECONF"
|
||||
#define preference_auth_max_entries (char*)"authmaxentry"
|
||||
#define preference_auth_info_enabled (char*)"authInfoEna"
|
||||
#define preference_auth_topic_per_entry (char*)"authPerEntry"
|
||||
@@ -128,6 +128,7 @@
|
||||
#define preference_hybrid_reboot_on_disconnect (char*)"hybridRbtLck"
|
||||
|
||||
//NOT USER CHANGABLE
|
||||
#define preference_ntw_reconfigure (char*)"ntwRECONF"
|
||||
#define preference_updater_version (char*)"updVer"
|
||||
#define preference_updater_build (char*)"updBuild"
|
||||
#define preference_updater_date (char*)"updDate"
|
||||
@@ -151,10 +152,6 @@
|
||||
|
||||
//OBSOLETE
|
||||
#define preference_access_level (char*)"accLvl"
|
||||
#define preference_gpio_locking_enabled (char*)"gpiolck"
|
||||
#define preference_network_hardware_gpio (char*)"nwhwdt"
|
||||
#define preference_presence_detection_timeout (char*)"prdtimeout"
|
||||
#define preference_network_wifi_fallback_disabled (char*)"nwwififb"
|
||||
#define preference_mqtt_opener_path (char*)"mqttoppath"
|
||||
|
||||
inline void initPreferences(Preferences* preferences)
|
||||
@@ -176,7 +173,7 @@ inline void initPreferences(Preferences* preferences)
|
||||
preferences->putBytes(preference_conf_lock_basic_acl, (byte*)(&basicLockConfigAclPrefs), sizeof(basicLockConfigAclPrefs));
|
||||
uint32_t basicOpenerConfigAclPrefs[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_opener_basic_acl, (byte*)(&basicOpenerConfigAclPrefs), sizeof(basicOpenerConfigAclPrefs));
|
||||
uint32_t advancedLockConfigAclPrefs[23] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t advancedLockConfigAclPrefs[25] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_lock_advanced_acl, (byte*)(&advancedLockConfigAclPrefs), sizeof(advancedLockConfigAclPrefs));
|
||||
uint32_t advancedOpenerConfigAclPrefs[21] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_opener_advanced_acl, (byte*)(&advancedOpenerConfigAclPrefs), sizeof(advancedOpenerConfigAclPrefs));
|
||||
@@ -207,6 +204,7 @@ inline void initPreferences(Preferences* preferences)
|
||||
preferences->putBool(preference_register_as_app, false);
|
||||
preferences->putBool(preference_register_opener_as_app, false);
|
||||
preferences->putBool(preference_mqtt_ssl_enabled, false);
|
||||
preferences->putBool(preference_lock_gemini_enabled, false);
|
||||
|
||||
preferences->putInt(preference_mqtt_broker_port, 1883);
|
||||
preferences->putInt(preference_buffer_size, CHAR_BUFFER_SIZE);
|
||||
@@ -276,7 +274,7 @@ inline void initPreferences(Preferences* preferences)
|
||||
preferences->putBytes(preference_conf_lock_basic_acl, (byte*)(&basicLockConfigAclPrefs), sizeof(basicLockConfigAclPrefs));
|
||||
uint32_t basicOpenerConfigAclPrefs[14] = {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_opener_basic_acl, (byte*)(&basicOpenerConfigAclPrefs), sizeof(basicOpenerConfigAclPrefs));
|
||||
uint32_t advancedLockConfigAclPrefs[23] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0};
|
||||
uint32_t advancedLockConfigAclPrefs[25] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_lock_advanced_acl, (byte*)(&advancedLockConfigAclPrefs), sizeof(advancedLockConfigAclPrefs));
|
||||
uint32_t advancedOpenerConfigAclPrefs[21] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_opener_advanced_acl, (byte*)(&advancedOpenerConfigAclPrefs), sizeof(advancedOpenerConfigAclPrefs));
|
||||
@@ -291,7 +289,7 @@ inline void initPreferences(Preferences* preferences)
|
||||
preferences->putBytes(preference_conf_lock_basic_acl, (byte*)(&basicLockConfigAclPrefs), sizeof(basicLockConfigAclPrefs));
|
||||
uint32_t basicOpenerConfigAclPrefs[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_opener_basic_acl, (byte*)(&basicOpenerConfigAclPrefs), sizeof(basicOpenerConfigAclPrefs));
|
||||
uint32_t advancedLockConfigAclPrefs[23] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t advancedLockConfigAclPrefs[25] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_lock_advanced_acl, (byte*)(&advancedLockConfigAclPrefs), sizeof(advancedLockConfigAclPrefs));
|
||||
uint32_t advancedOpenerConfigAclPrefs[21] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_opener_advanced_acl, (byte*)(&advancedOpenerConfigAclPrefs), sizeof(advancedOpenerConfigAclPrefs));
|
||||
@@ -306,7 +304,7 @@ inline void initPreferences(Preferences* preferences)
|
||||
preferences->putBytes(preference_conf_lock_basic_acl, (byte*)(&basicLockConfigAclPrefs), sizeof(basicLockConfigAclPrefs));
|
||||
uint32_t basicOpenerConfigAclPrefs[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_opener_basic_acl, (byte*)(&basicOpenerConfigAclPrefs), sizeof(basicOpenerConfigAclPrefs));
|
||||
uint32_t advancedLockConfigAclPrefs[23] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t advancedLockConfigAclPrefs[25] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_lock_advanced_acl, (byte*)(&advancedLockConfigAclPrefs), sizeof(advancedLockConfigAclPrefs));
|
||||
uint32_t advancedOpenerConfigAclPrefs[21] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_opener_advanced_acl, (byte*)(&advancedOpenerConfigAclPrefs), sizeof(advancedOpenerConfigAclPrefs));
|
||||
@@ -321,7 +319,7 @@ inline void initPreferences(Preferences* preferences)
|
||||
preferences->putBytes(preference_conf_lock_basic_acl, (byte*)(&basicLockConfigAclPrefs), sizeof(basicLockConfigAclPrefs));
|
||||
uint32_t basicOpenerConfigAclPrefs[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_opener_basic_acl, (byte*)(&basicOpenerConfigAclPrefs), sizeof(basicOpenerConfigAclPrefs));
|
||||
uint32_t advancedLockConfigAclPrefs[23] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t advancedLockConfigAclPrefs[25] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_lock_advanced_acl, (byte*)(&advancedLockConfigAclPrefs), sizeof(advancedLockConfigAclPrefs));
|
||||
uint32_t advancedOpenerConfigAclPrefs[21] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
preferences->putBytes(preference_conf_opener_advanced_acl, (byte*)(&advancedOpenerConfigAclPrefs), sizeof(advancedOpenerConfigAclPrefs));
|
||||
@@ -336,7 +334,7 @@ inline void initPreferences(Preferences* preferences)
|
||||
preferences->putBytes(preference_conf_lock_basic_acl, (byte*)(&basicLockConfigAclPrefs), sizeof(basicLockConfigAclPrefs));
|
||||
uint32_t basicOpenerConfigAclPrefs[14] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
||||
preferences->putBytes(preference_conf_opener_basic_acl, (byte*)(&basicOpenerConfigAclPrefs), sizeof(basicOpenerConfigAclPrefs));
|
||||
uint32_t advancedLockConfigAclPrefs[23] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
||||
uint32_t advancedLockConfigAclPrefs[25] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
||||
preferences->putBytes(preference_conf_lock_advanced_acl, (byte*)(&advancedLockConfigAclPrefs), sizeof(advancedLockConfigAclPrefs));
|
||||
uint32_t advancedOpenerConfigAclPrefs[21] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
|
||||
preferences->putBytes(preference_conf_opener_advanced_acl, (byte*)(&advancedOpenerConfigAclPrefs), sizeof(advancedOpenerConfigAclPrefs));
|
||||
@@ -483,7 +481,7 @@ private:
|
||||
preference_cred_password, preference_disable_non_json, preference_publish_authdata, preference_publish_debug_info, preference_mqtt_ssl_enabled,
|
||||
preference_official_hybrid_enabled, preference_query_interval_hybrid_lockstate, preference_official_hybrid_actions, preference_official_hybrid_retry,
|
||||
preference_task_size_network, preference_task_size_nuki, preference_authlog_max_entries, preference_keypad_max_entries, preference_timecontrol_max_entries,
|
||||
preference_update_from_mqtt, preference_show_secrets, preference_ble_tx_power, preference_webserial_enabled, preference_find_best_rssi,
|
||||
preference_update_from_mqtt, preference_show_secrets, preference_ble_tx_power, preference_webserial_enabled, preference_find_best_rssi, preference_lock_gemini_enabled,
|
||||
preference_network_custom_mdc, preference_network_custom_clk, preference_network_custom_phy, preference_network_custom_addr, preference_network_custom_irq,
|
||||
preference_network_custom_rst, preference_network_custom_cs, preference_network_custom_sck, preference_network_custom_miso, preference_network_custom_mosi,
|
||||
preference_network_custom_pwr, preference_network_custom_mdio, preference_ntw_reconfigure, preference_lock_max_auth_entry_count, preference_opener_max_auth_entry_count,
|
||||
@@ -509,7 +507,7 @@ private:
|
||||
preference_ntw_reconfigure, preference_keypad_check_code_enabled, preference_disable_network_not_connected, preference_find_best_rssi, preference_http_auth_type,
|
||||
preference_debug_connect, preference_debug_communication, preference_debug_readable_data, preference_debug_hex_data, preference_debug_command, preference_connect_mode,
|
||||
preference_lock_force_id, preference_lock_force_doorsensor, preference_lock_force_keypad, preference_opener_force_id, preference_opener_force_keypad, preference_mqtt_ssl_enabled,
|
||||
preference_hybrid_reboot_on_disconnect
|
||||
preference_hybrid_reboot_on_disconnect, preference_lock_gemini_enabled
|
||||
};
|
||||
std::vector<char*> _bytePrefs =
|
||||
{
|
||||
|
||||
@@ -1613,7 +1613,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
|
||||
unsigned char authorizationId[4] = {0x00};
|
||||
unsigned char secretKeyK[32] = {0x00};
|
||||
unsigned char pincode[2] = {0x00};
|
||||
unsigned char ultraPincode[4] = {0x00};
|
||||
unsigned char ultraPincode[4] = {0x00};
|
||||
bool isUltra = false;
|
||||
unsigned char currentBleAddressOpn[6];
|
||||
unsigned char authorizationIdOpn[4] = {0x00};
|
||||
@@ -1622,7 +1622,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
|
||||
uint32_t aclPrefs[17] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t basicLockConfigAclPrefs[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t basicOpenerConfigAclPrefs[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t advancedLockConfigAclPrefs[23] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t advancedLockConfigAclPrefs[25] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t advancedOpenerConfigAclPrefs[21] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
int params = request->params();
|
||||
@@ -2032,16 +2032,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "NWHWWIFIFB")
|
||||
{
|
||||
if(_preferences->getBool(preference_network_wifi_fallback_disabled, false) != (value == "1"))
|
||||
{
|
||||
_preferences->putBool(preference_network_wifi_fallback_disabled, (value == "1"));
|
||||
Log->print(("Setting changed: "));
|
||||
Log->println(key);
|
||||
//configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "RSSI")
|
||||
{
|
||||
if(_preferences->getInt(preference_rssi_publish_interval, 60) != value.toInt())
|
||||
@@ -2587,16 +2577,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "GEMINIPIN")
|
||||
{
|
||||
if(_preferences->getInt(preference_lock_gemini_pin, 0) != value.toInt())
|
||||
{
|
||||
_preferences->putInt(preference_lock_gemini_pin, value.toInt());
|
||||
Log->print(F("Setting changed: "));
|
||||
Log->println(key);
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "LCKFORCEID")
|
||||
{
|
||||
if(_preferences->getBool(preference_lock_force_id, false) != (value == "1"))
|
||||
@@ -3010,6 +2990,14 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
|
||||
{
|
||||
advancedLockConfigAclPrefs[22] = ((value == "1") ? 1 : 0);
|
||||
}
|
||||
else if(key == "CONFLCKMTRSPD")
|
||||
{
|
||||
advancedLockConfigAclPrefs[23] = ((value == "1") ? 1 : 0);
|
||||
}
|
||||
else if(key == "CONFLCKESSDNM")
|
||||
{
|
||||
advancedLockConfigAclPrefs[24] = ((value == "1") ? 1 : 0);
|
||||
}
|
||||
else if(key == "CONFOPNNAME")
|
||||
{
|
||||
basicOpenerConfigAclPrefs[0] = ((value == "1") ? 1 : 0);
|
||||
@@ -3180,6 +3168,23 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "GEMINIENA")
|
||||
{
|
||||
if(_preferences->getBool(preference_lock_gemini_enabled, false) != (value == "1"))
|
||||
{
|
||||
_preferences->putBool(preference_lock_gemini_enabled, (value == "1"));
|
||||
if (value == "1")
|
||||
{
|
||||
_preferences->putBool(preference_register_as_app, true);
|
||||
_preferences->putBool(preference_lock_enabled, true);
|
||||
_preferences->putBool(preference_official_hybrid_enabled, true);
|
||||
_preferences->putBool(preference_official_hybrid_actions, true);
|
||||
}
|
||||
Log->print(("Setting changed: "));
|
||||
Log->println(key);
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "OPENA")
|
||||
{
|
||||
if(_preferences->getBool(preference_opener_enabled, false) != (value == "1"))
|
||||
@@ -3229,21 +3234,45 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
|
||||
{
|
||||
if(value == "#")
|
||||
{
|
||||
message = "Nuki Lock PIN cleared";
|
||||
_nuki->setPin(0xffff);
|
||||
if (_preferences->getBool(preference_lock_gemini_enabled, false))
|
||||
{
|
||||
message = "Nuki Lock Ultra PIN cleared";
|
||||
_nuki->setUltraPin(0xffffffff);
|
||||
_preferences->putInt(preference_lock_gemini_pin, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
message = "Nuki Lock PIN cleared";
|
||||
_nuki->setPin(0xffff);
|
||||
}
|
||||
Log->print(("Setting changed: "));
|
||||
Log->println(key);
|
||||
configChanged = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(_nuki->getPin() != value.toInt())
|
||||
if (_preferences->getBool(preference_lock_gemini_enabled, false))
|
||||
{
|
||||
message = "Nuki Lock PIN saved";
|
||||
_nuki->setPin(value.toInt());
|
||||
Log->print(("Setting changed: "));
|
||||
Log->println(key);
|
||||
configChanged = true;
|
||||
if(_nuki->getUltraPin() != value.toInt())
|
||||
{
|
||||
message = "Nuki Lock Ultra PIN saved";
|
||||
_nuki->setUltraPin(value.toInt());
|
||||
_preferences->putInt(preference_lock_gemini_pin, value.toInt());
|
||||
Log->print(("Setting changed: "));
|
||||
Log->println(key);
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(_nuki->getPin() != value.toInt())
|
||||
{
|
||||
message = "Nuki Lock PIN saved";
|
||||
_nuki->setPin(value.toInt());
|
||||
Log->print(("Setting changed: "));
|
||||
Log->println(key);
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3298,6 +3327,10 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
|
||||
authorizationId[(i/2)] = std::stoi(value.substring(i, i+2).c_str(), nullptr, 16);
|
||||
}
|
||||
}
|
||||
else if(key == "LCKISULTRA" && (value == "1"))
|
||||
{
|
||||
isUltra = true;
|
||||
}
|
||||
else if(key == "OPNBLEADDR")
|
||||
{
|
||||
if(value.length() == 12) for(int i=0; i<value.length(); i+=2)
|
||||
@@ -3410,7 +3443,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
|
||||
{
|
||||
uint32_t curAclPrefs[17] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t curBasicLockConfigAclPrefs[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t curAdvancedLockConfigAclPrefs[23] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t curAdvancedLockConfigAclPrefs[25] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t curBasicOpenerConfigAclPrefs[14] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
uint32_t curAdvancedOpenerConfigAclPrefs[21] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
_preferences->getBytes(preference_acl, &curAclPrefs, sizeof(curAclPrefs));
|
||||
@@ -3441,7 +3474,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
|
||||
break;
|
||||
}
|
||||
}
|
||||
for(int i=0; i < 23; i++)
|
||||
for(int i=0; i < 25; i++)
|
||||
{
|
||||
if(curAdvancedLockConfigAclPrefs[i] != advancedLockConfigAclPrefs[i])
|
||||
{
|
||||
@@ -3662,6 +3695,13 @@ bool WebCfgServer::processImport(PsychicRequest *request, PsychicResponse* resp,
|
||||
nukiBlePref.putBytes("authorizationId", authorizationId, 4);
|
||||
}
|
||||
}
|
||||
if(!doc["isUltra"].isNull())
|
||||
{
|
||||
if (doc["isUltra"].as<String>().length() >0)
|
||||
{
|
||||
nukiBlePref.putBool("isUltra", (doc["isUltra"].as<String>() == "1" ? true : false));
|
||||
}
|
||||
}
|
||||
nukiBlePref.end();
|
||||
if(!doc["securityPinCodeLock"].isNull() && _nuki != nullptr)
|
||||
{
|
||||
@@ -3674,6 +3714,19 @@ bool WebCfgServer::processImport(PsychicRequest *request, PsychicResponse* resp,
|
||||
_nuki->setPin(0xffff);
|
||||
}
|
||||
}
|
||||
if(!doc["ultraPinCodeLock"].isNull() && _nuki != nullptr)
|
||||
{
|
||||
if(doc["ultraPinCodeLock"].as<String>().length() > 0)
|
||||
{
|
||||
_nuki->setUltraPin(doc["ultraPinCodeLock"].as<int>());
|
||||
_preferences->putInt(preference_lock_gemini_pin, doc["ultraPinCodeLock"].as<int>());
|
||||
}
|
||||
else
|
||||
{
|
||||
_nuki->setUltraPin(0xffffffff);
|
||||
_preferences->putInt(preference_lock_gemini_pin, 0);
|
||||
}
|
||||
}
|
||||
nukiBlePref.begin("NukiHubopener", false);
|
||||
if(!doc["bleAddressOpener"].isNull())
|
||||
{
|
||||
@@ -4339,6 +4392,7 @@ esp_err_t WebCfgServer::buildAdvancedConfigHtml(PsychicRequest *request, Psychic
|
||||
printInputField(&response, "LCKBLEADDR", "currentBleAddress", "", 12, "");
|
||||
printInputField(&response, "LCKSECRETK", "secretKeyK", "", 64, "");
|
||||
printInputField(&response, "LCKAUTHID", "authorizationId", "", 8, "");
|
||||
printCheckBox(&response, "LCKISULTRA", "isUltra", false, "");
|
||||
}
|
||||
if(_preferences->getBool(preference_opener_enabled, false))
|
||||
{
|
||||
@@ -4377,8 +4431,6 @@ esp_err_t WebCfgServer::buildAdvancedConfigHtml(PsychicRequest *request, Psychic
|
||||
printCheckBox(&response, "DBGREAD", "Enable Nuki readable data debug logging", _preferences->getBool(preference_debug_readable_data, false), "");
|
||||
printCheckBox(&response, "DBGHEX", "Enable Nuki hex data debug logging", _preferences->getBool(preference_debug_hex_data, false), "");
|
||||
printCheckBox(&response, "DBGCOMM", "Enable Nuki command debug logging", _preferences->getBool(preference_debug_command, false), "");
|
||||
printInputField(&response, "GEMINIPIN", "SmartLock Ultra PIN", _preferences->getInt(preference_lock_gemini_pin, 0), 6, "");
|
||||
|
||||
response.print("</table>");
|
||||
|
||||
response.print("<br><input type=\"submit\" name=\"submit\" value=\"Save\">");
|
||||
@@ -4544,7 +4596,7 @@ esp_err_t WebCfgServer::buildAccLvlHtml(PsychicRequest *request, PsychicResponse
|
||||
{
|
||||
uint32_t basicLockConfigAclPrefs[16];
|
||||
_preferences->getBytes(preference_conf_lock_basic_acl, &basicLockConfigAclPrefs, sizeof(basicLockConfigAclPrefs));
|
||||
uint32_t advancedLockConfigAclPrefs[23];
|
||||
uint32_t advancedLockConfigAclPrefs[25];
|
||||
_preferences->getBytes(preference_conf_lock_advanced_acl, &advancedLockConfigAclPrefs, sizeof(advancedLockConfigAclPrefs));
|
||||
|
||||
response.print("<h3>Nuki Lock Access Control</h3>");
|
||||
@@ -4612,6 +4664,8 @@ esp_err_t WebCfgServer::buildAccLvlHtml(PsychicRequest *request, PsychicResponse
|
||||
printCheckBox(&response, "CONFLCKIALENA", "Immediate auto lock enabled", ((int)advancedLockConfigAclPrefs[20] == 1), "chk_config_lock");
|
||||
printCheckBox(&response, "CONFLCKAUENA", "Auto update enabled", ((int)advancedLockConfigAclPrefs[21] == 1), "chk_config_lock");
|
||||
printCheckBox(&response, "CONFLCKRBTNUKI", "Reboot Nuki", ((int)advancedLockConfigAclPrefs[22] == 1), "chk_config_lock");
|
||||
printCheckBox(&response, "CONFLCKMTRSPD", "Motor speed", ((int)advancedLockConfigAclPrefs[23] == 1), "chk_config_lock");
|
||||
printCheckBox(&response, "CONFLCKESSDNM", "Enable slow speed during nightmode", ((int)advancedLockConfigAclPrefs[24] == 1), "chk_config_lock");
|
||||
response.print("</table><br>");
|
||||
response.print("<br><input type=\"submit\" name=\"submit\" value=\"Save\">");
|
||||
}
|
||||
@@ -4699,8 +4753,9 @@ esp_err_t WebCfgServer::buildNukiConfigHtml(PsychicRequest *request, PsychicResp
|
||||
response.print("<input type=\"hidden\" name=\"page\" value=\"savecfg\">");
|
||||
response.print("<h3>Basic Nuki Configuration</h3>");
|
||||
response.print("<table>");
|
||||
printCheckBox(&response, "LOCKENA", "Nuki Lock enabled", _preferences->getBool(preference_lock_enabled), "");
|
||||
printCheckBox(&response, "OPENA", "Nuki Opener enabled", _preferences->getBool(preference_opener_enabled), "");
|
||||
printCheckBox(&response, "LOCKENA", "Nuki Lock enabled", _preferences->getBool(preference_lock_enabled, true), "");
|
||||
printCheckBox(&response, "GEMINIENA", "Nuki Smartlock Ultra enabled", _preferences->getBool(preference_lock_gemini_enabled, false), "");
|
||||
printCheckBox(&response, "OPENA", "Nuki Opener enabled", _preferences->getBool(preference_opener_enabled, false), "");
|
||||
printCheckBox(&response, "CONNMODE", "New Nuki Bluetooth connection mode (disable if there are connection issues)", _preferences->getBool(preference_connect_mode, true), "");
|
||||
response.print("</table><br>");
|
||||
response.print("<h3>Advanced Nuki Configuration</h3>");
|
||||
@@ -4715,7 +4770,7 @@ esp_err_t WebCfgServer::buildNukiConfigHtml(PsychicRequest *request, PsychicResp
|
||||
}
|
||||
printInputField(&response, "NRTRY", "Number of retries if command failed", _preferences->getInt(preference_command_nr_of_retries), 10, "");
|
||||
printInputField(&response, "TRYDLY", "Delay between retries (milliseconds)", _preferences->getInt(preference_command_retry_delay), 10, "");
|
||||
if(_preferences->getBool(preference_lock_enabled, true))
|
||||
if(_preferences->getBool(preference_lock_enabled, true) && !_preferences->getBool(preference_lock_gemini_enabled, false))
|
||||
{
|
||||
printCheckBox(&response, "REGAPP", "Lock: Nuki Bridge is running alongside Nuki Hub (needs re-pairing if changed)", _preferences->getBool(preference_register_as_app), "");
|
||||
}
|
||||
@@ -4885,6 +4940,8 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
response.print(_preferences->getString(preference_cred_user, "").length() > 0 ? "***" : "Not set");
|
||||
response.print("\nWeb configurator password: ");
|
||||
response.print(_preferences->getString(preference_cred_password, "").length() > 0 ? "***" : "Not set");
|
||||
response.print("\nWeb configurator authentication: ");
|
||||
response.print(_preferences->getBool(preference_http_auth_type, false) ? "Digest" : "Basic");
|
||||
response.print("\nWeb configurator enabled: ");
|
||||
response.print(_preferences->getBool(preference_webserver_enabled, true) ? "Yes" : "No");
|
||||
response.print("\nHTTP SSL: ");
|
||||
@@ -4912,6 +4969,16 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
#endif
|
||||
response.print("\nPublish debug information enabled: ");
|
||||
response.print(_preferences->getBool(preference_publish_debug_info, false) ? "Yes" : "No");
|
||||
response.print("\nNuki connect debug logging enabled: ");
|
||||
response.print(_preferences->getBool(preference_debug_connect, false) ? "Yes" : "No");
|
||||
response.print("\nNuki communication debug logging enabled: ");
|
||||
response.print(_preferences->getBool(preference_debug_communication, false) ? "Yes" : "No");
|
||||
response.print("\nNuki readable data debug logging enabled: ");
|
||||
response.print(_preferences->getBool(preference_debug_readable_data, false) ? "Yes" : "No");
|
||||
response.print("\nNuki hex data debug logging enabled: ");
|
||||
response.print(_preferences->getBool(preference_debug_hex_data, false) ? "Yes" : "No");
|
||||
response.print("\nNuki command debug logging enabled: ");
|
||||
response.print(_preferences->getBool(preference_debug_command, false) ? "Yes" : "No");
|
||||
response.print("\nMQTT log enabled: ");
|
||||
response.print(_preferences->getBool(preference_mqtt_log_enabled, false) ? "Yes" : "No");
|
||||
response.print("\nWebserial enabled: ");
|
||||
@@ -4963,8 +5030,6 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
response.print("\nStatic IP DNS server: ");
|
||||
response.print(_preferences->getString(preference_ip_dns_server, ""));
|
||||
}
|
||||
|
||||
#ifndef CONFIG_IDF_TARGET_ESP32H2
|
||||
if(_network->networkDeviceName() == "Built-in Wi-Fi")
|
||||
{
|
||||
response.print("\nRSSI Publish interval (s): ");
|
||||
@@ -4981,9 +5046,16 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
response.print("\nFind WiFi AP with strongest signal: ");
|
||||
response.print(_preferences->getBool(preference_find_best_rssi, false) ? "Yes" : "No");
|
||||
}
|
||||
#endif
|
||||
/*
|
||||
else if(network->networkDeviceType() == NetworkDeviceType::CUSTOM)
|
||||
{
|
||||
|
||||
}
|
||||
*/
|
||||
response.print("\nRestart ESP32 on network disconnect enabled: ");
|
||||
response.print(_preferences->getBool(preference_restart_on_disconnect, false) ? "Yes" : "No");
|
||||
response.print("\nDisable Network if not connected within 60s: ");
|
||||
response.print(_preferences->getBool(preference_disable_network_not_connected, false) ? "Yes" : "No");
|
||||
response.print("\nMQTT Timeout until restart (s): ");
|
||||
if(_preferences->getInt(preference_network_timeout, 60) < 0)
|
||||
{
|
||||
@@ -5039,6 +5111,8 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
response.print("Disabled");
|
||||
}
|
||||
response.print("\n\n------------ BLUETOOTH ------------");
|
||||
response.print("\nBluetooth connection mode: ");
|
||||
response.print(_preferences->getBool(preference_connect_mode, false) ? "New" : "Old");
|
||||
response.print("\nBluetooth TX power (dB): ");
|
||||
response.print(_preferences->getInt(preference_ble_tx_power, 9));
|
||||
response.print("\nBluetooth command nr of retries: ");
|
||||
@@ -5086,6 +5160,12 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
response.print(_preferences->getBool(preference_timecontrol_topic_per_entry, false) ? "Yes" : "No");
|
||||
response.print("\nMax timecontrol entries to retrieve: ");
|
||||
response.print(_preferences->getInt(preference_timecontrol_max_entries, MAX_TIMECONTROL));
|
||||
response.print("\nEnable authorization control: ");
|
||||
response.print(_preferences->getBool(preference_auth_info_enabled, false) ? "Yes" : "No");
|
||||
response.print("\nPublish authorization topic per entry: ");
|
||||
response.print(_preferences->getBool(preference_auth_topic_per_entry, false) ? "Yes" : "No");
|
||||
response.print("\nMax authorization entries to retrieve: ");
|
||||
response.print(_preferences->getInt(preference_auth_max_entries, MAX_AUTH));
|
||||
response.print("\n\n------------ HOME ASSISTANT ------------");
|
||||
response.print("\nHome Assistant auto discovery enabled: ");
|
||||
if(_preferences->getString(preference_mqtt_hass_discovery, "").length() > 0)
|
||||
@@ -5110,6 +5190,8 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
else
|
||||
{
|
||||
response.print("\nLock enabled: Yes");
|
||||
response.print("\nLock Ultra enabled: ");
|
||||
response.print(_preferences->getBool(preference_lock_gemini_enabled, false) ? "Yes" : "No");
|
||||
response.print("\nPaired: ");
|
||||
response.print(_nuki->isPaired() ? "Yes" : "No");
|
||||
response.print("\nNuki Hub device ID: ");
|
||||
@@ -5133,6 +5215,8 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
}
|
||||
response.print("\nTimecontrol highest entries count: ");
|
||||
response.print(_preferences->getInt(preference_lock_max_timecontrol_entry_count, 0));
|
||||
response.print("\nAuthorizations highest entries count: ");
|
||||
response.print(_preferences->getInt(preference_lock_max_auth_entry_count, 0));
|
||||
response.print("\nRegister as: ");
|
||||
response.print(_preferences->getBool(preference_register_as_app, false) ? "App" : "Bridge");
|
||||
response.print("\n\n------------ HYBRID MODE ------------");
|
||||
@@ -5145,21 +5229,27 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
response.print("\nHybrid mode enabled: Yes");
|
||||
response.print("\nHybrid mode connected: ");
|
||||
response.print(_nuki->offConnected() ? "Yes": "No");
|
||||
response.print("\nReboot Nuki lock on official MQTT failure: ");
|
||||
response.print(_preferences->getBool(preference_hybrid_reboot_on_disconnect, false) ? "Yes" : "No");
|
||||
response.print("\nSending actions through official MQTT enabled: ");
|
||||
response.print(_preferences->getBool(preference_official_hybrid_actions, false) ? "Yes" : "No");
|
||||
/* NOT IMPLEMENTED (YET?)
|
||||
if(_preferences->getBool(preference_official_hybrid_actions, false))
|
||||
{
|
||||
response.print("\nRetry actions through BLE enabled: ");
|
||||
response.print(_preferences->getBool(preference_official_hybrid_retry, false) ? "Yes" : "No");
|
||||
}
|
||||
*/
|
||||
response.print("\nTime between status updates when official MQTT is offline (s): ");
|
||||
response.print(_preferences->getInt(preference_query_interval_hybrid_lockstate, 600));
|
||||
}
|
||||
response.print("\nForce Lock ID: ");
|
||||
response.print(_preferences->getBool(preference_lock_force_id, false) ? "Yes" : "No");
|
||||
response.print("\nForce Lock Keypad: ");
|
||||
response.print(_preferences->getBool(preference_lock_force_keypad, false) ? "Yes" : "No");
|
||||
response.print("\nForce Lock Doorsensor: ");
|
||||
response.print(_preferences->getBool(preference_lock_force_doorsensor, false) ? "Yes" : "No");
|
||||
uint32_t basicLockConfigAclPrefs[16];
|
||||
_preferences->getBytes(preference_conf_lock_basic_acl, &basicLockConfigAclPrefs, sizeof(basicLockConfigAclPrefs));
|
||||
uint32_t advancedLockConfigAclPrefs[23];
|
||||
uint32_t advancedLockConfigAclPrefs[25];
|
||||
_preferences->getBytes(preference_conf_lock_advanced_acl, &advancedLockConfigAclPrefs, sizeof(advancedLockConfigAclPrefs));
|
||||
response.print("\n\n------------ NUKI LOCK ACL ------------");
|
||||
response.print("\nLock: ");
|
||||
@@ -5259,6 +5349,10 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
response.print((int)advancedLockConfigAclPrefs[21] ? "Allowed" : "Disallowed");
|
||||
response.print("\nReboot Nuki: ");
|
||||
response.print((int)advancedLockConfigAclPrefs[22] ? "Allowed" : "Disallowed");
|
||||
response.print("\nMotor speed: ");
|
||||
response.print((int)advancedLockConfigAclPrefs[23] ? "Allowed" : "Disallowed");
|
||||
response.print("\nEnable slow speed during nightmode: ");
|
||||
response.print((int)advancedLockConfigAclPrefs[24] ? "Allowed" : "Disallowed");
|
||||
|
||||
if(_preferences->getBool(preference_show_secrets))
|
||||
{
|
||||
@@ -5294,6 +5388,8 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
uint32_t authorizationIdInt = authorizationId[0] + 256U*authorizationId[1] + 65536U*authorizationId[2] + 16777216U*authorizationId[3];
|
||||
response.print("\nAuthorizationId (UINT32_T): ");
|
||||
response.print(authorizationIdInt);
|
||||
response.print("\nPaired to Nuki Lock Ultra: ");
|
||||
response.print(nukiBlePref.getBool("isUltra", false) ? "Yes" : "No");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5326,10 +5422,16 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
}
|
||||
response.print("\nTimecontrol highest entries count: ");
|
||||
response.print(_preferences->getInt(preference_opener_max_timecontrol_entry_count, 0));
|
||||
response.print("\nAuthorizations highest entries count: ");
|
||||
response.print(_preferences->getInt(preference_opener_max_auth_entry_count, 0));
|
||||
response.print("\nRegister as: ");
|
||||
response.print(_preferences->getBool(preference_register_opener_as_app, false) ? "App" : "Bridge");
|
||||
response.print("\nNuki Opener Lock/Unlock action set to Continuous mode in Home Assistant: ");
|
||||
response.print(_preferences->getBool(preference_opener_continuous_mode, false) ? "Yes" : "No");
|
||||
response.print("\nForce Opener ID: ");
|
||||
response.print(_preferences->getBool(preference_opener_force_id, false) ? "Yes" : "No");
|
||||
response.print("\nForce Opener Keypad: ");
|
||||
response.print(_preferences->getBool(preference_opener_force_keypad, false) ? "Yes" : "No");
|
||||
uint32_t basicOpenerConfigAclPrefs[14];
|
||||
_preferences->getBytes(preference_conf_opener_basic_acl, &basicOpenerConfigAclPrefs, sizeof(basicOpenerConfigAclPrefs));
|
||||
uint32_t advancedOpenerConfigAclPrefs[21];
|
||||
@@ -5453,10 +5555,15 @@ esp_err_t WebCfgServer::buildInfoHtml(PsychicRequest *request, PsychicResponse*
|
||||
sprintf(tmp, "%02x", authorizationIdOpn[i]);
|
||||
response.print(tmp);
|
||||
}
|
||||
uint32_t authorizationIdOpnInt = authorizationIdOpn[0] + 256U*authorizationIdOpn[1] + 65536U*authorizationIdOpn[2] + 16777216U*authorizationIdOpn[3];
|
||||
response.print("\nAuthorizationId (UINT32_T): ");
|
||||
response.print(authorizationIdOpnInt);
|
||||
}
|
||||
}
|
||||
|
||||
response.print("\n\n------------ GPIO ------------\n");
|
||||
response.print("\nRetain Input GPIO MQTT state: ");
|
||||
response.print(_preferences->getBool(preference_retain_gpio, false) ? "Yes" : "No");
|
||||
String gpioStr = "";
|
||||
_gpio->getConfigurationText(gpioStr, _gpio->pinConfiguration());
|
||||
response.print(gpioStr);
|
||||
@@ -5844,4 +5951,4 @@ String WebCfgServer::getPreselectionForGpio(const uint8_t &pin)
|
||||
|
||||
return String((int8_t)PinRole::Disabled);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
Reference in New Issue
Block a user