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) : _preferences(preferences)
{ {
_inst = this; _inst = this;
loadPinConfiguration();
_inst->init(); _inst->init();
} }
@@ -120,6 +119,13 @@ void Gpio::init()
_inst->_triggerState.push_back(0); _inst->_triggerState.push_back(0);
} }
_inst->setPins();
}
void Gpio::setPins()
{
loadPinConfiguration();
bool hasInputPin = false; bool hasInputPin = false;
if (_inst->_preferences->getBool(preference_cred_bypass_boot_btn_enabled, 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); _inst->timer = timerBegin(1000000);
timerAttachInterrupt(_inst->timer, isrOnTimer); timerAttachInterrupt(_inst->timer, isrOnTimer);
timerAlarm(_inst->timer, 100000, true, 0); timerAlarm(_inst->timer, 100000, true, 0);

View File

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

View File

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

View File

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

View File

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

View File

@@ -43,6 +43,7 @@ private:
bool _duoActiveRequest; bool _duoActiveRequest;
bool _duoEnabled = false; bool _duoEnabled = false;
bool _bypassGPIO = false; bool _bypassGPIO = false;
bool _updateTime = false;
int _bypassGPIOHigh = -1; int _bypassGPIOHigh = -1;
int _bypassGPIOLow = -1; int _bypassGPIOLow = -1;
int64_t _duoRequestTS = 0; 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"); extern const uint8_t x509_crt_imported_bundle_bin_end[] asm("_binary_x509_crt_bundle_end");
#ifndef NUKI_HUB_UPDATER #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), : _preferences(preferences),
_gpio(gpio), _gpio(gpio),
_buffer(buffer), _buffer(buffer),
@@ -35,33 +35,6 @@ NukiNetwork::NukiNetwork(Preferences *preferences)
#endif #endif
{ {
_inst = this; _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(); setupDevice();
} }
@@ -76,9 +49,9 @@ void NukiNetwork::setupDevice()
if(hardwareDetect == 0) if(hardwareDetect == 0)
{ {
#ifndef CONFIG_IDF_TARGET_ESP32H2 #ifndef CONFIG_IDF_TARGET_ESP32H2
hardwareDetect = 1; hardwareDetect = 1;
#else #else
hardwareDetect = 11; hardwareDetect = 11;
_preferences->putInt(preference_network_custom_addr, 1); _preferences->putInt(preference_network_custom_addr, 1);
_preferences->putInt(preference_network_custom_cs, 8); _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_miso, 12);
_preferences->putInt(preference_network_custom_mosi, 13); _preferences->putInt(preference_network_custom_mosi, 13);
_preferences->putBool(preference_ntw_reconfigure, true); _preferences->putBool(preference_ntw_reconfigure, true);
#endif #endif
_preferences->putInt(preference_network_hardware, hardwareDetect); _preferences->putInt(preference_network_hardware, hardwareDetect);
} }
if(wifiFallback == true) if(wifiFallback == true)
{ {
#ifndef CONFIG_IDF_TARGET_ESP32H2 #ifndef CONFIG_IDF_TARGET_ESP32H2
if(!_firstBootAfterDeviceChange) if(!_firstBootAfterDeviceChange)
{ {
Log->println("Failed to connect to network. Wi-Fi fallback is disabled, rebooting."); 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."); Log->println("Switching to Wi-Fi device as fallback.");
_networkDeviceType = NetworkDeviceType::WiFi; _networkDeviceType = NetworkDeviceType::WiFi;
#else #else
int custEth = _preferences->getInt(preference_network_custom_phy, 0); int custEth = _preferences->getInt(preference_network_custom_phy, 0);
if(custEth<3) if(custEth<3)
@@ -118,7 +91,7 @@ void NukiNetwork::setupDevice()
} }
_preferences->putInt(preference_network_custom_phy, custEth); _preferences->putInt(preference_network_custom_phy, custEth);
_preferences->putBool(preference_ntw_reconfigure, true); _preferences->putBool(preference_ntw_reconfigure, true);
#endif #endif
} }
else else
{ {
@@ -248,6 +221,9 @@ bool NukiNetwork::update()
#else #else
void NukiNetwork::initialize() void NukiNetwork::initialize()
{ {
readSettings();
setMQTTConnectionSettings();
_gpio->addCallback([this](const GpioAction& action, const int& pin) _gpio->addCallback([this](const GpioAction& action, const int& pin)
{ {
gpioActionCallback(action, pin); gpioActionCallback(action, pin);
@@ -255,14 +231,6 @@ void NukiNetwork::initialize()
if(!disableNetwork) 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, ""); _hostname = _preferences->getString(preference_hostname, "");
if(_hostname == "") if(_hostname == "")
@@ -277,48 +245,12 @@ void NukiNetwork::initialize()
_preferences->putString(preference_hostname, _hostname); _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()); strcpy(_hostnameArr, _hostname.c_str());
_device->initialize(); _device->initialize();
Log->print("Host name: "); Log->print("Host name: ");
Log->println(_hostname); 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->mqttSetClientId(_hostnameArr);
_device->mqttSetCleanSession(false); _device->mqttSetCleanSession(false);
_device->mqttSetKeepAlive(60); _device->mqttSetKeepAlive(60);
@@ -359,13 +291,12 @@ void NukiNetwork::initialize()
break; break;
} }
} }
readSettings();
} }
} }
void NukiNetwork::readSettings() void NukiNetwork::readSettings()
{ {
_webEnabled = _preferences->getBool(preference_webserver_enabled, true);
_disableNetworkIfNotConnected = _preferences->getBool(preference_disable_network_not_connected, false); _disableNetworkIfNotConnected = _preferences->getBool(preference_disable_network_not_connected, false);
_restartOnDisconnect = _preferences->getBool(preference_restart_on_disconnect, false); _restartOnDisconnect = _preferences->getBool(preference_restart_on_disconnect, false);
_checkUpdates = _preferences->getBool(preference_check_updates, false); _checkUpdates = _preferences->getBool(preference_check_updates, false);
@@ -388,6 +319,99 @@ void NukiNetwork::readSettings()
_publishDebugInfo = _preferences->getBool(preference_publish_debug_info, false); _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() bool NukiNetwork::update()
{ {
wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT(); wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
@@ -456,7 +480,7 @@ bool NukiNetwork::update()
{ {
forceEnableWebServer = false; forceEnableWebServer = false;
delay(200); delay(200);
restartEsp(RestartReason::ReconfigureWebServer); setRestartServices(false);
} }
else if(!_webEnabled) else if(!_webEnabled)
{ {
@@ -656,12 +680,20 @@ void NukiNetwork::onMqttDisconnect(const espMqttClientTypes::DisconnectReason &r
} }
} }
bool NukiNetwork::reconnect() bool NukiNetwork::reconnect(bool force)
{ {
_mqttConnectionState = 0; _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) if(strcmp(_mqttBrokerAddr, "") == 0)
{ {
Log->println("MQTT Broker not configured, aborting connection attempt."); Log->println("MQTT Broker not configured, aborting connection attempt.");
@@ -1077,7 +1109,7 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
{ {
return; return;
} }
Log->println("Webserver enabled, restarting."); Log->println("Webserver enabled");
_preferences->putBool(preference_webserver_enabled, true); _preferences->putBool(preference_webserver_enabled, true);
} }
else if (strcmp(data, "0") == 0) else if (strcmp(data, "0") == 0)
@@ -1086,12 +1118,12 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
{ {
return; return;
} }
Log->println("Webserver disabled, restarting."); Log->println("Webserver disabled");
_preferences->putBool(preference_webserver_enabled, false); _preferences->putBool(preference_webserver_enabled, false);
} }
clearWifiFallback(); clearWifiFallback();
delay(200); delay(200);
restartEsp(RestartReason::ReconfigureWebServer); setRestartServices(false);
} }
else if(comparePrefixedPath(topic, mqtt_topic_nuki_hub_config_action) && !mqttRecentlyConnected()) 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); path.concat(mqttTopic);
publish(path.c_str(), "", true); publish(path.c_str(), "", true);
#ifdef DEBUG_NUKIHUB #ifdef DEBUG_NUKIHUB
Log->print("Removing MQTT topic: "); Log->print("Removing MQTT topic: ");
Log->println(path.c_str()); 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) 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 mqttConnected();
bool wifiConnected(); bool wifiConnected();
void clearWifiFallback(); void clearWifiFallback();
int getRestartServices();
void setRestartServices(bool reconnect = false);
const String networkDeviceName() const; const String networkDeviceName() const;
const String networkBSSID() const; const String networkBSSID() const;
@@ -43,13 +45,14 @@ public:
#ifdef NUKI_HUB_UPDATER #ifdef NUKI_HUB_UPDATER
explicit NukiNetwork(Preferences* preferences); explicit NukiNetwork(Preferences* preferences);
#else #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 registerMqttReceiver(MqttReceiver* receiver);
void disableAutoRestarts(); // disable on OTA start void disableAutoRestarts(); // disable on OTA start
void disableMqtt(); void disableMqtt();
String localIP(); String localIP();
bool reconnect(bool force = false);
void subscribe(const char* prefix, const char* path); void subscribe(const char* prefix, const char* path);
void initTopic(const char* prefix, const char* path, const char* value); 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); void publishFloat(const char* prefix, const char* topic, const float value, bool retain, const uint8_t precision = 2);
@@ -93,7 +96,7 @@ public:
#endif #endif
private: private:
void setupDevice(); void setupDevice();
bool reconnect(); void setMQTTConnectionSettings();
static NukiNetwork* _inst; static NukiNetwork* _inst;
@@ -132,6 +135,7 @@ private:
ImportExport* _importExport; ImportExport* _importExport;
Gpio* _gpio; Gpio* _gpio;
int _restartServices = 0;
int _mqttConnectionState = 0; int _mqttConnectionState = 0;
int _mqttConnectCounter = 0; int _mqttConnectCounter = 0;
int _mqttPort = 1883; int _mqttPort = 1883;

