diff --git a/README.md b/README.md
index 822d3b7..52fb002 100644
--- a/README.md
+++ b/README.md
@@ -291,7 +291,6 @@ In a browser navigate to the IP address assigned to the ESP32.
- Nuki Smartlock enabled: Enable if you want Nuki Hub to connect to a Nuki Lock (1.0-4.0 and Ultra)
- Nuki Smartlock Ultra/Go/5th gen enabled: Enable if you want Nuki Hub to connect to a Nuki Lock Ultra/Go/5th gen Pro
- Nuki Opener enabled: Enable if you want Nuki Hub to connect to a Nuki Opener
-- New Nuki Bluetooth connection mode (disable if there are connection issues): Enable to use the latest Nuki BLE connection mode (recommended). Disable if you have issues communicating with the lock/opener
#### Advanced Nuki Configuration
diff --git a/lib/nuki_ble b/lib/nuki_ble
index 01c81b5..c54698d 160000
--- a/lib/nuki_ble
+++ b/lib/nuki_ble
@@ -1 +1 @@
-Subproject commit 01c81b52b2ede42d8742dd0b5dff7e7b5813cf4d
+Subproject commit c54698d31d6747df166fc522145862e9560eb0d5
diff --git a/src/Config.h b/src/Config.h
index 7990004..c6b989a 100644
--- a/src/Config.h
+++ b/src/Config.h
@@ -5,7 +5,7 @@
#define NUKI_HUB_VERSION "9.12"
#define NUKI_HUB_VERSION_INT (uint32_t)912
#define NUKI_HUB_BUILD "unknownbuildnr"
-#define NUKI_HUB_DATE "2025-06-19"
+#define NUKI_HUB_DATE "2025-06-20"
#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"
diff --git a/src/NukiNetwork.cpp b/src/NukiNetwork.cpp
index 1d2f83e..79e8dad 100644
--- a/src/NukiNetwork.cpp
+++ b/src/NukiNetwork.cpp
@@ -103,19 +103,9 @@ void NukiNetwork::setupDevice()
Log->print("Network device: ");
Log->println(_device->deviceName());
-#ifndef NUKI_HUB_UPDATER
- _device->mqttOnConnect([&](bool sessionPresent)
- {
- onMqttConnect(sessionPresent);
- });
- _device->mqttOnDisconnect([&](espMqttClientTypes::DisconnectReason reason)
- {
- onMqttDisconnect(reason);
- });
-
+ #ifndef NUKI_HUB_UPDATER
_hadiscovery = new HomeAssistantDiscovery(_device, _preferences, _buffer, _bufferSize);
-#endif
-
+ #endif
}
void NukiNetwork::reconfigureDevice()
@@ -391,6 +381,17 @@ void NukiNetwork::setMQTTConnectionSettings()
Log->print(_mqttBrokerAddr);
Log->print(":");
Log->println(_mqttPort);
+
+ #ifndef NUKI_HUB_UPDATER
+ _device->mqttOnConnect([&](bool sessionPresent)
+ {
+ onMqttConnect(sessionPresent);
+ });
+ _device->mqttOnDisconnect([&](espMqttClientTypes::DisconnectReason reason)
+ {
+ onMqttDisconnect(reason);
+ });
+ #endif
}
int NukiNetwork::getRestartServices()
@@ -703,7 +704,8 @@ bool NukiNetwork::reconnect(bool force)
{
if (force)
{
- _device->mqttDisconnect(true);
+ _mqttReceivers.clear();
+ _device->mqttRestart();
setMQTTConnectionSettings();
}
diff --git a/src/NukiOpenerWrapper.cpp b/src/NukiOpenerWrapper.cpp
index a5da83a..1a0998a 100644
--- a/src/NukiOpenerWrapper.cpp
+++ b/src/NukiOpenerWrapper.cpp
@@ -62,10 +62,10 @@ void NukiOpenerWrapper::initialize()
_nukiOpener.setDebugCommand(_preferences->getBool(preference_debug_command, false));
_nukiOpener.registerLogger(Log);
- _nukiOpener.initialize(_preferences->getBool(preference_connect_mode, true));
+ _nukiOpener.initialize();
_nukiOpener.registerBleScanner(_bleScanner);
_nukiOpener.setEventHandler(this);
- _nukiOpener.setConnectTimeout(3);
+ _nukiOpener.setConnectTimeout(2);
_nukiOpener.setDisconnectTimeout(2000);
_hassEnabled = _preferences->getBool(preference_mqtt_hass_enabled, false);
@@ -337,9 +337,17 @@ void NukiOpenerWrapper::update()
}
if(_statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0)
{
- _statusUpdated = updateKeyTurnerState();
_nextLockStateUpdateTs = ts + _intervalLockstate * 1000;
+ _statusUpdated = updateKeyTurnerState();
_network->publishStatusUpdated(_statusUpdated);
+
+ if(_statusUpdated)
+ {
+ if (esp_task_wdt_status(NULL) == ESP_OK) {
+ esp_task_wdt_reset();
+ }
+ vTaskDelay(500 / portTICK_PERIOD_MS);
+ }
}
if(_network->mqttConnectionState() == 2)
{
@@ -517,6 +525,10 @@ bool NukiOpenerWrapper::updateKeyTurnerState()
Log->println("ms");
_nextLockStateUpdateTs = espMillis() + _retryDelay;
}
+ else
+ {
+ _nextLockStateUpdateTs = espMillis() + (_retryLockstateCount * 333);
+ }
_network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState);
return false;
}
diff --git a/src/NukiWrapper.cpp b/src/NukiWrapper.cpp
index 075ab04..5021299 100644
--- a/src/NukiWrapper.cpp
+++ b/src/NukiWrapper.cpp
@@ -68,10 +68,10 @@ void NukiWrapper::initialize()
_nukiLock.saveUltraPincode(_preferences->getInt(preference_lock_gemini_pin, 0), false);
}
- _nukiLock.initialize(_preferences->getBool(preference_connect_mode, true));
+ _nukiLock.initialize();
_nukiLock.registerBleScanner(_bleScanner);
_nukiLock.setEventHandler(this);
- _nukiLock.setConnectTimeout(3);
+ _nukiLock.setConnectTimeout(2);
_nukiLock.setDisconnectTimeout(2000);
_hassEnabled = _preferences->getBool(preference_mqtt_hass_enabled, false);
@@ -361,9 +361,17 @@ void NukiWrapper::update(bool reboot)
if(_nukiOfficial->getStatusUpdated() || _statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0)
{
Log->println("Updating Lock state based on status, timer or query");
- _statusUpdated = updateKeyTurnerState();
_nextLockStateUpdateTs = ts + _intervalLockstate * 1000;
+ _statusUpdated = updateKeyTurnerState();
_network->publishStatusUpdated(_statusUpdated);
+
+ if(_statusUpdated)
+ {
+ if (esp_task_wdt_status(NULL) == ESP_OK) {
+ esp_task_wdt_reset();
+ }
+ vTaskDelay(500 / portTICK_PERIOD_MS);
+ }
}
if(_network->mqttConnectionState() == 2)
{
@@ -382,7 +390,7 @@ void NukiWrapper::update(bool reboot)
updateConfig();
if(_isDebugging)
{
- updateDebug();
+ //updateDebug();
}
}
if(_waitAuthLogUpdateTs != 0 && ts > _waitAuthLogUpdateTs)
@@ -551,6 +559,10 @@ bool NukiWrapper::updateKeyTurnerState()
Log->println("ms");
_nextLockStateUpdateTs = espMillis() + _retryDelay;
}
+ else
+ {
+ _nextLockStateUpdateTs = espMillis() + (_retryLockstateCount * 333);
+ }
_network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState);
return false;
}
diff --git a/src/PreferencesKeys.h b/src/PreferencesKeys.h
index 721159f..b13c9c2 100644
--- a/src/PreferencesKeys.h
+++ b/src/PreferencesKeys.h
@@ -37,10 +37,6 @@
#define preference_time_server (char*)"timeServer"
//MQTT RELATED
-#define preference_mqtt_ssl_enabled (char*)"mqttSSLena"
-#define preference_mqtt_ca (char*)"mqttca"
-#define preference_mqtt_crt (char*)"mqttcrt"
-#define preference_mqtt_key (char*)"mqttkey"
#define preference_mqtt_log_enabled (char*)"mqttlog"
#define preference_gpio_configuration (char*)"gpiocfg"
@@ -105,7 +101,6 @@
#define preference_opener_force_keypad (char*)"opForceKp"
#define preference_admin_secret (char*)"adminsecret"
-//TO BE EFFECTUATED IN WEBSERVER AND OTHER USES
//REQUIRE SERVICES RELOAD
#define preference_lock_enabled (char*)"lockena"
#define preference_opener_enabled (char*)"openerena"
@@ -119,7 +114,6 @@
#define preference_cred_password (char*)"crdpass"
#define preference_lock_gemini_pin (char*)"geminiPin"
#define preference_lock_gemini_enabled (char*)"geminiena"
-#define preference_connect_mode (char*)"nukiConnMode"
#define preference_https_fqdn (char*)"httpsFQDN"
#define preference_bypass_proxy (char*)"credBypass"
#define preference_http_auth_type (char*)"httpdAuthType"
@@ -160,8 +154,10 @@
#define preference_hybrid_reboot_on_disconnect (char*)"hybridRbtLck"
#define preference_bypass_secret (char*)"bypassecret"
#define preference_totp_secret (char*)"totpsecret"
-
-//END TO BE EFFECTUATED IN WEBSERVER AND OTHER USES
+#define preference_mqtt_ssl_enabled (char*)"mqttSSLena"
+#define preference_mqtt_ca (char*)"mqttca"
+#define preference_mqtt_crt (char*)"mqttcrt"
+#define preference_mqtt_key (char*)"mqttkey"
//NOT USER CHANGABLE
#define preference_mfa_reconfigure (char*)"mfaRECONF"
@@ -254,7 +250,6 @@ inline void initPreferences(Preferences* preferences)
preferences->putBool(preference_debug_readable_data, false);
preferences->putBool(preference_debug_hex_data, false);
preferences->putBool(preference_debug_command, false);
- preferences->putBool(preference_connect_mode, true);
preferences->putBool(preference_retain_gpio, false);
preferences->putBool(preference_enable_debug_mode, false);
preferences->putBool(preference_cred_duo_enabled, false);
@@ -544,7 +539,7 @@ private:
preference_network_custom_pwr, preference_network_custom_mdio, preference_lock_max_auth_entry_count, preference_opener_max_auth_entry_count,
preference_auth_control_enabled, preference_auth_topic_per_entry, preference_auth_info_enabled, preference_auth_max_entries, preference_wifi_ssid, preference_wifi_pass,
preference_keypad_check_code_enabled, preference_disable_network_not_connected, preference_mqtt_hass_enabled, preference_hass_device_discovery, preference_retain_gpio,
- preference_debug_connect, preference_debug_communication, preference_debug_readable_data, preference_debug_hex_data, preference_debug_command, preference_connect_mode,
+ preference_debug_connect, preference_debug_communication, preference_debug_readable_data, preference_debug_hex_data, preference_debug_command,
preference_lock_force_id, preference_lock_force_doorsensor, preference_lock_force_keypad, preference_opener_force_id, preference_opener_force_keypad, preference_nukihub_id,
preference_cred_duo_host, preference_cred_duo_ikey, preference_cred_duo_skey, preference_cred_duo_user, preference_cred_duo_enabled, preference_https_fqdn, preference_bypass_proxy,
preference_cred_session_lifetime, preference_cred_session_lifetime_remember, preference_cred_session_lifetime_duo, preference_cred_session_lifetime_duo_remember,
@@ -568,7 +563,7 @@ private:
preference_official_hybrid_actions, preference_official_hybrid_retry, preference_conf_info_enabled, preference_disable_non_json, preference_update_from_mqtt,
preference_auth_control_enabled, preference_auth_topic_per_entry, preference_auth_info_enabled, preference_webserial_enabled, preference_hass_device_discovery,
preference_keypad_check_code_enabled, preference_disable_network_not_connected, preference_find_best_rssi, preference_cred_bypass_boot_btn_enabled,
- preference_debug_connect, preference_debug_communication, preference_debug_readable_data, preference_debug_hex_data, preference_debug_command, preference_connect_mode,
+ preference_debug_connect, preference_debug_communication, preference_debug_readable_data, preference_debug_hex_data, preference_debug_command,
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_lock_gemini_enabled, preference_enable_debug_mode, preference_cred_duo_enabled, preference_cred_duo_approval,
preference_publish_config, preference_config_from_mqtt
diff --git a/src/WebCfgServer.cpp b/src/WebCfgServer.cpp
index 99fd3b4..a9dc51d 100644
--- a/src/WebCfgServer.cpp
+++ b/src/WebCfgServer.cpp
@@ -694,7 +694,7 @@ void WebCfgServer::initialize()
return resp->redirect("/");
}
esp_err_t res = buildConfirmHtml(request, resp, "Restarting services...", 2, true);
- _network->setRestartServices(_restartServicesRequired);
+ _network->setRestartServices(_restartServicesRequired == 1 ? false : true);
_restartServicesRequired = 0;
waitAndProcess(true, 1000);
return res;
@@ -2626,7 +2626,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
}
Log->print("Setting changed: ");
Log->println(key);
- configChanged = true;
+ restartServicesReconnect = true;
}
}
}
@@ -2662,7 +2662,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
}
Log->print("Setting changed: ");
Log->println(key);
- configChanged = true;
+ restartServicesReconnect = true;
}
}
}
@@ -2698,7 +2698,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
}
Log->print("Setting changed: ");
Log->println(key);
- configChanged = true;
+ restartServicesReconnect = true;
}
}
}
@@ -3258,7 +3258,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_mqtt_ssl_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
- configChanged = true;
+ restartServicesReconnect = true;
}
}
else if(key == "WEBLOG")
@@ -4329,16 +4329,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
restartServicesReconnect = true;
}
}
- else if(key == "CONNMODE")
- {
- if(_preferences->getBool(preference_connect_mode, true) != (value == "1"))
- {
- _preferences->putBool(preference_connect_mode, (value == "1"));
- Log->print("Setting changed: ");
- Log->println(key);
- restartServicesNoReconnect = true;
- }
- }
else if(key == "CREDUSER")
{
if(value == "#")
@@ -5791,7 +5781,6 @@ esp_err_t WebCfgServer::buildNukiConfigHtml(PsychicRequest *request, PsychicResp
printCheckBox(&response, "LOCKENA", "Nuki Lock enabled", _preferences->getBool(preference_lock_enabled, true), "");
printCheckBox(&response, "GEMINIENA", "Nuki Smartlock Ultra/Go/5th gen 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("
");
response.print("