Change settings without reboot

This commit is contained in:
iranl
2025-06-18 16:21:19 +02:00
parent 61ec292100
commit da837599d3
12 changed files with 567 additions and 405 deletions

View File

@@ -15,7 +15,6 @@ Gpio::Gpio(Preferences* preferences)
: _preferences(preferences)
{
_inst = this;
loadPinConfiguration();
_inst->init();
}
@@ -120,6 +119,13 @@ void Gpio::init()
_inst->_triggerState.push_back(0);
}
_inst->setPins();
}
void Gpio::setPins()
{
loadPinConfiguration();
bool hasInputPin = false;
if (_inst->_preferences->getBool(preference_cred_bypass_boot_btn_enabled, false))
@@ -180,8 +186,9 @@ void Gpio::init()
}
}
if(hasInputPin)
if(hasInputPin && _first)
{
_first = false;
_inst->timer = timerBegin(1000000);
timerAttachInterrupt(_inst->timer, isrOnTimer);
timerAlarm(_inst->timer, 100000, true, 0);

View File

@@ -76,6 +76,7 @@ public:
const std::vector<PinRole>& getAllRoles() const;
void setPinOutput(const uint8_t& pin, const uint8_t& state);
void setPins();
private:
void IRAM_ATTR notify(const GpioAction& action, const int& pin);
@@ -139,6 +140,8 @@ private:
std::vector<uint8_t> _triggerState;
hw_timer_t* timer = nullptr;
bool _first = true;
Preferences* _preferences = nullptr;
};

View File