View File

@@ -12,23 +12,12 @@
#endif #endif
//CHANGE REQUIRES REBOOT TO TAKE EFFECT //CHANGE REQUIRES REBOOT TO TAKE EFFECT
//NETWORK RELATED
#define preference_ip_dhcp_enabled (char*)"dhcpena" #define preference_ip_dhcp_enabled (char*)"dhcpena"
#define preference_ip_address (char*)"ipaddr" #define preference_ip_address (char*)"ipaddr"
#define preference_ip_subnet (char*)"ipsub" #define preference_ip_subnet (char*)"ipsub"
#define preference_ip_gateway (char*)"ipgtw" #define preference_ip_gateway (char*)"ipgtw"
#define preference_ip_dns_server (char*)"dnssrv" #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_network_hardware (char*)"nwhw"
#define preference_hostname (char*)"hostname" #define preference_hostname (char*)"hostname"
#define preference_network_custom_phy (char*)"ntwPHY" #define preference_network_custom_phy (char*)"ntwPHY"
@@ -43,61 +32,26 @@
#define preference_network_custom_mdio (char*)"ntwMDIO" #define preference_network_custom_mdio (char*)"ntwMDIO"
#define preference_network_custom_mdc (char*)"ntwMDC" #define preference_network_custom_mdc (char*)"ntwMDC"
#define preference_network_custom_clk (char*)"ntwCLK" #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_ssid (char*)"wifiSSID"
#define preference_wifi_pass (char*)"wifiPass" #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" #define preference_time_server (char*)"timeServer"
//MQTT RELATED
#define preference_mqtt_ssl_enabled (char*)"mqttSSLena" #define preference_mqtt_ssl_enabled (char*)"mqttSSLena"
#define preference_lock_gemini_pin (char*)"geminiPin" #define preference_mqtt_ca (char*)"mqttca"
#define preference_lock_gemini_enabled (char*)"geminiena" #define preference_mqtt_crt (char*)"mqttcrt"
#define preference_cred_duo_enabled (char*)"duoena" #define preference_mqtt_key (char*)"mqttkey"
#define preference_cred_duo_host (char*)"duoHost" #define preference_mqtt_log_enabled (char*)"mqttlog"
#define preference_cred_duo_ikey (char*)"duoIkey" #define preference_gpio_configuration (char*)"gpiocfg"
#define preference_cred_duo_skey (char*)"duoSkey"
#define preference_cred_duo_user (char*)"duoUser" //TASKS RELATED
#define preference_https_fqdn (char*)"httpsFQDN" #define preference_task_size_network (char*)"tsksznetw"
#define preference_bypass_proxy (char*)"credBypass" #define preference_task_size_nuki (char*)"tsksznuki"
#define preference_cred_session_lifetime (char*)"credLf"
#define preference_cred_session_lifetime_remember (char*)"credLfRmbr" //OTHER
#define preference_cred_session_lifetime_duo (char*)"credLfDuo" #define preference_ota_main_url (char*)"otaMainUrl"
#define preference_cred_session_lifetime_duo_remember (char*)"credLfDuoRmbr" #define preference_ota_updater_url (char*)"otaUpdUrl"
#define preference_cred_session_lifetime_totp (char*)"credLfTotp" #define preference_buffer_size (char*)"buffsize"
#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"
// CHANGE DOES NOT REQUIRE REBOOT TO TAKE EFFECT // CHANGE DOES NOT REQUIRE REBOOT TO TAKE EFFECT
#define preference_find_best_rssi (char*)"nwbestrssi" #define preference_find_best_rssi (char*)"nwbestrssi"
@@ -149,7 +103,65 @@
#define preference_lock_force_keypad (char*)"lckForceKp" #define preference_lock_force_keypad (char*)"lckForceKp"
#define preference_opener_force_id (char*)"opForceId" #define preference_opener_force_id (char*)"opForceId"
#define preference_opener_force_keypad (char*)"opForceKp" #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_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 //NOT USER CHANGABLE
#define preference_mfa_reconfigure (char*)"mfaRECONF" #define preference_mfa_reconfigure (char*)"mfaRECONF"

