diff --git a/src/Gpio.cpp b/src/Gpio.cpp index fdf2447..e6b8420 100644 --- a/src/Gpio.cpp +++ b/src/Gpio.cpp @@ -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); diff --git a/src/Gpio.h b/src/Gpio.h index cd087d0..52f7686 100644 --- a/src/Gpio.h +++ b/src/Gpio.h @@ -76,6 +76,7 @@ public: const std::vector& 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 _triggerState; hw_timer_t* timer = nullptr; + + bool _first = true; Preferences* _preferences = nullptr; }; diff --git a/src/HomeAssistantDiscovery.cpp b/src/HomeAssistantDiscovery.cpp index 972cdf3..a56a21d 100644 --- a/src/HomeAssistantDiscovery.cpp +++ b/src/HomeAssistantDiscovery.cpp @@ -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> 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, ""); diff --git a/src/HomeAssistantDiscovery.h b/src/HomeAssistantDiscovery.h index 176990b..a81f9b4 100644 --- a/src/HomeAssistantDiscovery.h +++ b/src/HomeAssistantDiscovery.h @@ -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; }; \ No newline at end of file diff --git a/src/ImportExport.cpp b/src/ImportExport.cpp index 049be5c..ada783a 100644 --- a/src/ImportExport.cpp +++ b/src/ImportExport.cpp @@ -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)) { diff --git a/src/ImportExport.h b/src/ImportExport.h index 7d04516..62c3073 100644 --- a/src/ImportExport.h +++ b/src/ImportExport.h @@ -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; diff --git a/src/NukiNetwork.cpp b/src/NukiNetwork.cpp index 0017374..487644e 100644 --- a/src/NukiNetwork.cpp +++ b/src/NukiNetwork.cpp @@ -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) diff --git a/src/NukiNetwork.h b/src/NukiNetwork.h index 8fde0e7..a985d1a 100644 --- a/src/NukiNetwork.h +++ b/src/NukiNetwork.h @@ -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; diff --git a/src/PreferencesKeys.h b/src/PreferencesKeys.h index 5762e56..721159f 100644 --- a/src/PreferencesKeys.h +++ b/src/PreferencesKeys.h @@ -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" diff --git a/src/WebCfgServer.cpp b/src/WebCfgServer.cpp index 1f98a11..c1ad285 100644 --- a/src/WebCfgServer.cpp +++ b/src/WebCfgServer.cpp @@ -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("
REBOOT REQUIRED TO APPLY SETTINGS
"); + response.print("
REBOOT REQUIRED TO APPLY SOME SETTINGS
"); + } + if(_restartServicesRequired > 0) + { + response.print("
RESTART SERVICES REQUIRED TO APPLY SOME SETTINGS
"); } 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> WebCfgServer::getNetworkCustomCLKOp { std::vector> 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; diff --git a/src/WebCfgServer.h b/src/WebCfgServer.h index 4a97f34..0194441 100644 --- a/src/WebCfgServer.h +++ b/src/WebCfgServer.h @@ -99,6 +99,7 @@ private: Gpio* _gpio = nullptr; bool _brokerConfigured = false; bool _rebootRequired = false; + int _restartServicesRequired = 0; #endif std::vector _ssidList; diff --git a/src/main.cpp b/src/main.cpp index 09f0fad..7246050 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -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"));