@@ -11,11 +11,7 @@ HomeAssistantDiscovery::HomeAssistantDiscovery(NetworkDevice* device, Preference
_buffer(buffer),
_bufferSize(bufferSize)
{
_discoveryTopic = _preferences->getString(preference_mqtt_hass_discovery, "");
_baseTopic = _preferences->getString(preference_mqtt_lock_path);
_offEnabled = _preferences->getBool(preference_official_hybrid_enabled, false);
_checkUpdates = _preferences->getBool(preference_check_updates, false);
_updateFromMQTT = _preferences->getBool(preference_update_from_mqtt, false);
_hostname = _preferences->getString(preference_hostname, "");
uint64_t savedDevId = _preferences->getULong64(preference_nukihub_id, 0);
uint8_t mac[8];
@@ -349,7 +345,7 @@ void HomeAssistantDiscovery::publishHASSNukiHubConfig()
"",
{ { (char*)"en", (char*)"true" }});
if(_checkUpdates)
if(_preferences->getBool(preference_check_updates, false))
{
// Nuki Hub latest
publishHassTopic("sensor",
@@ -375,7 +371,7 @@ void HomeAssistantDiscovery::publishHASSNukiHubConfig()
_baseTopic.toCharArray(latest_version_topic,_baseTopic.length() + 1);
strcat(latest_version_topic, mqtt_topic_info_nuki_hub_latest);
if(!_updateFromMQTT)
if(!_preferences->getBool(preference_update_from_mqtt, false))
{
publishHassTopic("update",
"nuki_hub_update",
@@ -667,7 +663,7 @@ void HomeAssistantDiscovery::publishHASSDeviceConfig(char* deviceType, const cha
"",
{ { (char*)"en", (char*)"true" } });
if(_offEnabled && strcmp(deviceType, "SmartLock") == 0)
if(_preferences->getBool(preference_official_hybrid_enabled, false) && strcmp(deviceType, "SmartLock") == 0)
{
// Hybrid connected
String hybridPath = _baseTopic;
@@ -2988,7 +2984,7 @@ void HomeAssistantDiscovery::publishHassTopic(const String& mqttDeviceType,
std::vector<std::pair<char*, char*>> additionalEntries
)
{
if (_discoveryTopic != "")
if (_preferences->getString(preference_mqtt_hass_discovery, "") != "")
{
JsonDocument json;
json = createHassJson(uidString, uidStringPostfix, displayName, name, baseTopic, stateTopic, deviceType, deviceClass, stateClass, entityCat, commandTopic, additionalEntries);
@@ -3000,7 +2996,7 @@ void HomeAssistantDiscovery::publishHassTopic(const String& mqttDeviceType,
String HomeAssistantDiscovery::createHassTopicPath(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString)
{
String path = _discoveryTopic;
String path = _preferences->getString(preference_mqtt_hass_discovery, "");
path.concat("/");
path.concat(mqttDeviceType);
path.concat("/");
@@ -3014,7 +3010,7 @@ String HomeAssistantDiscovery::createHassTopicPath(const String& mqttDeviceType,
void HomeAssistantDiscovery::removeHassTopic(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString)
{
if (_discoveryTopic != "")
if (_preferences->getString(preference_mqtt_hass_discovery, "") != "")
{
String path = createHassTopicPath(mqttDeviceType, mqttDeviceName, uidString);
_device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, "");

View File

@@ -59,17 +59,12 @@ private:
NetworkDevice* _device = nullptr;
Preferences* _preferences = nullptr;
String _discoveryTopic;
String _baseTopic;
String _hostname;
JsonDocument _uidToName;
char _nukiHubUidString[20];
bool _offEnabled = false;
bool _checkUpdates = false;
bool _updateFromMQTT = false;
char* _buffer;
const size_t _bufferSize;
};

View File

@@ -41,6 +41,7 @@ void ImportExport::readSettings()
_totpEnabled = _totpKey.length() > 0;
_bypassKey = _preferences->getString(preference_bypass_secret, "");
_bypassEnabled = _bypassKey.length() > 0;
_updateTime = _preferences->getBool(preference_update_time, false);
}
bool ImportExport::getDuoEnabled()
@@ -117,7 +118,7 @@ void ImportExport::setDuoCheckId(String duoCheckId)
void ImportExport::saveSessions()
{
if(_preferences->getBool(preference_update_time, false))
if(_updateTime)
{
if (!SPIFFS.begin(true))
{

View File

@@ -43,6 +43,7 @@ private:
bool _duoActiveRequest;
bool _duoEnabled = false;
bool _bypassGPIO = false;
bool _updateTime = false;
int _bypassGPIOHigh = -1;
int _bypassGPIOLow = -1;
int64_t _duoRequestTS = 0;

View File

@@ -23,7 +23,7 @@ extern const uint8_t x509_crt_imported_bundle_bin_start[] asm("_binary_x509_crt_
extern const uint8_t x509_crt_imported_bundle_bin_end[] asm("_binary_x509_crt_bundle_end");
#ifndef NUKI_HUB_UPDATER
NukiNetwork::NukiNetwork(Preferences *preferences, Gpio* gpio, const String& maintenancePathPrefix, char* buffer, size_t bufferSize, ImportExport* importExport)
NukiNetwork::NukiNetwork(Preferences *preferences, Gpio* gpio, char* buffer, size_t bufferSize, ImportExport* importExport)
: _preferences(preferences),
_gpio(gpio),
_buffer(buffer),
@@ -35,33 +35,6 @@ NukiNetwork::NukiNetwork(Preferences *preferences)
#endif
{
_inst = this;
_webEnabled = _preferences->getBool(preference_webserver_enabled, true);
#ifndef NUKI_HUB_UPDATER
memset(_maintenancePathPrefix, 0, sizeof(_maintenancePathPrefix));
size_t len = maintenancePathPrefix.length();
for(int i=0; i < len; i++)
{
_maintenancePathPrefix[i] = maintenancePathPrefix.charAt(i);
}
_lockPath = _preferences->getString(preference_mqtt_lock_path);
String connectionStateTopic = _lockPath + mqtt_topic_mqtt_connection_state;
memset(_mqttConnectionStateTopic, 0, sizeof(_mqttConnectionStateTopic));
len = connectionStateTopic.length();
for(int i=0; i < len; i++)
{
_mqttConnectionStateTopic[i] = connectionStateTopic.charAt(i);
}
if(_preferences->getString(preference_mqtt_hass_discovery, "") != "" && !_preferences->getBool(preference_mqtt_hass_enabled, false))
{
_preferences->putBool(preference_mqtt_hass_enabled, true);
}
#endif
setupDevice();
}
@@ -76,9 +49,9 @@ void NukiNetwork::setupDevice()
if(hardwareDetect == 0)
{
#ifndef CONFIG_IDF_TARGET_ESP32H2
#ifndef CONFIG_IDF_TARGET_ESP32H2
hardwareDetect = 1;
#else
#else
hardwareDetect = 11;
_preferences->putInt(preference_network_custom_addr, 1);
_preferences->putInt(preference_network_custom_cs, 8);
@@ -88,13 +61,13 @@ void NukiNetwork::setupDevice()
_preferences->putInt(preference_network_custom_miso, 12);
_preferences->putInt(preference_network_custom_mosi, 13);
_preferences->putBool(preference_ntw_reconfigure, true);
#endif
#endif
_preferences->putInt(preference_network_hardware, hardwareDetect);
}
if(wifiFallback == true)
{
#ifndef CONFIG_IDF_TARGET_ESP32H2
#ifndef CONFIG_IDF_TARGET_ESP32H2
if(!_firstBootAfterDeviceChange)
{
Log->println("Failed to connect to network. Wi-Fi fallback is disabled, rebooting.");
@@ -105,7 +78,7 @@ void NukiNetwork::setupDevice()
Log->println("Switching to Wi-Fi device as fallback.");
_networkDeviceType = NetworkDeviceType::WiFi;
#else
#else
int custEth = _preferences->getInt(preference_network_custom_phy, 0);
if(custEth<3)
@@ -118,7 +91,7 @@ void NukiNetwork::setupDevice()
}
_preferences->putInt(preference_network_custom_phy, custEth);
_preferences->putBool(preference_ntw_reconfigure, true);
#endif
#endif
}
else
{
@@ -248,6 +221,9 @@ bool NukiNetwork::update()
#else
void NukiNetwork::initialize()
{
readSettings();
setMQTTConnectionSettings();
_gpio->addCallback([this](const GpioAction& action, const int& pin)
{
gpioActionCallback(action, pin);
@@ -255,14 +231,6 @@ void NukiNetwork::initialize()
if(!disableNetwork)
{
String mqttPath = _preferences->getString(preference_mqtt_lock_path, "");
size_t len = mqttPath.length();
for(int i=0; i < len; i++)
{
_nukiHubPath[i] = mqttPath.charAt(i);
}
_hostname = _preferences->getString(preference_hostname, "");
if(_hostname == "")
@@ -277,48 +245,12 @@ void NukiNetwork::initialize()
_preferences->putString(preference_hostname, _hostname);
}
_mqttPort = _preferences->getInt(preference_mqtt_broker_port, 0);
if(_mqttPort == 0)
{
_mqttPort = 1883;
_preferences->putInt(preference_mqtt_broker_port, _mqttPort);
}
strcpy(_hostnameArr, _hostname.c_str());
_device->initialize();
Log->print("Host name: ");
Log->println(_hostname);
String brokerAddr = _preferences->getString(preference_mqtt_broker);
strcpy(_mqttBrokerAddr, brokerAddr.c_str());
String mqttUser = _preferences->getString(preference_mqtt_user);
if(mqttUser.length() > 0)
{
size_t len = mqttUser.length();
for(int i=0; i < len; i++)
{
_mqttUser[i] = mqttUser.charAt(i);
}
}
String mqttPass = _preferences->getString(preference_mqtt_password);
if(mqttPass.length() > 0)
{
size_t len = mqttPass.length();
for(int i=0; i < len; i++)
{
_mqttPass[i] = mqttPass.charAt(i);
}
}
Log->print("MQTT Broker: ");
Log->print(_mqttBrokerAddr);
Log->print(":");
Log->println(_mqttPort);
_device->mqttSetClientId(_hostnameArr);
_device->mqttSetCleanSession(false);
_device->mqttSetKeepAlive(60);
@@ -359,13 +291,12 @@ void NukiNetwork::initialize()
break;
}
}
readSettings();
}
}
void NukiNetwork::readSettings()
{
_webEnabled = _preferences->getBool(preference_webserver_enabled, true);
_disableNetworkIfNotConnected = _preferences->getBool(preference_disable_network_not_connected, false);
_restartOnDisconnect = _preferences->getBool(preference_restart_on_disconnect, false);
_checkUpdates = _preferences->getBool(preference_check_updates, false);
@@ -388,6 +319,99 @@ void NukiNetwork::readSettings()
_publishDebugInfo = _preferences->getBool(preference_publish_debug_info, false);
}
void NukiNetwork::setMQTTConnectionSettings()
{
String mqttPath = _preferences->getString(preference_mqtt_lock_path, "");
memset(_nukiHubPath, 0, sizeof(_nukiHubPath));
size_t len = mqttPath.length();
for(int i=0; i < len; i++)
{
_nukiHubPath[i] = mqttPath.charAt(i);
}
String maintenancePathPrefix = _preferences->getString(preference_mqtt_lock_path);
memset(_maintenancePathPrefix, 0, sizeof(_maintenancePathPrefix));
len = maintenancePathPrefix.length();
for(int i=0; i < len; i++)
{
_maintenancePathPrefix[i] = maintenancePathPrefix.charAt(i);
}
_lockPath = _preferences->getString(preference_mqtt_lock_path);
String connectionStateTopic = _lockPath + mqtt_topic_mqtt_connection_state;
memset(_mqttConnectionStateTopic, 0, sizeof(_mqttConnectionStateTopic));
len = connectionStateTopic.length();
for(int i=0; i < len; i++)
{
_mqttConnectionStateTopic[i] = connectionStateTopic.charAt(i);
}
if(_preferences->getString(preference_mqtt_hass_discovery, "") != "" && !_preferences->getBool(preference_mqtt_hass_enabled, false))
{
_preferences->putBool(preference_mqtt_hass_enabled, true);
}
memset(_mqttBrokerAddr, 0, sizeof(_mqttBrokerAddr));
memset(_mqttUser, 0, sizeof(_mqttUser));
memset(_mqttPass, 0, sizeof(_mqttPass));
String brokerAddr = _preferences->getString(preference_mqtt_broker);
strcpy(_mqttBrokerAddr, brokerAddr.c_str());
_mqttPort = _preferences->getInt(preference_mqtt_broker_port, 0);
if(_mqttPort == 0)
{
_mqttPort = 1883;
_preferences->putInt(preference_mqtt_broker_port, _mqttPort);
}
String mqttUser = _preferences->getString(preference_mqtt_user);
if(mqttUser.length() > 0)
{
len = mqttUser.length();
for(int i=0; i < len; i++)
{
_mqttUser[i] = mqttUser.charAt(i);
}
}
String mqttPass = _preferences->getString(preference_mqtt_password);
if(mqttPass.length() > 0)
{
len = mqttPass.length();
for(int i=0; i < len; i++)
{
_mqttPass[i] = mqttPass.charAt(i);
}
}
Log->print("MQTT Broker: ");
Log->print(_mqttBrokerAddr);
Log->print(":");
Log->println(_mqttPort);
}
int NukiNetwork::getRestartServices()
{
int restartServices = _restartServices;
_restartServices = 0;
return restartServices;
}
void NukiNetwork::setRestartServices(bool reconnect)
{
if (reconnect)
{
_restartServices = 2;
}
else
{
_restartServices = 1;
}
}
bool NukiNetwork::update()
{
wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
@@ -456,7 +480,7 @@ bool NukiNetwork::update()
{
forceEnableWebServer = false;
delay(200);
restartEsp(RestartReason::ReconfigureWebServer);
setRestartServices(false);
}
else if(!_webEnabled)
{
@@ -656,12 +680,20 @@ void NukiNetwork::onMqttDisconnect(const espMqttClientTypes::DisconnectReason &r
}
}
bool NukiNetwork::reconnect()
bool NukiNetwork::reconnect(bool force)
{
_mqttConnectionState = 0;
while (!_device->mqttConnected() && espMillis() > _nextReconnect)
while (force || (!_device->mqttConnected() && espMillis() > _nextReconnect))
{
if (force)
{
_device->mqttDisconnect(true);
setMQTTConnectionSettings();
}
force = false;
if(strcmp(_mqttBrokerAddr, "") == 0)
{
Log->println("MQTT Broker not configured, aborting connection attempt.");
@@ -1077,7 +1109,7 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
{
return;
}
Log->println("Webserver enabled, restarting.");
Log->println("Webserver enabled");
_preferences->putBool(preference_webserver_enabled, true);
}
else if (strcmp(data, "0") == 0)
@@ -1086,12 +1118,12 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
{
return;
}
Log->println("Webserver disabled, restarting.");
Log->println("Webserver disabled");
_preferences->putBool(preference_webserver_enabled, false);
}
clearWifiFallback();
delay(200);
restartEsp(RestartReason::ReconfigureWebServer);
setRestartServices(false);
}
else if(comparePrefixedPath(topic, mqtt_topic_nuki_hub_config_action) && !mqttRecentlyConnected())
{
@@ -1398,10 +1430,10 @@ void NukiNetwork::removeTopic(const String& mqttPath, const String& mqttTopic)
path.concat(mqttTopic);
publish(path.c_str(), "", true);
#ifdef DEBUG_NUKIHUB
#ifdef DEBUG_NUKIHUB
Log->print("Removing MQTT topic: ");
Log->println(path.c_str());
#endif
#endif
}
void NukiNetwork::setupHASS(int type, uint32_t nukiId, char* nukiName, const char* firmwareVersion, const char* hardwareVersion, bool hasDoorSensor, bool hasKeypad)

View File

@@ -32,6 +32,8 @@ public:
bool mqttConnected();
bool wifiConnected();
void clearWifiFallback();
int getRestartServices();
void setRestartServices(bool reconnect = false);
const String networkDeviceName() const;
const String networkBSSID() const;
@@ -43,13 +45,14 @@ public:
#ifdef NUKI_HUB_UPDATER
explicit NukiNetwork(Preferences* preferences);
#else
explicit NukiNetwork(Preferences* preferences, Gpio* gpio, const String& maintenancePathPrefix, char* buffer, size_t bufferSize, ImportExport* importExport);
explicit NukiNetwork(Preferences* preferences, Gpio* gpio, char* buffer, size_t bufferSize, ImportExport* importExport);
void registerMqttReceiver(MqttReceiver* receiver);
void disableAutoRestarts(); // disable on OTA start
void disableMqtt();
String localIP();
bool reconnect(bool force = false);
void subscribe(const char* prefix, const char* path);
void initTopic(const char* prefix, const char* path, const char* value);
void publishFloat(const char* prefix, const char* topic, const float value, bool retain, const uint8_t precision = 2);
@@ -93,8 +96,8 @@ public:
#endif
private:
void setupDevice();
bool reconnect();
void setMQTTConnectionSettings();
static NukiNetwork* _inst;
const char* _latestVersion;
@@ -132,6 +135,7 @@ private:
ImportExport* _importExport;
Gpio* _gpio;
int _restartServices = 0;
int _mqttConnectionState = 0;
int _mqttConnectCounter = 0;
int _mqttPort = 1883;

View File

@@ -12,23 +12,12 @@
#endif
//CHANGE REQUIRES REBOOT TO TAKE EFFECT
//NETWORK RELATED
#define preference_ip_dhcp_enabled (char*)"dhcpena"
#define preference_ip_address (char*)"ipaddr"
#define preference_ip_subnet (char*)"ipsub"
#define preference_ip_gateway (char*)"ipgtw"
#define preference_ip_dns_server (char*)"dnssrv"
#define preference_mqtt_broker (char*)"mqttbroker"
#define preference_mqtt_broker_port (char*)"mqttport"
#define preference_mqtt_user (char*)"mqttuser"
#define preference_mqtt_password (char*)"mqttpass"
#define preference_mqtt_log_enabled (char*)"mqttlog"
#define preference_webserial_enabled (char*)"weblog"
#define preference_lock_enabled (char*)"lockena"
#define preference_mqtt_lock_path (char*)"mqttpath"
#define preference_opener_enabled (char*)"openerena"
#define preference_mqtt_ca (char*)"mqttca"
#define preference_mqtt_crt (char*)"mqttcrt"
#define preference_mqtt_key (char*)"mqttkey"
#define preference_network_hardware (char*)"nwhw"
#define preference_hostname (char*)"hostname"
#define preference_network_custom_phy (char*)"ntwPHY"
@@ -43,61 +32,26 @@
#define preference_network_custom_mdio (char*)"ntwMDIO"
#define preference_network_custom_mdc (char*)"ntwMDC"
#define preference_network_custom_clk (char*)"ntwCLK"
#define preference_auth_control_enabled (char*)"authCtrlEna"
#define preference_keypad_control_enabled (char*)"kpCntrlEnabled"
#define preference_timecontrol_control_enabled (char*)"tcCntrlEnabled"
#define preference_ota_main_url (char*)"otaMainUrl"
#define preference_ota_updater_url (char*)"otaUpdUrl"
#define preference_task_size_network (char*)"tsksznetw"
#define preference_task_size_nuki (char*)"tsksznuki"
#define preference_buffer_size (char*)"buffsize"
#define preference_cred_user (char*)"crdusr"
#define preference_cred_password (char*)"crdpass"
#define preference_gpio_configuration (char*)"gpiocfg"
#define preference_mqtt_hass_enabled (char*)"hassena"
#define preference_mqtt_hass_discovery (char*)"hassdiscovery"
#define preference_hass_device_discovery (char*)"hassdevdisc"
#define preference_webserver_enabled (char*)"websrvena"
#define preference_update_from_mqtt (char*)"updMqtt"
#define preference_disable_non_json (char*)"disnonjson"
#define preference_official_hybrid_enabled (char*)"offHybrid"
#define preference_wifi_ssid (char*)"wifiSSID"
#define preference_wifi_pass (char*)"wifiPass"
#define preference_disable_network_not_connected (char*)"disNtwNoCon"
#define preference_debug_connect (char*)"dbgConnect"
#define preference_debug_communication (char*)"dbgCommu"
#define preference_debug_readable_data (char*)"dbgReadData"
#define preference_debug_hex_data (char*)"dbgHexData"
#define preference_debug_command (char*)"dbgCommand"
#define preference_connect_mode (char*)"nukiConnMode"
#define preference_http_auth_type (char*)"httpdAuthType"
#define preference_update_time (char*)"updateTime"
#define preference_time_server (char*)"timeServer"
//MQTT RELATED
#define preference_mqtt_ssl_enabled (char*)"mqttSSLena"
#define preference_lock_gemini_pin (char*)"geminiPin"
#define preference_lock_gemini_enabled (char*)"geminiena"
#define preference_cred_duo_enabled (char*)"duoena"
#define preference_cred_duo_host (char*)"duoHost"
#define preference_cred_duo_ikey (char*)"duoIkey"
#define preference_cred_duo_skey (char*)"duoSkey"
#define preference_cred_duo_user (char*)"duoUser"
#define preference_https_fqdn (char*)"httpsFQDN"
#define preference_bypass_proxy (char*)"credBypass"
#define preference_cred_session_lifetime (char*)"credLf"
#define preference_cred_session_lifetime_remember (char*)"credLfRmbr"
#define preference_cred_session_lifetime_duo (char*)"credLfDuo"
#define preference_cred_session_lifetime_duo_remember (char*)"credLfDuoRmbr"
#define preference_cred_session_lifetime_totp (char*)"credLfTotp"
#define preference_cred_session_lifetime_totp_remember (char*)"credLfTotpRmbr"
#define preference_cred_duo_approval (char*)"duoApprove"
#define preference_cred_bypass_boot_btn_enabled (char*)"bypassBtBtn"
#define preference_cred_bypass_gpio_high (char*)"bypassHigh"
#define preference_cred_bypass_gpio_low (char*)"bypassLow"
#define preference_publish_config (char*)"nhPubConfig"
#define preference_config_from_mqtt (char*)"nhCntrlEnabled"
#define preference_totp_secret (char*)"totpsecret"
#define preference_bypass_secret (char*)"bypassecret"
#define preference_admin_secret (char*)"adminsecret"
#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"
//TASKS RELATED
#define preference_task_size_network (char*)"tsksznetw"
#define preference_task_size_nuki (char*)"tsksznuki"
//OTHER
#define preference_ota_main_url (char*)"otaMainUrl"
#define preference_ota_updater_url (char*)"otaUpdUrl"
#define preference_buffer_size (char*)"buffsize"
// CHANGE DOES NOT REQUIRE REBOOT TO TAKE EFFECT
#define preference_find_best_rssi (char*)"nwbestrssi"
@@ -149,7 +103,65 @@
#define preference_lock_force_keypad (char*)"lckForceKp"
#define preference_opener_force_id (char*)"opForceId"
#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"
#define preference_debug_connect (char*)"dbgConnect"
#define preference_debug_communication (char*)"dbgCommu"
#define preference_debug_readable_data (char*)"dbgReadData"
#define preference_debug_hex_data (char*)"dbgHexData"
#define preference_debug_command (char*)"dbgCommand"
#define preference_update_time (char*)"updateTime"
#define preference_cred_user (char*)"crdusr"
#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"
#define preference_cred_duo_enabled (char*)"duoena"
#define preference_cred_duo_host (char*)"duoHost"
#define preference_cred_duo_ikey (char*)"duoIkey"
#define preference_cred_duo_skey (char*)"duoSkey"
#define preference_cred_duo_user (char*)"duoUser"
#define preference_cred_session_lifetime (char*)"credLf"
#define preference_cred_session_lifetime_remember (char*)"credLfRmbr"
#define preference_cred_session_lifetime_duo (char*)"credLfDuo"
#define preference_cred_session_lifetime_duo_remember (char*)"credLfDuoRmbr"
#define preference_cred_session_lifetime_totp (char*)"credLfTotp"
#define preference_cred_session_lifetime_totp_remember (char*)"credLfTotpRmbr"
#define preference_cred_duo_approval (char*)"duoApprove"
#define preference_cred_bypass_boot_btn_enabled (char*)"bypassBtBtn"
#define preference_cred_bypass_gpio_high (char*)"bypassHigh"
#define preference_cred_bypass_gpio_low (char*)"bypassLow"
#define preference_disable_network_not_connected (char*)"disNtwNoCon"
#define preference_webserver_enabled (char*)"websrvena"
#define preference_hass_device_discovery (char*)"hassdevdisc"
#define preference_webserial_enabled (char*)"weblog"
#define preference_config_from_mqtt (char*)"nhCntrlEnabled"
#define preference_publish_config (char*)"nhPubConfig"
#define preference_update_from_mqtt (char*)"updMqtt"
#define preference_mqtt_broker (char*)"mqttbroker"
#define preference_mqtt_broker_port (char*)"mqttport"
#define preference_mqtt_user (char*)"mqttuser"
#define preference_mqtt_password (char*)"mqttpass"
#define preference_mqtt_lock_path (char*)"mqttpath"
#define preference_mqtt_hass_enabled (char*)"hassena"
#define preference_mqtt_hass_discovery (char*)"hassdiscovery"
#define preference_disable_non_json (char*)"disnonjson"
#define preference_official_hybrid_enabled (char*)"offHybrid"
#define preference_auth_control_enabled (char*)"authCtrlEna"
#define preference_keypad_control_enabled (char*)"kpCntrlEnabled"
#define preference_timecontrol_control_enabled (char*)"tcCntrlEnabled"
#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
//NOT USER CHANGABLE
#define preference_mfa_reconfigure (char*)"mfaRECONF"

View File

@@ -669,6 +669,34 @@ void WebCfgServer::initialize()
return res;
}
#ifndef NUKI_HUB_UPDATER
else if (value == "restartservices")
{
String value2 = "";
if(request->hasParam("CONFIRMTOKEN"))
{
const PsychicWebParameter* p = request->getParam("CONFIRMTOKEN");
if(p->value() != "")
{
value2 = p->value();
}
}
else
{
return buildConfirmHtml(request, resp, "No confirm code set.", 3, true);
}
if(value2 != _confirmCode)
{
resp->setCode(302);
resp->addHeader("Cache-Control", "no-cache");
return resp->redirect("/");
}
esp_err_t res = buildConfirmHtml(request, resp, "Restarting services...", 2, true);
_network->setRestartServices(_restartServicesRequired);
_restartServicesRequired = 0;
waitAndProcess(true, 1000);
return res;
}
else if (value == "info")
{
return buildInfoHtml(request, resp);
@@ -778,7 +806,7 @@ void WebCfgServer::initialize()
else if (value == "selfsignhttps")
{
return buildHttpSSLConfigHtml(request, resp, 3);
}
}
else if (value == "nukicfg")
{
return buildNukiConfigHtml(request, resp);
@@ -2463,6 +2491,8 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
bool networkReconfigure = false;
bool clearSession = false;
bool newMFA = false;
bool restartServicesNoReconnect = false;
bool restartServicesReconnect = false;
unsigned char currentBleAddress[6];
unsigned char authorizationId[4] = {0x00};
unsigned char secretKeyK[32] = {0x00};
@@ -2506,7 +2536,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_broker, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "MQTTPORT")
@@ -2516,7 +2546,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_mqtt_broker_port, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "MQTTUSER")
@@ -2532,7 +2562,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_user, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
}
@@ -2545,7 +2575,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_password, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
}
@@ -2556,7 +2586,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_lock_path, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "MQTTCA")
@@ -2700,7 +2730,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
}
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
}
@@ -2736,7 +2766,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
}
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
}
@@ -2745,7 +2775,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
createSSLCertificate();
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
configChanged = true;
}
#endif
else if(key == "UPTIME")
@@ -2755,7 +2785,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_update_time, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "TIMESRV")
@@ -2925,7 +2955,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_rssi_publish_interval, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "HTTPSFQDN")
@@ -2935,7 +2964,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_https_fqdn, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "DUOHOST")
@@ -2947,7 +2976,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_duo_host, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
newMFA = true;
}
@@ -2962,7 +2991,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_duo_ikey, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
newMFA = true;
}
@@ -2977,7 +3006,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_duo_skey, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
newMFA = true;
}
@@ -2992,7 +3021,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_duo_user, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
newMFA = true;
}
@@ -3008,7 +3037,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
}
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
newMFA = true;
}
@@ -3020,7 +3049,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_cred_bypass_boot_btn_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "DUOBYPASSHIGH")
@@ -3030,7 +3059,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_bypass_gpio_high, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "DUOBYPASSLOW")
@@ -3040,7 +3069,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_bypass_gpio_low, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "DUOAPPROVAL")
@@ -3050,7 +3079,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_cred_duo_approval, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "CREDLFTM")
@@ -3060,7 +3089,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_session_lifetime, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
}
@@ -3071,7 +3100,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_session_lifetime_remember, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
}
@@ -3082,7 +3111,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_session_lifetime_duo, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
}
@@ -3093,7 +3122,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_session_lifetime_duo_remember, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
}
@@ -3104,7 +3133,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_session_lifetime_totp, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
}
@@ -3115,7 +3144,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_session_lifetime_totp_remember, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
}
@@ -3127,7 +3156,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_hass_device_discovery, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "ENHADISC")
@@ -3138,7 +3167,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_mqtt_hass_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "HASSDISCOVERY")
@@ -3149,7 +3178,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_hass_discovery, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "OPENERCONT")
@@ -3159,7 +3188,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_opener_continuous_mode, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "HASSCUURL")
@@ -3169,7 +3197,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_hass_cu_url, value);
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "HOSTNAME")
@@ -3189,7 +3216,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_network_timeout, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "FINDBESTRSSI")
@@ -3199,7 +3225,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_find_best_rssi, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "RSTDISC")
@@ -3209,7 +3234,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_restart_on_disconnect, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "MQTTLOG")
@@ -3239,7 +3263,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_webserial_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "CHECKUPDATE")
@@ -3249,7 +3273,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_check_updates, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "UPDATEMQTT")
@@ -3259,7 +3283,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_update_from_mqtt, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "OFFHYBRID")
@@ -3273,7 +3297,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
}
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "HYBRIDACT")
@@ -3287,7 +3311,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
}
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "HYBRIDTIMER")
@@ -3297,7 +3320,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_query_interval_hybrid_lockstate, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "HYBRIDRETRY")
@@ -3307,7 +3329,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_official_hybrid_retry, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "HYBRIDREBOOT")
@@ -3317,7 +3338,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_hybrid_reboot_on_disconnect, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "DISNONJSON")
@@ -3327,7 +3348,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_disable_non_json, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "DHCPENA")
@@ -3387,7 +3408,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_query_interval_lockstate, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "CFGINT")
@@ -3397,7 +3417,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_query_interval_configuration, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "BATINT")
@@ -3407,7 +3426,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_query_interval_battery, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "KPINT")
@@ -3417,7 +3435,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_query_interval_keypad, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "NRTRY")
@@ -3427,7 +3444,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_command_nr_of_retries, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "TRYDLY")
@@ -3437,7 +3453,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_command_retry_delay, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "TXPWR")
@@ -3453,7 +3468,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_ble_tx_power, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
}
@@ -3464,7 +3478,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_restart_ble_beacon_lost, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "TSKNTWK")
@@ -3502,7 +3515,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_authlog_max_entries, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
}
@@ -3515,7 +3527,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_keypad_max_entries, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
}
@@ -3528,7 +3539,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_timecontrol_max_entries, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
}
@@ -3541,7 +3551,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_auth_max_entries, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
}
@@ -3565,7 +3574,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_enable_bootloop_reset, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "DISNTWNOCON")
@@ -3575,7 +3583,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_disable_network_not_connected, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "OTAUPD")
@@ -3605,7 +3613,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_show_secrets, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "DBGCONN")
@@ -3615,7 +3622,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_debug_connect, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "DBGCOMMU")
@@ -3625,7 +3632,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_debug_communication, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "DBGHEAP")
@@ -3635,7 +3642,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_publish_debug_info, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "DBGREAD")
@@ -3645,7 +3652,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_debug_readable_data, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "DBGHEX")
@@ -3655,7 +3662,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_debug_hex_data, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "DBGCOMM")
@@ -3665,7 +3672,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_debug_command, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "LCKFORCEID")
@@ -3724,7 +3731,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_conf_info_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "CONFNHPUB")
@@ -3738,7 +3744,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_publish_config, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "CONFNHCTRL")
@@ -3752,7 +3758,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_config_from_mqtt, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "KPPUB")
@@ -3762,7 +3768,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_keypad_info_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "KPCODE")
@@ -3772,7 +3777,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_keypad_publish_code, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "KPCHECK")
@@ -3782,7 +3786,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_keypad_check_code_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "KPENA")
@@ -3792,7 +3795,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_keypad_control_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "TCPUB")
@@ -3802,7 +3805,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_timecontrol_info_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "AUTHPUB")
@@ -3812,7 +3814,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_auth_info_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "KPPER")
@@ -3822,7 +3823,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_keypad_topic_per_entry, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "TCPER")
@@ -3832,7 +3832,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_timecontrol_topic_per_entry, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "TCENA")
@@ -3842,7 +3841,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_timecontrol_control_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "AUTHPER")
@@ -3852,7 +3851,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_auth_topic_per_entry, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "AUTHENA")
@@ -3862,7 +3860,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_auth_control_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "PUBAUTH")
@@ -3872,7 +3870,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_publish_authdata, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "CREDDIGEST")
@@ -3882,7 +3879,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_http_auth_type, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
}
@@ -3895,7 +3892,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_bypass_proxy, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
}
@@ -4279,7 +4276,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_register_as_app, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "REGAPPOPN")
@@ -4289,7 +4285,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_register_opener_as_app, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
//configChanged = true;
}
}
else if(key == "LOCKENA")
@@ -4299,7 +4294,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_lock_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "GEMINIENA")
@@ -4316,7 +4311,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
}
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "OPENA")
@@ -4326,7 +4321,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_opener_enabled, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesReconnect = true;
}
}
else if(key == "CONNMODE")
@@ -4336,7 +4331,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_connect_mode, (value == "1"));
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else if(key == "CREDUSER")
@@ -4352,7 +4347,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_user, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
}
@@ -4374,7 +4369,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_totp_secret, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
newMFA = true;
_importExport->_sessionsOpts[request->client()->localIP().toString() + "totp"] = true;
@@ -4390,7 +4385,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_bypass_secret, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
}
@@ -4403,7 +4398,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_admin_secret, value);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
}
}
}
@@ -4424,7 +4418,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
}
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
else
{
@@ -4437,7 +4431,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_lock_gemini_pin, value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
else
@@ -4448,7 +4442,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_nuki->setPin(value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
}
@@ -4461,7 +4455,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_nukiOpener->setPin(0xffff);
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
else
{
@@ -4471,7 +4465,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_nukiOpener->setPin(value.toInt());
Log->print("Setting changed: ");
Log->println(key);
configChanged = true;
restartServicesNoReconnect = true;
}
}
}
@@ -4551,7 +4545,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
nukiBlePref.end();
Log->print("Setting changed: ");
Log->println("Lock pairing data");
configChanged = true;
restartServicesNoReconnect = true;
}
if(manPairOpn)
@@ -4566,7 +4560,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
nukiBlePref.end();
Log->print("Setting changed: ");
Log->println("Opener pairing data");
configChanged = true;
restartServicesNoReconnect = true;
}
if(pass1 != "" && pass1 != "*" && pass1 == pass2)
@@ -4576,7 +4570,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_password, pass1);
Log->print("Setting changed: ");
Log->println("CREDPASS");
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
}
@@ -4588,14 +4582,14 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_user, "");
Log->print("Setting changed: ");
Log->println("MQTTUSER");
configChanged = true;
restartServicesReconnect = true;
}
if(_preferences->getString(preference_mqtt_password, "") != "")
{
_preferences->putString(preference_mqtt_password, "");
Log->print("Setting changed: ");
Log->println("MQTTPASS");
configChanged = true;
restartServicesReconnect = true;
}
}
@@ -4606,7 +4600,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_user, "");
Log->print("Setting changed: ");
Log->println("CREDUSER");
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
if(_preferences->getString(preference_cred_password, "") != "")
@@ -4614,7 +4608,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_password, "");
Log->print("Setting changed: ");
Log->println("CREDPASS");
configChanged = true;
restartServicesNoReconnect = true;
clearSession = true;
}
}
@@ -4639,7 +4633,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBytes(preference_acl, (byte*)(&aclPrefs), sizeof(aclPrefs));
Log->print("Setting changed: ");
Log->println("ACLPREFS");
//configChanged = true;
break;
}
}
@@ -4650,7 +4643,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBytes(preference_conf_lock_basic_acl, (byte*)(&basicLockConfigAclPrefs), sizeof(basicLockConfigAclPrefs));
Log->print("Setting changed: ");
Log->println("ACLCONFBASICLOCK");
//configChanged = true;
break;
}
}
@@ -4661,7 +4653,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBytes(preference_conf_lock_advanced_acl, (byte*)(&advancedLockConfigAclPrefs), sizeof(advancedLockConfigAclPrefs));
Log->print("Setting changed: ");
Log->println("ACLCONFADVANCEDLOCK");
//configChanged = true;
break;
}
@@ -4673,7 +4664,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBytes(preference_conf_opener_basic_acl, (byte*)(&basicOpenerConfigAclPrefs), sizeof(basicOpenerConfigAclPrefs));
Log->print("Setting changed: ");
Log->println("ACLCONFBASICOPENER");
//configChanged = true;
break;
}
}
@@ -4684,7 +4674,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBytes(preference_conf_opener_advanced_acl, (byte*)(&advancedOpenerConfigAclPrefs), sizeof(advancedOpenerConfigAclPrefs));
Log->print("Setting changed: ");
Log->println("ACLCONFADVANCEDOPENER");
//configChanged = true;
break;
}
}
@@ -4694,21 +4683,34 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
{
clearSessions();
}
if(newMFA)
{
_preferences->putBool(preference_mfa_reconfigure, true);
_importExport->readSettings();
}
if(configChanged)
{
message = "Configuration saved, reboot required to apply";
message = "Configuration saved, reboot required to apply some settings";
_rebootRequired = true;
}
else if (restartServicesReconnect)
{
message = "Configuration saved, restart services required to apply some settings";
_restartServicesRequired = 2;
}
else if (restartServicesNoReconnect)
{
message = "Configuration saved, restart services required to apply some settings";
_restartServicesRequired = 1;
}
else
{
message = "Configuration saved.";
}
_importExport->readSettings();
_network->readSettings();
if(_nuki != nullptr)
{
@@ -4858,7 +4860,11 @@ esp_err_t WebCfgServer::buildHtml(PsychicRequest *request, PsychicResponse* resp
buildHtmlHeader(&response, header);
if(_rebootRequired)
{
response.print("<table><tbody><tr><td colspan=\"2\" style=\"border: 0; color: red; font-size: 32px; font-weight: bold; text-align: center;\">REBOOT REQUIRED TO APPLY SETTINGS</td></tr></tbody></table>");
response.print("<table><tbody><tr><td colspan=\"2\" style=\"border: 0; color: red; font-size: 32px; font-weight: bold; text-align: center;\">REBOOT REQUIRED TO APPLY SOME SETTINGS</td></tr></tbody></table>");
}
if(_restartServicesRequired > 0)
{
response.print("<table><tbody><tr><td colspan=\"2\" style=\"border: 0; color: red; font-size: 32px; font-weight: bold; text-align: center;\">RESTART SERVICES REQUIRED TO APPLY SOME SETTINGS</td></tr></tbody></table>");
}
if(_preferences->getBool(preference_webserial_enabled, false))
{
@@ -4945,8 +4951,10 @@ esp_err_t WebCfgServer::buildHtml(PsychicRequest *request, PsychicResponse* resp
}
#endif
buildNavigationMenuEntry(&response, "Info page", "/get?page=info");
String rebooturl = "/get?page=reboot&CONFIRMTOKEN=" + _confirmCode;
buildNavigationMenuEntry(&response, "Reboot Nuki Hub", rebooturl.c_str());
String rebootUrl = "/get?page=reboot&CONFIRMTOKEN=" + _confirmCode;
buildNavigationMenuEntry(&response, "Reboot Nuki Hub", rebootUrl.c_str());
String restartServicesUrl = "/get?page=restartservices&CONFIRMTOKEN=" + _confirmCode;
buildNavigationMenuEntry(&response, "Restart Services", restartServicesUrl.c_str());
if (_preferences->getInt(preference_http_auth_type, 0) == 2)
{
buildNavigationMenuEntry(&response, "Logout", "/get?page=logout");
@@ -6667,7 +6675,7 @@ esp_err_t WebCfgServer::processUnpair(PsychicRequest *request, PsychicResponse*
return buildConfirmHtml(request, resp, "Confirm code is invalid.", 3, true);
}
esp_err_t res = buildConfirmHtml(request, resp, opener ? "Unpairing Nuki Opener and restarting." : "Unpairing Nuki Lock and restarting.", 3, true);
esp_err_t res = buildConfirmHtml(request, resp, opener ? "Unpairing Nuki Opener." : "Unpairing Nuki Lock.", 3, true);
if(!opener && _nuki != nullptr)
{
@@ -6682,7 +6690,7 @@ esp_err_t WebCfgServer::processUnpair(PsychicRequest *request, PsychicResponse*
_network->disableHASS();
waitAndProcess(false, 1000);
restartEsp(RestartReason::DeviceUnpaired);
_network->setRestartServices(true);
return res;
}
@@ -7008,7 +7016,7 @@ const std::vector<std::pair<String, String>> WebCfgServer::getNetworkCustomCLKOp
{
std::vector<std::pair<String, String>> options;
options.push_back(std::make_pair("0", "GPIO0 IN"));
options.push_back(std::make_pair("1", "GPIO0 OUT"));
options.push_back(std::make_pair("1", "GPIO0 OUT"));
options.push_back(std::make_pair("2", "GPIO16 OUT"));
options.push_back(std::make_pair("3", "GPIO17 OUT"));
return options;

View File

@@ -99,6 +99,7 @@ private:
Gpio* _gpio = nullptr;
bool _brokerConfigured = false;
bool _rebootRequired = false;
int _restartServicesRequired = 0;
#endif
std::vector<String> _ssidList;

View File

@@ -105,6 +105,9 @@ bool coredumpPrinted = true;
bool timeSynced = false;
bool webStarted = false;
bool webSSLStarted = false;
bool lockStarted = false;
bool openerStarted = false;
bool bleScannerStarted = false;
uint8_t partitionType = -1;
int lastHTTPeventId = -1;
@@ -243,96 +246,6 @@ void cbSyncTime(struct timeval *tv) {
timeSynced = true;
}
void networkTask(void *pvParameters)
{
int64_t networkLoopTs = 0;
bool reroute = true;
if(preferences->getBool(preference_show_secrets, false))
{
preferences->putBool(preference_show_secrets, false);
}
while(true)
{
int64_t ts = espMillis();
if(ts > 120000 && ts < 125000)
{
if(bootloopCounter > 0)
{
bootloopCounter = (int8_t)0;
Log->println("Bootloop counter reset");
}
}
#ifndef NUKI_HUB_UPDATER
if(serialReader != nullptr)
{
serialReader->update();
}
#endif
network->update();
bool connected = network->isConnected();
if(connected && reroute)
{
if(preferences->getBool(preference_update_time, false))
{
esp_netif_sntp_start();
}
/* MDNS currently disabled for causing issues (9.10 / 2025-04-01)
if(webSSLStarted) {
if (MDNS.begin(preferences->getString(preference_hostname, "nukihub").c_str())) {
MDNS.addService("http", "tcp", 443);
}
}
else if(webStarted) {
if (MDNS.begin(preferences->getString(preference_hostname, "nukihub").c_str())) {
MDNS.addService("http", "tcp", 80);
}
}
*/
reroute = false;
setReroute();
}
#ifndef NUKI_HUB_UPDATER
wifiConnected = network->wifiConnected();
if(connected && lockEnabled)
{
rebootLock = networkLock->update();
}
if(connected && openerEnabled)
{
networkOpener->update();
}
#endif
if(espMillis() - networkLoopTs > 120000)
{
Log->println("networkTask is running");
networkLoopTs = espMillis();
}
if(espMillis() > restartTs)
{
partitionType = checkPartition();
if(partitionType!=1)
{
esp_ota_set_boot_partition(esp_ota_get_next_update_partition(NULL));
}
restartEsp(RestartReason::RestartTimer);
}
#if !defined(CONFIG_IDF_TARGET_ESP32C5)
esp_task_wdt_reset();
#endif
}
}
#ifndef NUKI_HUB_UPDATER
void startWebServer()
{
@@ -428,9 +341,46 @@ void startWebServer()
#endif
}
void restartBle()
void startNuki(bool lock)
{
if (lock)
{
nukiOfficial = new NukiOfficial(preferences);
networkLock = new NukiNetworkLock(network, nukiOfficial, preferences, CharBuffer::get(), buffer_size);
if(!disableNetwork)
{
networkLock->initialize();
}
lockStarted = true;
}
else
{
networkOpener = new NukiNetworkOpener(network, preferences, CharBuffer::get(), buffer_size);
if(!disableNetwork)
{
networkOpener->initialize();
}
openerStarted = true;
}
}
void restartServices(bool reconnect)
{
bleDone = false;
lockEnabled = preferences->getBool(preference_lock_enabled);
openerEnabled = preferences->getBool(preference_opener_enabled);
importExport->readSettings();
network->readSettings();
gpio->setPins();
if (reconnect)
{
network->reconnect(true);
}
if(webSSLStarted)
{
@@ -462,27 +412,45 @@ void restartBle()
Log->println("Deleting webCfgServer done");
}
if(lockEnabled)
if(lockStarted)
{
Log->println("Deleting nuki");
delete nuki;
nuki = nullptr;
if (reconnect)
{
lockStarted = false;
delete networkLock;
networkLock = nullptr;
delete nukiOfficial;
nukiOfficial = nullptr;
}
Log->println("Deleting nuki done");
}
if(openerEnabled)
if(openerStarted)
{
Log->println("Deleting nukiOpener");
delete nukiOpener;
nukiOpener = nullptr;
if (reconnect)
{
openerStarted = false;
delete networkOpener;
networkOpener = nullptr;
}
Log->println("Deleting nukiOpener done");
}
Log->println("Destroying scanner from main");
delete bleScanner;
Log->println("Scanner deleted");
bleScanner = nullptr;
Log->println("Scanner nulled from main");
if (bleScannerStarted)
{
bleScannerStarted = false;
Log->println("Destroying scanner from main");
delete bleScanner;
Log->println("Scanner deleted");
bleScanner = nullptr;
Log->println("Scanner nulled from main");
}
if (BLEDevice::isInitialized()) {
Log->println("Deinit BLE device");
@@ -491,25 +459,44 @@ void restartBle()
}
delay(2000);
Log->println("Restarting BLE Scanner");
bleScanner = new BleScanner::Scanner();
bleScanner->initialize("NukiHub", true, 40, 40);
bleScanner->setScanDuration(0);
Log->println("Restarting BLE Scanner done");
if(lockEnabled || openerEnabled)
{
Log->println("Restarting BLE Scanner");
bleScanner = new BleScanner::Scanner();
bleScanner->initialize("NukiHub", true, 40, 40);
bleScanner->setScanDuration(0);
bleScannerStarted = true;
Log->println("Restarting BLE Scanner done");
}
if(lockEnabled)
{
Log->println("Restarting Nuki lock");
if (reconnect)
{
startNuki(true);
}
nuki = new NukiWrapper("NukiHub", deviceIdLock, bleScanner, networkLock, nukiOfficial, gpio, preferences, CharBuffer::get(), buffer_size);
nuki->initialize();
bleScanner->whitelist(nuki->getBleAddress());
Log->println("Restarting Nuki lock done");
}
if(openerEnabled)
{
Log->println("Restarting Nuki opener");
if (reconnect)
{
startNuki(false);
}
nukiOpener = new NukiOpenerWrapper("NukiHub", deviceIdOpener, bleScanner, networkOpener, gpio, preferences, CharBuffer::get(), buffer_size);
nukiOpener->initialize();
bleScanner->whitelist(nukiOpener->getBleAddress());
Log->println("Restarting Nuki opener done");
}
@@ -521,8 +508,121 @@ void restartBle()
startWebServer();
Log->println("Restarting web server done");
}
else if(!doOta && !disableNetwork && (forceEnableWebServer || preferences->getBool(preference_webserver_enabled, true) || preferences->getBool(preference_webserial_enabled, false)))
{
if(forceEnableWebServer || preferences->getBool(preference_webserver_enabled, true))
{
Log->println("Starting web server");
startWebServer();
Log->println("Starting web server done");
}
}
}
#endif
void networkTask(void *pvParameters)
{
int64_t networkLoopTs = 0;
bool reroute = true;
if(preferences->getBool(preference_show_secrets, false))
{
preferences->putBool(preference_show_secrets, false);
}
while(true)
{
int64_t ts = espMillis();
if(ts > 120000 && ts < 125000)
{
if(bootloopCounter > 0)
{
bootloopCounter = (int8_t)0;
Log->println("Bootloop counter reset");
}
}
#ifndef NUKI_HUB_UPDATER
if(serialReader != nullptr)
{
serialReader->update();
}
#endif
network->update();
bool connected = network->isConnected();
if(connected && reroute)
{
if(preferences->getBool(preference_update_time, false))
{
esp_netif_sntp_start();
}
/* MDNS currently disabled for causing issues (9.10 / 2025-04-01)
if(webSSLStarted) {
if (MDNS.begin(preferences->getString(preference_hostname, "nukihub").c_str())) {
MDNS.addService("http", "tcp", 443);
}
}
else if(webStarted) {
if (MDNS.begin(preferences->getString(preference_hostname, "nukihub").c_str())) {
MDNS.addService("http", "tcp", 80);
}
}
*/
reroute = false;
setReroute();
}
#ifndef NUKI_HUB_UPDATER
wifiConnected = network->wifiConnected();
int restartServ = network->getRestartServices();
if (restartServ == 1)
{
restartServices(false);
}
else if (restartServ == 2)
{
restartServices(true);
}
else
{
if(connected && lockStarted)
{
rebootLock = networkLock->update();
}
if(connected && openerStarted)
{
networkOpener->update();
}
}
#endif
if(espMillis() - networkLoopTs > 120000)
{
Log->println("networkTask is running");
networkLoopTs = espMillis();
}
if(espMillis() > restartTs)
{
partitionType = checkPartition();
if(partitionType!=1)
{
esp_ota_set_boot_partition(esp_ota_get_next_update_partition(NULL));
}
restartEsp(RestartReason::RestartTimer);
}
#if !defined(CONFIG_IDF_TARGET_ESP32C5)
esp_task_wdt_reset();
#endif
}
}
#ifndef NUKI_HUB_UPDATER
void nukiTask(void *pvParameters)
{
if (preferences->getBool(preference_mqtt_ssl_enabled, false))
@@ -544,10 +644,13 @@ void nukiTask(void *pvParameters)
{
if((disableNetwork || wifiConnected) && bleDone)
{
bleScanner->update();
delay(20);
bool needsPairing = (lockEnabled && !nuki->isPaired()) || (openerEnabled && !nukiOpener->isPaired());
if(bleScannerStarted)
{
bleScanner->update();
delay(20);
}
bool needsPairing = (lockStarted && !nuki->isPaired()) || (openerStarted && !nukiOpener->isPaired());
if (needsPairing)
{
@@ -566,7 +669,7 @@ void nukiTask(void *pvParameters)
}
}
if(lockEnabled)
if(lockStarted)
{
if (nuki->restartController() > 0)
{
@@ -584,7 +687,7 @@ void nukiTask(void *pvParameters)
else
{
lockRestartControllerCount += 1;
restartBle();
restartServices(false);
continue;
}
}
@@ -594,12 +697,12 @@ void nukiTask(void *pvParameters)
{
lockRestartControllerCount = 0;
}
nuki->update(rebootLock);
rebootLock = false;
}
}
if(openerEnabled)
if(openerStarted)
{
if (nukiOpener->restartController() > 0)
{
@@ -617,7 +720,7 @@ void nukiTask(void *pvParameters)
else
{
openerRestartControllerCount += 1;
restartBle();
restartServices(false);
continue;
}
}
@@ -627,7 +730,7 @@ void nukiTask(void *pvParameters)
{
openerRestartControllerCount = 0;
}
nukiOpener->update();
}
}
@@ -1138,11 +1241,9 @@ void setup()
gpio->getConfigurationText(gpioDesc, gpio->pinConfiguration(), "\n\r");
Log->print(gpioDesc.c_str());
const String mqttLockPath = preferences->getString(preference_mqtt_lock_path);
importExport = new ImportExport(preferences);
network = new NukiNetwork(preferences, gpio, mqttLockPath, CharBuffer::get(), buffer_size, importExport);
network = new NukiNetwork(preferences, gpio, CharBuffer::get(), buffer_size, importExport);
network->initialize();
lockEnabled = preferences->getBool(preference_lock_enabled);
@@ -1166,6 +1267,7 @@ void setup()
// https://developer.nuki.io/t/bluetooth-specification-questions/1109/27
bleScanner->initialize("NukiHub", true, 40, 40);
bleScanner->setScanDuration(0);
bleScannerStarted = true;
}
Log->println(lockEnabled ? F("Nuki Lock enabled") : F("Nuki Lock disabled"));