View File

@@ -669,6 +669,34 @@ void WebCfgServer::initialize()
return res; return res;
} }
#ifndef NUKI_HUB_UPDATER #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") else if (value == "info")
{ {
return buildInfoHtml(request, resp); return buildInfoHtml(request, resp);
@@ -2463,6 +2491,8 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
bool networkReconfigure = false; bool networkReconfigure = false;
bool clearSession = false; bool clearSession = false;
bool newMFA = false; bool newMFA = false;
bool restartServicesNoReconnect = false;
bool restartServicesReconnect = false;
unsigned char currentBleAddress[6]; unsigned char currentBleAddress[6];
unsigned char authorizationId[4] = {0x00}; unsigned char authorizationId[4] = {0x00};
unsigned char secretKeyK[32] = {0x00}; unsigned char secretKeyK[32] = {0x00};
@@ -2506,7 +2536,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_broker, value); _preferences->putString(preference_mqtt_broker, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "MQTTPORT") else if(key == "MQTTPORT")
@@ -2516,7 +2546,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_mqtt_broker_port, value.toInt()); _preferences->putInt(preference_mqtt_broker_port, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "MQTTUSER") else if(key == "MQTTUSER")
@@ -2532,7 +2562,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_user, value); _preferences->putString(preference_mqtt_user, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); 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); _preferences->putString(preference_mqtt_password, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); 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); _preferences->putString(preference_mqtt_lock_path, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "MQTTCA") else if(key == "MQTTCA")
@@ -2700,7 +2730,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
} }
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
} }
@@ -2736,7 +2766,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
} }
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
} }
@@ -2755,7 +2785,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_update_time, (value == "1")); _preferences->putBool(preference_update_time, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "TIMESRV") else if(key == "TIMESRV")
@@ -2925,7 +2955,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_rssi_publish_interval, value.toInt()); _preferences->putInt(preference_rssi_publish_interval, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "HTTPSFQDN") else if(key == "HTTPSFQDN")
@@ -2935,7 +2964,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_https_fqdn, value); _preferences->putString(preference_https_fqdn, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "DUOHOST") else if(key == "DUOHOST")
@@ -2947,7 +2976,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_duo_host, value); _preferences->putString(preference_cred_duo_host, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
newMFA = true; newMFA = true;
} }
@@ -2962,7 +2991,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_duo_ikey, value); _preferences->putString(preference_cred_duo_ikey, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
newMFA = true; newMFA = true;
} }
@@ -2977,7 +3006,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_duo_skey, value); _preferences->putString(preference_cred_duo_skey, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
newMFA = true; newMFA = true;
} }
@@ -2992,7 +3021,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_duo_user, value); _preferences->putString(preference_cred_duo_user, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
newMFA = true; newMFA = true;
} }
@@ -3008,7 +3037,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
} }
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
newMFA = 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")); _preferences->putBool(preference_cred_bypass_boot_btn_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "DUOBYPASSHIGH") 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()); _preferences->putInt(preference_cred_bypass_gpio_high, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "DUOBYPASSLOW") 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()); _preferences->putInt(preference_cred_bypass_gpio_low, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "DUOAPPROVAL") else if(key == "DUOAPPROVAL")
@@ -3050,7 +3079,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_cred_duo_approval, (value == "1")); _preferences->putBool(preference_cred_duo_approval, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "CREDLFTM") else if(key == "CREDLFTM")
@@ -3060,7 +3089,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_session_lifetime, value.toInt()); _preferences->putInt(preference_cred_session_lifetime, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
} }
} }
@@ -3071,7 +3100,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_session_lifetime_remember, value.toInt()); _preferences->putInt(preference_cred_session_lifetime_remember, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
} }
} }
@@ -3082,7 +3111,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_session_lifetime_duo, value.toInt()); _preferences->putInt(preference_cred_session_lifetime_duo, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = 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()); _preferences->putInt(preference_cred_session_lifetime_duo_remember, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
} }
} }
@@ -3104,7 +3133,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_cred_session_lifetime_totp, value.toInt()); _preferences->putInt(preference_cred_session_lifetime_totp, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = 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()); _preferences->putInt(preference_cred_session_lifetime_totp_remember, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
} }
} }
@@ -3127,7 +3156,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_hass_device_discovery, (value == "1")); _preferences->putBool(preference_hass_device_discovery, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "ENHADISC") else if(key == "ENHADISC")
@@ -3138,7 +3167,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_mqtt_hass_enabled, (value == "1")); _preferences->putBool(preference_mqtt_hass_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "HASSDISCOVERY") else if(key == "HASSDISCOVERY")
@@ -3149,7 +3178,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_hass_discovery, value); _preferences->putString(preference_mqtt_hass_discovery, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "OPENERCONT") else if(key == "OPENERCONT")
@@ -3159,7 +3188,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_opener_continuous_mode, (value == "1")); _preferences->putBool(preference_opener_continuous_mode, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "HASSCUURL") else if(key == "HASSCUURL")
@@ -3169,7 +3197,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_hass_cu_url, value); _preferences->putString(preference_mqtt_hass_cu_url, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "HOSTNAME") else if(key == "HOSTNAME")
@@ -3189,7 +3216,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_network_timeout, value.toInt()); _preferences->putInt(preference_network_timeout, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "FINDBESTRSSI") else if(key == "FINDBESTRSSI")
@@ -3199,7 +3225,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_find_best_rssi, (value == "1")); _preferences->putBool(preference_find_best_rssi, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "RSTDISC") else if(key == "RSTDISC")
@@ -3209,7 +3234,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_restart_on_disconnect, (value == "1")); _preferences->putBool(preference_restart_on_disconnect, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "MQTTLOG") else if(key == "MQTTLOG")
@@ -3239,7 +3263,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_webserial_enabled, (value == "1")); _preferences->putBool(preference_webserial_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "CHECKUPDATE") else if(key == "CHECKUPDATE")
@@ -3249,7 +3273,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_check_updates, (value == "1")); _preferences->putBool(preference_check_updates, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "UPDATEMQTT") else if(key == "UPDATEMQTT")
@@ -3259,7 +3283,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_update_from_mqtt, (value == "1")); _preferences->putBool(preference_update_from_mqtt, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "OFFHYBRID") else if(key == "OFFHYBRID")
@@ -3273,7 +3297,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
} }
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "HYBRIDACT") else if(key == "HYBRIDACT")
@@ -3287,7 +3311,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
} }
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "HYBRIDTIMER") 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()); _preferences->putInt(preference_query_interval_hybrid_lockstate, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "HYBRIDRETRY") else if(key == "HYBRIDRETRY")
@@ -3307,7 +3329,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_official_hybrid_retry, (value == "1")); _preferences->putBool(preference_official_hybrid_retry, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "HYBRIDREBOOT") 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")); _preferences->putBool(preference_hybrid_reboot_on_disconnect, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "DISNONJSON") else if(key == "DISNONJSON")
@@ -3327,7 +3348,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_disable_non_json, (value == "1")); _preferences->putBool(preference_disable_non_json, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "DHCPENA") else if(key == "DHCPENA")
@@ -3387,7 +3408,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_query_interval_lockstate, value.toInt()); _preferences->putInt(preference_query_interval_lockstate, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "CFGINT") else if(key == "CFGINT")
@@ -3397,7 +3417,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_query_interval_configuration, value.toInt()); _preferences->putInt(preference_query_interval_configuration, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "BATINT") else if(key == "BATINT")
@@ -3407,7 +3426,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_query_interval_battery, value.toInt()); _preferences->putInt(preference_query_interval_battery, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "KPINT") else if(key == "KPINT")
@@ -3417,7 +3435,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_query_interval_keypad, value.toInt()); _preferences->putInt(preference_query_interval_keypad, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "NRTRY") 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()); _preferences->putInt(preference_command_nr_of_retries, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "TRYDLY") else if(key == "TRYDLY")
@@ -3437,7 +3453,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_command_retry_delay, value.toInt()); _preferences->putInt(preference_command_retry_delay, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "TXPWR") else if(key == "TXPWR")
@@ -3453,7 +3468,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_ble_tx_power, value.toInt()); _preferences->putInt(preference_ble_tx_power, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); 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()); _preferences->putInt(preference_restart_ble_beacon_lost, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "TSKNTWK") else if(key == "TSKNTWK")
@@ -3502,7 +3515,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_authlog_max_entries, value.toInt()); _preferences->putInt(preference_authlog_max_entries, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); 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()); _preferences->putInt(preference_keypad_max_entries, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); 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()); _preferences->putInt(preference_timecontrol_max_entries, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); 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()); _preferences->putInt(preference_auth_max_entries, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); 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")); _preferences->putBool(preference_enable_bootloop_reset, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "DISNTWNOCON") 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")); _preferences->putBool(preference_disable_network_not_connected, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "OTAUPD") else if(key == "OTAUPD")
@@ -3605,7 +3613,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_show_secrets, (value == "1")); _preferences->putBool(preference_show_secrets, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "DBGCONN") else if(key == "DBGCONN")
@@ -3615,7 +3622,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_debug_connect, (value == "1")); _preferences->putBool(preference_debug_connect, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "DBGCOMMU") else if(key == "DBGCOMMU")
@@ -3625,7 +3632,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_debug_communication, (value == "1")); _preferences->putBool(preference_debug_communication, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "DBGHEAP") else if(key == "DBGHEAP")
@@ -3635,7 +3642,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_publish_debug_info, (value == "1")); _preferences->putBool(preference_publish_debug_info, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "DBGREAD") else if(key == "DBGREAD")
@@ -3645,7 +3652,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_debug_readable_data, (value == "1")); _preferences->putBool(preference_debug_readable_data, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "DBGHEX") else if(key == "DBGHEX")
@@ -3655,7 +3662,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_debug_hex_data, (value == "1")); _preferences->putBool(preference_debug_hex_data, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "DBGCOMM") else if(key == "DBGCOMM")
@@ -3665,7 +3672,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_debug_command, (value == "1")); _preferences->putBool(preference_debug_command, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "LCKFORCEID") else if(key == "LCKFORCEID")
@@ -3724,7 +3731,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_conf_info_enabled, (value == "1")); _preferences->putBool(preference_conf_info_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "CONFNHPUB") else if(key == "CONFNHPUB")
@@ -3738,7 +3744,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_publish_config, (value == "1")); _preferences->putBool(preference_publish_config, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "CONFNHCTRL") else if(key == "CONFNHCTRL")
@@ -3752,7 +3758,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_config_from_mqtt, (value == "1")); _preferences->putBool(preference_config_from_mqtt, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "KPPUB") else if(key == "KPPUB")
@@ -3762,7 +3768,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_keypad_info_enabled, (value == "1")); _preferences->putBool(preference_keypad_info_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "KPCODE") else if(key == "KPCODE")
@@ -3772,7 +3777,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_keypad_publish_code, (value == "1")); _preferences->putBool(preference_keypad_publish_code, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "KPCHECK") 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")); _preferences->putBool(preference_keypad_check_code_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "KPENA") else if(key == "KPENA")
@@ -3792,7 +3795,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_keypad_control_enabled, (value == "1")); _preferences->putBool(preference_keypad_control_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "TCPUB") else if(key == "TCPUB")
@@ -3802,7 +3805,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_timecontrol_info_enabled, (value == "1")); _preferences->putBool(preference_timecontrol_info_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "AUTHPUB") else if(key == "AUTHPUB")
@@ -3812,7 +3814,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_auth_info_enabled, (value == "1")); _preferences->putBool(preference_auth_info_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "KPPER") 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")); _preferences->putBool(preference_keypad_topic_per_entry, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "TCPER") 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")); _preferences->putBool(preference_timecontrol_topic_per_entry, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "TCENA") else if(key == "TCENA")
@@ -3842,7 +3841,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_timecontrol_control_enabled, (value == "1")); _preferences->putBool(preference_timecontrol_control_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "AUTHPER") 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")); _preferences->putBool(preference_auth_topic_per_entry, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "AUTHENA") else if(key == "AUTHENA")
@@ -3862,7 +3860,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_auth_control_enabled, (value == "1")); _preferences->putBool(preference_auth_control_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "PUBAUTH") else if(key == "PUBAUTH")
@@ -3872,7 +3870,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_publish_authdata, (value == "1")); _preferences->putBool(preference_publish_authdata, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "CREDDIGEST") else if(key == "CREDDIGEST")
@@ -3882,7 +3879,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_http_auth_type, value.toInt()); _preferences->putInt(preference_http_auth_type, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
} }
} }
@@ -3895,7 +3892,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_bypass_proxy, value); _preferences->putString(preference_bypass_proxy, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
} }
} }
@@ -4279,7 +4276,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_register_as_app, (value == "1")); _preferences->putBool(preference_register_as_app, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "REGAPPOPN") 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")); _preferences->putBool(preference_register_opener_as_app, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
//configChanged = true;
} }
} }
else if(key == "LOCKENA") else if(key == "LOCKENA")
@@ -4299,7 +4294,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_lock_enabled, (value == "1")); _preferences->putBool(preference_lock_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "GEMINIENA") else if(key == "GEMINIENA")
@@ -4316,7 +4311,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
} }
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "OPENA") else if(key == "OPENA")
@@ -4326,7 +4321,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_opener_enabled, (value == "1")); _preferences->putBool(preference_opener_enabled, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesReconnect = true;
} }
} }
else if(key == "CONNMODE") else if(key == "CONNMODE")
@@ -4336,7 +4331,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBool(preference_connect_mode, (value == "1")); _preferences->putBool(preference_connect_mode, (value == "1"));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else if(key == "CREDUSER") else if(key == "CREDUSER")
@@ -4352,7 +4347,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_user, value); _preferences->putString(preference_cred_user, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
} }
} }
@@ -4374,7 +4369,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_totp_secret, value); _preferences->putString(preference_totp_secret, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
newMFA = true; newMFA = true;
_importExport->_sessionsOpts[request->client()->localIP().toString() + "totp"] = 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); _preferences->putString(preference_bypass_secret, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); 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); _preferences->putString(preference_admin_secret, value);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true;
} }
} }
} }
@@ -4424,7 +4418,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
} }
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
else else
{ {
@@ -4437,7 +4431,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putInt(preference_lock_gemini_pin, value.toInt()); _preferences->putInt(preference_lock_gemini_pin, value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
else else
@@ -4448,7 +4442,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_nuki->setPin(value.toInt()); _nuki->setPin(value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
} }
@@ -4461,7 +4455,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_nukiOpener->setPin(0xffff); _nukiOpener->setPin(0xffff);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
else else
{ {
@@ -4471,7 +4465,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_nukiOpener->setPin(value.toInt()); _nukiOpener->setPin(value.toInt());
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println(key); Log->println(key);
configChanged = true; restartServicesNoReconnect = true;
} }
} }
} }
@@ -4551,7 +4545,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
nukiBlePref.end(); nukiBlePref.end();
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("Lock pairing data"); Log->println("Lock pairing data");
configChanged = true; restartServicesNoReconnect = true;
} }
if(manPairOpn) if(manPairOpn)
@@ -4566,7 +4560,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
nukiBlePref.end(); nukiBlePref.end();
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("Opener pairing data"); Log->println("Opener pairing data");
configChanged = true; restartServicesNoReconnect = true;
} }
if(pass1 != "" && pass1 != "*" && pass1 == pass2) if(pass1 != "" && pass1 != "*" && pass1 == pass2)
@@ -4576,7 +4570,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_password, pass1); _preferences->putString(preference_cred_password, pass1);
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("CREDPASS"); Log->println("CREDPASS");
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
} }
} }
@@ -4588,14 +4582,14 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_mqtt_user, ""); _preferences->putString(preference_mqtt_user, "");
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("MQTTUSER"); Log->println("MQTTUSER");
configChanged = true; restartServicesReconnect = true;
} }
if(_preferences->getString(preference_mqtt_password, "") != "") if(_preferences->getString(preference_mqtt_password, "") != "")
{ {
_preferences->putString(preference_mqtt_password, ""); _preferences->putString(preference_mqtt_password, "");
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("MQTTPASS"); Log->println("MQTTPASS");
configChanged = true; restartServicesReconnect = true;
} }
} }
@@ -4606,7 +4600,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_user, ""); _preferences->putString(preference_cred_user, "");
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("CREDUSER"); Log->println("CREDUSER");
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
} }
if(_preferences->getString(preference_cred_password, "") != "") if(_preferences->getString(preference_cred_password, "") != "")
@@ -4614,7 +4608,7 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putString(preference_cred_password, ""); _preferences->putString(preference_cred_password, "");
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("CREDPASS"); Log->println("CREDPASS");
configChanged = true; restartServicesNoReconnect = true;
clearSession = true; clearSession = true;
} }
} }
@@ -4639,7 +4633,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBytes(preference_acl, (byte*)(&aclPrefs), sizeof(aclPrefs)); _preferences->putBytes(preference_acl, (byte*)(&aclPrefs), sizeof(aclPrefs));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("ACLPREFS"); Log->println("ACLPREFS");
//configChanged = true;
break; break;
} }
} }
@@ -4650,7 +4643,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBytes(preference_conf_lock_basic_acl, (byte*)(&basicLockConfigAclPrefs), sizeof(basicLockConfigAclPrefs)); _preferences->putBytes(preference_conf_lock_basic_acl, (byte*)(&basicLockConfigAclPrefs), sizeof(basicLockConfigAclPrefs));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("ACLCONFBASICLOCK"); Log->println("ACLCONFBASICLOCK");
//configChanged = true;
break; break;
} }
} }
@@ -4661,7 +4653,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBytes(preference_conf_lock_advanced_acl, (byte*)(&advancedLockConfigAclPrefs), sizeof(advancedLockConfigAclPrefs)); _preferences->putBytes(preference_conf_lock_advanced_acl, (byte*)(&advancedLockConfigAclPrefs), sizeof(advancedLockConfigAclPrefs));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("ACLCONFADVANCEDLOCK"); Log->println("ACLCONFADVANCEDLOCK");
//configChanged = true;
break; break;
} }
@@ -4673,7 +4664,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBytes(preference_conf_opener_basic_acl, (byte*)(&basicOpenerConfigAclPrefs), sizeof(basicOpenerConfigAclPrefs)); _preferences->putBytes(preference_conf_opener_basic_acl, (byte*)(&basicOpenerConfigAclPrefs), sizeof(basicOpenerConfigAclPrefs));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("ACLCONFBASICOPENER"); Log->println("ACLCONFBASICOPENER");
//configChanged = true;
break; break;
} }
} }
@@ -4684,7 +4674,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
_preferences->putBytes(preference_conf_opener_advanced_acl, (byte*)(&advancedOpenerConfigAclPrefs), sizeof(advancedOpenerConfigAclPrefs)); _preferences->putBytes(preference_conf_opener_advanced_acl, (byte*)(&advancedOpenerConfigAclPrefs), sizeof(advancedOpenerConfigAclPrefs));
Log->print("Setting changed: "); Log->print("Setting changed: ");
Log->println("ACLCONFADVANCEDOPENER"); Log->println("ACLCONFADVANCEDOPENER");
//configChanged = true;
break; break;
} }
} }
@@ -4694,21 +4683,34 @@ bool WebCfgServer::processArgs(PsychicRequest *request, PsychicResponse* resp, S
{ {
clearSessions(); clearSessions();
} }
if(newMFA) if(newMFA)
{ {
_preferences->putBool(preference_mfa_reconfigure, true); _preferences->putBool(preference_mfa_reconfigure, true);
_importExport->readSettings();
} }
if(configChanged) if(configChanged)
{ {
message = "Configuration saved, reboot required to apply"; message = "Configuration saved, reboot required to apply some settings";
_rebootRequired = true; _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 else
{ {
message = "Configuration saved."; message = "Configuration saved.";
} }
_importExport->readSettings();
_network->readSettings(); _network->readSettings();
if(_nuki != nullptr) if(_nuki != nullptr)
{ {
@@ -4858,7 +4860,11 @@ esp_err_t WebCfgServer::buildHtml(PsychicRequest *request, PsychicResponse* resp
buildHtmlHeader(&response, header); buildHtmlHeader(&response, header);
if(_rebootRequired) 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)) if(_preferences->getBool(preference_webserial_enabled, false))
{ {
@@ -4945,8 +4951,10 @@ esp_err_t WebCfgServer::buildHtml(PsychicRequest *request, PsychicResponse* resp
} }
#endif #endif
buildNavigationMenuEntry(&response, "Info page", "/get?page=info"); buildNavigationMenuEntry(&response, "Info page", "/get?page=info");
String rebooturl = "/get?page=reboot&CONFIRMTOKEN=" + _confirmCode; String rebootUrl = "/get?page=reboot&CONFIRMTOKEN=" + _confirmCode;
buildNavigationMenuEntry(&response, "Reboot Nuki Hub", rebooturl.c_str()); 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) if (_preferences->getInt(preference_http_auth_type, 0) == 2)
{ {
buildNavigationMenuEntry(&response, "Logout", "/get?page=logout"); 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); 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) if(!opener && _nuki != nullptr)
{ {
@@ -6682,7 +6690,7 @@ esp_err_t WebCfgServer::processUnpair(PsychicRequest *request, PsychicResponse*
_network->disableHASS(); _network->disableHASS();
waitAndProcess(false, 1000); waitAndProcess(false, 1000);
restartEsp(RestartReason::DeviceUnpaired); _network->setRestartServices(true);
return res; return res;
} }

View File

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

View File

@@ -105,6 +105,9 @@ bool coredumpPrinted = true;
bool timeSynced = false; bool timeSynced = false;
bool webStarted = false; bool webStarted = false;
bool webSSLStarted = false; bool webSSLStarted = false;
bool lockStarted = false;
bool openerStarted = false;
bool bleScannerStarted = false;
uint8_t partitionType = -1; uint8_t partitionType = -1;
int lastHTTPeventId = -1; int lastHTTPeventId = -1;
@@ -243,96 +246,6 @@ void cbSyncTime(struct timeval *tv) {
timeSynced = true; 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 #ifndef NUKI_HUB_UPDATER
void startWebServer() void startWebServer()
{ {
@@ -428,9 +341,46 @@ void startWebServer()
#endif #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; 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) if(webSSLStarted)
{ {
@@ -462,27 +412,45 @@ void restartBle()
Log->println("Deleting webCfgServer done"); Log->println("Deleting webCfgServer done");
} }
if(lockEnabled) if(lockStarted)
{ {
Log->println("Deleting nuki"); Log->println("Deleting nuki");
delete nuki; delete nuki;
nuki = nullptr; nuki = nullptr;
if (reconnect)
{
lockStarted = false;
delete networkLock;
networkLock = nullptr;
delete nukiOfficial;
nukiOfficial = nullptr;
}
Log->println("Deleting nuki done"); Log->println("Deleting nuki done");
} }
if(openerEnabled) if(openerStarted)
{ {
Log->println("Deleting nukiOpener"); Log->println("Deleting nukiOpener");
delete nukiOpener; delete nukiOpener;
nukiOpener = nullptr; nukiOpener = nullptr;
if (reconnect)
{
openerStarted = false;
delete networkOpener;
networkOpener = nullptr;
}
Log->println("Deleting nukiOpener done"); Log->println("Deleting nukiOpener done");
} }
if (bleScannerStarted)
{
bleScannerStarted = false;
Log->println("Destroying scanner from main"); Log->println("Destroying scanner from main");
delete bleScanner; delete bleScanner;
Log->println("Scanner deleted"); Log->println("Scanner deleted");
bleScanner = nullptr; bleScanner = nullptr;
Log->println("Scanner nulled from main"); Log->println("Scanner nulled from main");
}
if (BLEDevice::isInitialized()) { if (BLEDevice::isInitialized()) {
Log->println("Deinit BLE device"); Log->println("Deinit BLE device");
@@ -491,25 +459,44 @@ void restartBle()
} }
delay(2000); delay(2000);
if(lockEnabled || openerEnabled)
{
Log->println("Restarting BLE Scanner"); Log->println("Restarting BLE Scanner");
bleScanner = new BleScanner::Scanner(); bleScanner = new BleScanner::Scanner();
bleScanner->initialize("NukiHub", true, 40, 40); bleScanner->initialize("NukiHub", true, 40, 40);
bleScanner->setScanDuration(0); bleScanner->setScanDuration(0);
bleScannerStarted = true;
Log->println("Restarting BLE Scanner done"); Log->println("Restarting BLE Scanner done");
}
if(lockEnabled) if(lockEnabled)
{ {
Log->println("Restarting Nuki lock"); Log->println("Restarting Nuki lock");
if (reconnect)
{
startNuki(true);
}
nuki = new NukiWrapper("NukiHub", deviceIdLock, bleScanner, networkLock, nukiOfficial, gpio, preferences, CharBuffer::get(), buffer_size); nuki = new NukiWrapper("NukiHub", deviceIdLock, bleScanner, networkLock, nukiOfficial, gpio, preferences, CharBuffer::get(), buffer_size);
nuki->initialize(); nuki->initialize();
bleScanner->whitelist(nuki->getBleAddress());
Log->println("Restarting Nuki lock done"); Log->println("Restarting Nuki lock done");
} }
if(openerEnabled) if(openerEnabled)
{ {
Log->println("Restarting Nuki opener"); Log->println("Restarting Nuki opener");
if (reconnect)
{
startNuki(false);
}
nukiOpener = new NukiOpenerWrapper("NukiHub", deviceIdOpener, bleScanner, networkOpener, gpio, preferences, CharBuffer::get(), buffer_size); nukiOpener = new NukiOpenerWrapper("NukiHub", deviceIdOpener, bleScanner, networkOpener, gpio, preferences, CharBuffer::get(), buffer_size);
nukiOpener->initialize(); nukiOpener->initialize();
bleScanner->whitelist(nukiOpener->getBleAddress());
Log->println("Restarting Nuki opener done"); Log->println("Restarting Nuki opener done");
} }
@@ -521,8 +508,121 @@ void restartBle()
startWebServer(); startWebServer();
Log->println("Restarting web server done"); 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) void nukiTask(void *pvParameters)
{ {
if (preferences->getBool(preference_mqtt_ssl_enabled, false)) if (preferences->getBool(preference_mqtt_ssl_enabled, false))
@@ -543,11 +643,14 @@ void nukiTask(void *pvParameters)
while(true) while(true)
{ {
if((disableNetwork || wifiConnected) && bleDone) if((disableNetwork || wifiConnected) && bleDone)
{
if(bleScannerStarted)
{ {
bleScanner->update(); bleScanner->update();
delay(20); delay(20);
}
bool needsPairing = (lockEnabled && !nuki->isPaired()) || (openerEnabled && !nukiOpener->isPaired()); bool needsPairing = (lockStarted && !nuki->isPaired()) || (openerStarted && !nukiOpener->isPaired());
if (needsPairing) if (needsPairing)
{ {
@@ -566,7 +669,7 @@ void nukiTask(void *pvParameters)
} }
} }
if(lockEnabled) if(lockStarted)
{ {
if (nuki->restartController() > 0) if (nuki->restartController() > 0)
{ {
@@ -584,7 +687,7 @@ void nukiTask(void *pvParameters)
else else
{ {
lockRestartControllerCount += 1; lockRestartControllerCount += 1;
restartBle(); restartServices(false);
continue; continue;
} }
} }
@@ -599,7 +702,7 @@ void nukiTask(void *pvParameters)
rebootLock = false; rebootLock = false;
} }
} }
if(openerEnabled) if(openerStarted)
{ {
if (nukiOpener->restartController() > 0) if (nukiOpener->restartController() > 0)
{ {
@@ -617,7 +720,7 @@ void nukiTask(void *pvParameters)
else else
{ {
openerRestartControllerCount += 1; openerRestartControllerCount += 1;
restartBle(); restartServices(false);
continue; continue;
} }
} }
@@ -1138,11 +1241,9 @@ void setup()
gpio->getConfigurationText(gpioDesc, gpio->pinConfiguration(), "\n\r"); gpio->getConfigurationText(gpioDesc, gpio->pinConfiguration(), "\n\r");
Log->print(gpioDesc.c_str()); Log->print(gpioDesc.c_str());
const String mqttLockPath = preferences->getString(preference_mqtt_lock_path);
importExport = new ImportExport(preferences); 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(); network->initialize();
lockEnabled = preferences->getBool(preference_lock_enabled); lockEnabled = preferences->getBool(preference_lock_enabled);
@@ -1166,6 +1267,7 @@ void setup()
// https://developer.nuki.io/t/bluetooth-specification-questions/1109/27 // https://developer.nuki.io/t/bluetooth-specification-questions/1109/27
bleScanner->initialize("NukiHub", true, 40, 40); bleScanner->initialize("NukiHub", true, 40, 40);
bleScanner->setScanDuration(0); bleScanner->setScanDuration(0);
bleScannerStarted = true;
} }
Log->println(lockEnabled ? F("Nuki Lock enabled") : F("Nuki Lock disabled")); Log->println(lockEnabled ? F("Nuki Lock enabled") : F("Nuki Lock disabled"));