Update Tasks
This commit is contained in:
@@ -55,7 +55,7 @@ void NetworkLock::initialize()
|
|||||||
|
|
||||||
_network->subscribe(_mqttPath, mqtt_topic_webserver_action);
|
_network->subscribe(_mqttPath, mqtt_topic_webserver_action);
|
||||||
_network->initTopic(_mqttPath, mqtt_topic_webserver_action, "--");
|
_network->initTopic(_mqttPath, mqtt_topic_webserver_action, "--");
|
||||||
_network->initTopic(_mqttPath, mqtt_topic_webserver_state, _preferences->getBool(preference_webserver_enabled, true) ? 1 : 0);
|
_network->initTopic(_mqttPath, mqtt_topic_webserver_state, (_preferences->getBool(preference_webserver_enabled, true) ? "1" : "0"));
|
||||||
|
|
||||||
_network->initTopic(_mqttPath, mqtt_topic_query_config, "0");
|
_network->initTopic(_mqttPath, mqtt_topic_query_config, "0");
|
||||||
_network->initTopic(_mqttPath, mqtt_topic_query_lockstate, "0");
|
_network->initTopic(_mqttPath, mqtt_topic_query_lockstate, "0");
|
||||||
@@ -111,22 +111,21 @@ void NetworkLock::onMqttDataReceived(const char* topic, byte* payload, const uns
|
|||||||
if(strcmp(value, "") == 0 ||
|
if(strcmp(value, "") == 0 ||
|
||||||
strcmp(value, "--") == 0) return;
|
strcmp(value, "--") == 0) return;
|
||||||
|
|
||||||
publishString(mqtt_topic_webserver_action, "--");
|
|
||||||
|
|
||||||
if(strcmp(value, "1") == 0)
|
if(strcmp(value, "1") == 0)
|
||||||
{
|
{
|
||||||
if(_preferences->getBool(preference_webserver_enabled)) return;
|
if(_preferences->getBool(preference_webserver_enabled, true)) return;
|
||||||
Log->println(F("Webserver enabled, restarting."));
|
Log->println(F("Webserver enabled, restarting."));
|
||||||
_preferences->putBool(preference_webserver_enabled, true);
|
_preferences->putBool(preference_webserver_enabled, true);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (strcmp(value, "0") == 0)
|
else if (strcmp(value, "0") == 0)
|
||||||
{
|
{
|
||||||
if(!_preferences->getBool(preference_webserver_enabled)) return;
|
if(!_preferences->getBool(preference_webserver_enabled, true)) return;
|
||||||
Log->println(F("Webserver disabled, restarting."));
|
Log->println(F("Webserver disabled, restarting."));
|
||||||
_preferences->putBool(preference_webserver_enabled, false);
|
_preferences->putBool(preference_webserver_enabled, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
publishString(mqtt_topic_webserver_action, "--");
|
||||||
_network->clearWifiFallback();
|
_network->clearWifiFallback();
|
||||||
delay(200);
|
delay(200);
|
||||||
restartEsp(RestartReason::RequestedViaMqtt);
|
restartEsp(RestartReason::RequestedViaMqtt);
|
||||||
@@ -410,15 +409,8 @@ void NetworkLock::publishAuthorizationInfo(const std::list<NukiLock::LogEntry>&
|
|||||||
|
|
||||||
JsonDocument json;
|
JsonDocument json;
|
||||||
|
|
||||||
int i = 5;
|
|
||||||
for(const auto& log : logEntries)
|
for(const auto& log : logEntries)
|
||||||
{
|
{
|
||||||
if(i <= 0)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
--i;
|
|
||||||
|
|
||||||
memset(authName, 0, sizeof(authName));
|
memset(authName, 0, sizeof(authName));
|
||||||
authName[0] = '\0';
|
authName[0] = '\0';
|
||||||
|
|
||||||
@@ -468,6 +460,7 @@ void NetworkLock::publishAuthorizationInfo(const std::list<NukiLock::LogEntry>&
|
|||||||
memset(str, 0, sizeof(str));
|
memset(str, 0, sizeof(str));
|
||||||
NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[3], str);
|
NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[3], str);
|
||||||
entry["completionStatus"] = str;
|
entry["completionStatus"] = str;
|
||||||
|
entry["completionStatusVal"] = log.data[3];
|
||||||
break;
|
break;
|
||||||
case NukiLock::LoggingType::KeypadAction:
|
case NukiLock::LoggingType::KeypadAction:
|
||||||
memset(str, 0, sizeof(str));
|
memset(str, 0, sizeof(str));
|
||||||
@@ -477,6 +470,7 @@ void NetworkLock::publishAuthorizationInfo(const std::list<NukiLock::LogEntry>&
|
|||||||
memset(str, 0, sizeof(str));
|
memset(str, 0, sizeof(str));
|
||||||
NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[2], str);
|
NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[2], str);
|
||||||
entry["completionStatus"] = str;
|
entry["completionStatus"] = str;
|
||||||
|
entry["completionStatusVal"] = log.data[2];
|
||||||
break;
|
break;
|
||||||
case NukiLock::LoggingType::DoorSensor:
|
case NukiLock::LoggingType::DoorSensor:
|
||||||
memset(str, 0, sizeof(str));
|
memset(str, 0, sizeof(str));
|
||||||
|
|||||||
@@ -378,15 +378,8 @@ void NetworkOpener::publishAuthorizationInfo(const std::list<NukiOpener::LogEntr
|
|||||||
|
|
||||||
JsonDocument json;
|
JsonDocument json;
|
||||||
|
|
||||||
int i = 5;
|
|
||||||
for(const auto& log : logEntries)
|
for(const auto& log : logEntries)
|
||||||
{
|
{
|
||||||
if(i <= 0)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
--i;
|
|
||||||
|
|
||||||
memset(authName, 0, sizeof(authName));
|
memset(authName, 0, sizeof(authName));
|
||||||
authName[0] = '\0';
|
authName[0] = '\0';
|
||||||
|
|
||||||
@@ -508,37 +501,6 @@ void NetworkOpener::publishAuthorizationInfo(const std::list<NukiOpener::LogEntr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NetworkOpener::logactionCompletionStatusToString(uint8_t value, char* out)
|
|
||||||
{
|
|
||||||
switch (value)
|
|
||||||
{
|
|
||||||
case 0x00:
|
|
||||||
strcpy(out, "success");
|
|
||||||
break;
|
|
||||||
case 0x02:
|
|
||||||
strcpy(out, "cancelled");
|
|
||||||
break;
|
|
||||||
case 0x03:
|
|
||||||
strcpy(out, "tooRecent");
|
|
||||||
break;
|
|
||||||
case 0x04:
|
|
||||||
strcpy(out, "busy");
|
|
||||||
break;
|
|
||||||
case 0x08:
|
|
||||||
strcpy(out, "incomplete");
|
|
||||||
break;
|
|
||||||
case 0xfe:
|
|
||||||
strcpy(out, "otherError");
|
|
||||||
break;
|
|
||||||
case 0xff:
|
|
||||||
strcpy(out, "unknown");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
strcpy(out, "undefined");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void NetworkOpener::clearAuthorizationInfo()
|
void NetworkOpener::clearAuthorizationInfo()
|
||||||
{
|
{
|
||||||
publishString(mqtt_topic_lock_log, "--");
|
publishString(mqtt_topic_lock_log, "--");
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ private:
|
|||||||
|
|
||||||
void buildMqttPath(const char* path, char* outPath);
|
void buildMqttPath(const char* path, char* outPath);
|
||||||
void subscribe(const char* path);
|
void subscribe(const char* path);
|
||||||
void logactionCompletionStatusToString(uint8_t value, char* out);
|
|
||||||
void buttonPressActionToString(const NukiOpener::ButtonPressAction btnPressAction, char* str);
|
void buttonPressActionToString(const NukiOpener::ButtonPressAction btnPressAction, char* str);
|
||||||
void fobActionToString(const int fobact, char* str);
|
void fobActionToString(const int fobact, char* str);
|
||||||
void operatingModeToString(const int opmode, char* str);
|
void operatingModeToString(const int opmode, char* str);
|
||||||
|
|||||||
@@ -485,7 +485,7 @@ void NukiOpenerWrapper::updateAuthData()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Nuki::CmdResult result = _nukiOpener.retrieveLogEntries(0, 5, 1, false);
|
Nuki::CmdResult result = _nukiOpener.retrieveLogEntries(0, _preferences->getInt(preference_authlog_max_entries, 5), 1, false);
|
||||||
Log->print(F("Retrieve log entries: "));
|
Log->print(F("Retrieve log entries: "));
|
||||||
Log->println(result);
|
Log->println(result);
|
||||||
if(result != Nuki::CmdResult::Success)
|
if(result != Nuki::CmdResult::Success)
|
||||||
@@ -493,11 +493,16 @@ void NukiOpenerWrapper::updateAuthData()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
delay(100);
|
delay(_preferences->getInt(preference_authlog_max_entries, 5) * 30);
|
||||||
|
|
||||||
std::list<NukiOpener::LogEntry> log;
|
std::list<NukiOpener::LogEntry> log;
|
||||||
_nukiOpener.getLogEntries(&log);
|
_nukiOpener.getLogEntries(&log);
|
||||||
|
|
||||||
|
if(log.size() > _preferences->getInt(preference_authlog_max_entries, 5))
|
||||||
|
{
|
||||||
|
log.resize(_preferences->getInt(preference_authlog_max_entries, 5));
|
||||||
|
}
|
||||||
|
|
||||||
Log->print(F("Log size: "));
|
Log->print(F("Log size: "));
|
||||||
Log->println(log.size());
|
Log->println(log.size());
|
||||||
|
|
||||||
@@ -513,7 +518,7 @@ void NukiOpenerWrapper::updateKeypad()
|
|||||||
if(!_preferences->getBool(preference_keypad_info_enabled)) return;
|
if(!_preferences->getBool(preference_keypad_info_enabled)) return;
|
||||||
|
|
||||||
Log->print(F("Querying opener keypad: "));
|
Log->print(F("Querying opener keypad: "));
|
||||||
Nuki::CmdResult result = _nukiOpener.retrieveKeypadEntries(0, 0xffff);
|
Nuki::CmdResult result = _nukiOpener.retrieveKeypadEntries(0, _preferences->getInt(preference_keypad_max_entries, 10));
|
||||||
printCommandResult(result);
|
printCommandResult(result);
|
||||||
if(result == Nuki::CmdResult::Success)
|
if(result == Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
@@ -525,6 +530,11 @@ void NukiOpenerWrapper::updateKeypad()
|
|||||||
|
|
||||||
entries.sort([](const NukiLock::KeypadEntry& a, const NukiLock::KeypadEntry& b) { return a.codeId < b.codeId; });
|
entries.sort([](const NukiLock::KeypadEntry& a, const NukiLock::KeypadEntry& b) { return a.codeId < b.codeId; });
|
||||||
|
|
||||||
|
if(entries.size() > _preferences->getInt(preference_keypad_max_entries, 10))
|
||||||
|
{
|
||||||
|
entries.resize(_preferences->getInt(preference_keypad_max_entries, 10));
|
||||||
|
}
|
||||||
|
|
||||||
uint keypadCount = entries.size();
|
uint keypadCount = entries.size();
|
||||||
if(keypadCount > _maxKeypadCodeCount)
|
if(keypadCount > _maxKeypadCodeCount)
|
||||||
{
|
{
|
||||||
@@ -572,6 +582,11 @@ void NukiOpenerWrapper::updateTimeControl(bool retrieved)
|
|||||||
|
|
||||||
timeControlEntries.sort([](const NukiOpener::TimeControlEntry& a, const NukiOpener::TimeControlEntry& b) { return a.entryId < b.entryId; });
|
timeControlEntries.sort([](const NukiOpener::TimeControlEntry& a, const NukiOpener::TimeControlEntry& b) { return a.entryId < b.entryId; });
|
||||||
|
|
||||||
|
if(timeControlEntries.size() > _preferences->getInt(preference_timecontrol_max_entries, 10))
|
||||||
|
{
|
||||||
|
timeControlEntries.resize(_preferences->getInt(preference_timecontrol_max_entries, 10));
|
||||||
|
}
|
||||||
|
|
||||||
_network->publishTimeControl(timeControlEntries);
|
_network->publishTimeControl(timeControlEntries);
|
||||||
|
|
||||||
_timeControlIds.clear();
|
_timeControlIds.clear();
|
||||||
|
|||||||
@@ -466,7 +466,7 @@ void NukiWrapper::updateAuthData()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Nuki::CmdResult result = _nukiLock.retrieveLogEntries(0, 5, 1, false);
|
Nuki::CmdResult result = _nukiLock.retrieveLogEntries(0, _preferences->getInt(preference_authlog_max_entries, 5), 1, false);
|
||||||
Log->print(F("Retrieve log entries: "));
|
Log->print(F("Retrieve log entries: "));
|
||||||
Log->println(result);
|
Log->println(result);
|
||||||
if(result != Nuki::CmdResult::Success)
|
if(result != Nuki::CmdResult::Success)
|
||||||
@@ -474,11 +474,16 @@ void NukiWrapper::updateAuthData()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
delay(100);
|
delay(_preferences->getInt(preference_authlog_max_entries, 5) * 30);
|
||||||
|
|
||||||
std::list<NukiLock::LogEntry> log;
|
std::list<NukiLock::LogEntry> log;
|
||||||
_nukiLock.getLogEntries(&log);
|
_nukiLock.getLogEntries(&log);
|
||||||
|
|
||||||
|
if(log.size() > _preferences->getInt(preference_authlog_max_entries, 5))
|
||||||
|
{
|
||||||
|
log.resize(_preferences->getInt(preference_authlog_max_entries, 5));
|
||||||
|
}
|
||||||
|
|
||||||
Log->print(F("Log size: "));
|
Log->print(F("Log size: "));
|
||||||
Log->println(log.size());
|
Log->println(log.size());
|
||||||
|
|
||||||
@@ -494,7 +499,7 @@ void NukiWrapper::updateKeypad()
|
|||||||
if(!_preferences->getBool(preference_keypad_info_enabled)) return;
|
if(!_preferences->getBool(preference_keypad_info_enabled)) return;
|
||||||
|
|
||||||
Log->print(F("Querying lock keypad: "));
|
Log->print(F("Querying lock keypad: "));
|
||||||
Nuki::CmdResult result = _nukiLock.retrieveKeypadEntries(0, 0xffff);
|
Nuki::CmdResult result = _nukiLock.retrieveKeypadEntries(0, _preferences->getInt(preference_keypad_max_entries, 10));
|
||||||
printCommandResult(result);
|
printCommandResult(result);
|
||||||
if(result == Nuki::CmdResult::Success)
|
if(result == Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
@@ -506,6 +511,11 @@ void NukiWrapper::updateKeypad()
|
|||||||
|
|
||||||
entries.sort([](const NukiLock::KeypadEntry& a, const NukiLock::KeypadEntry& b) { return a.codeId < b.codeId; });
|
entries.sort([](const NukiLock::KeypadEntry& a, const NukiLock::KeypadEntry& b) { return a.codeId < b.codeId; });
|
||||||
|
|
||||||
|
if(entries.size() > _preferences->getInt(preference_keypad_max_entries, 10))
|
||||||
|
{
|
||||||
|
entries.resize(_preferences->getInt(preference_keypad_max_entries, 10));
|
||||||
|
}
|
||||||
|
|
||||||
uint keypadCount = entries.size();
|
uint keypadCount = entries.size();
|
||||||
if(keypadCount > _maxKeypadCodeCount)
|
if(keypadCount > _maxKeypadCodeCount)
|
||||||
{
|
{
|
||||||
@@ -553,6 +563,11 @@ void NukiWrapper::updateTimeControl(bool retrieved)
|
|||||||
|
|
||||||
timeControlEntries.sort([](const NukiLock::TimeControlEntry& a, const NukiLock::TimeControlEntry& b) { return a.entryId < b.entryId; });
|
timeControlEntries.sort([](const NukiLock::TimeControlEntry& a, const NukiLock::TimeControlEntry& b) { return a.entryId < b.entryId; });
|
||||||
|
|
||||||
|
if(timeControlEntries.size() > _preferences->getInt(preference_timecontrol_max_entries, 10))
|
||||||
|
{
|
||||||
|
timeControlEntries.resize(_preferences->getInt(preference_timecontrol_max_entries, 10));
|
||||||
|
}
|
||||||
|
|
||||||
_network->publishTimeControl(timeControlEntries);
|
_network->publishTimeControl(timeControlEntries);
|
||||||
|
|
||||||
_timeControlIds.clear();
|
_timeControlIds.clear();
|
||||||
|
|||||||
@@ -72,6 +72,12 @@
|
|||||||
#define preference_has_mac_byte_1 (char*)"macb1"
|
#define preference_has_mac_byte_1 (char*)"macb1"
|
||||||
#define preference_has_mac_byte_2 (char*)"macb2"
|
#define preference_has_mac_byte_2 (char*)"macb2"
|
||||||
#define preference_latest_version (char*)"latest"
|
#define preference_latest_version (char*)"latest"
|
||||||
|
#define preference_task_size_network (char*)"tsksznetw"
|
||||||
|
#define preference_task_size_nuki (char*)"tsksznuki"
|
||||||
|
#define preference_task_size_pd (char*)"tskszpd"
|
||||||
|
#define preference_authlog_max_entries (char*)"authmaxentry"
|
||||||
|
#define preference_keypad_max_entries (char*)"kpmaxentry"
|
||||||
|
#define preference_timecontrol_max_entries (char*)"tcmaxentry"
|
||||||
|
|
||||||
class DebugPreferences
|
class DebugPreferences
|
||||||
{
|
{
|
||||||
@@ -83,17 +89,15 @@ private:
|
|||||||
preference_opener_continuous_mode, preference_mqtt_opener_path, preference_lock_max_keypad_code_count, preference_opener_max_keypad_code_count,
|
preference_opener_continuous_mode, preference_mqtt_opener_path, preference_lock_max_keypad_code_count, preference_opener_max_keypad_code_count,
|
||||||
preference_mqtt_ca, preference_mqtt_crt, preference_mqtt_key, preference_mqtt_hass_discovery, preference_mqtt_hass_cu_url,
|
preference_mqtt_ca, preference_mqtt_crt, preference_mqtt_key, preference_mqtt_hass_discovery, preference_mqtt_hass_cu_url,
|
||||||
preference_ip_dhcp_enabled, preference_ip_address, preference_ip_subnet, preference_ip_gateway, preference_ip_dns_server,
|
preference_ip_dhcp_enabled, preference_ip_address, preference_ip_subnet, preference_ip_gateway, preference_ip_dns_server,
|
||||||
preference_network_hardware, preference_network_wifi_fallback_disabled, preference_rssi_publish_interval,
|
preference_network_hardware, preference_network_wifi_fallback_disabled, preference_rssi_publish_interval, preference_hostname,
|
||||||
preference_hostname, preference_network_timeout, preference_restart_on_disconnect,
|
preference_network_timeout, preference_restart_on_disconnect, preference_restart_ble_beacon_lost, preference_query_interval_lockstate,
|
||||||
preference_restart_ble_beacon_lost, preference_query_interval_lockstate,
|
preference_query_interval_configuration, preference_query_interval_battery, preference_query_interval_keypad, preference_keypad_control_enabled,
|
||||||
preference_query_interval_configuration, preference_query_interval_battery, preference_query_interval_keypad,
|
preference_keypad_info_enabled, preference_acl, preference_timecontrol_control_enabled, preference_timecontrol_info_enabled,
|
||||||
preference_keypad_control_enabled, preference_keypad_info_enabled, preference_acl,
|
|
||||||
preference_timecontrol_control_enabled, preference_timecontrol_info_enabled,
|
|
||||||
preference_conf_lock_basic_acl, preference_conf_lock_advanced_acl, preference_conf_opener_basic_acl, preference_conf_opener_advanced_acl,
|
preference_conf_lock_basic_acl, preference_conf_lock_advanced_acl, preference_conf_opener_basic_acl, preference_conf_opener_advanced_acl,
|
||||||
preference_access_level, preference_register_as_app, preference_command_nr_of_retries,
|
preference_access_level, preference_register_as_app, preference_command_nr_of_retries, preference_command_retry_delay, preference_cred_user,
|
||||||
preference_command_retry_delay, preference_cred_user, preference_cred_password, preference_publish_authdata,
|
preference_cred_password, preference_publish_authdata, preference_publish_debug_info, preference_presence_detection_timeout,
|
||||||
preference_publish_debug_info, preference_presence_detection_timeout,
|
|
||||||
preference_has_mac_saved, preference_has_mac_byte_0, preference_has_mac_byte_1, preference_has_mac_byte_2, preference_latest_version,
|
preference_has_mac_saved, preference_has_mac_byte_0, preference_has_mac_byte_1, preference_has_mac_byte_2, preference_latest_version,
|
||||||
|
preference_task_size_network, preference_task_size_nuki, preference_task_size_pd, preference_authlog_max_entries, preference_keypad_max_entries, preference_timecontrol_max_entries
|
||||||
};
|
};
|
||||||
std::vector<char*> _redact =
|
std::vector<char*> _redact =
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -78,6 +78,14 @@ void WebCfgServer::initialize()
|
|||||||
buildAccLvlHtml(response);
|
buildAccLvlHtml(response);
|
||||||
_server.send(200, "text/html", response);
|
_server.send(200, "text/html", response);
|
||||||
});
|
});
|
||||||
|
_server.on("/advanced", [&]() {
|
||||||
|
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
|
||||||
|
return _server.requestAuthentication();
|
||||||
|
}
|
||||||
|
String response = "";
|
||||||
|
buildAdvancedConfigHtml(response);
|
||||||
|
_server.send(200, "text/html", response);
|
||||||
|
});
|
||||||
_server.on("/cred", [&]() {
|
_server.on("/cred", [&]() {
|
||||||
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
|
if (_hasCredentials && !_server.authenticate(_credUser, _credPassword)) {
|
||||||
return _server.requestAuthentication();
|
return _server.requestAuthentication();
|
||||||
@@ -465,6 +473,36 @@ bool WebCfgServer::processArgs(String& message)
|
|||||||
_preferences->putInt(preference_restart_ble_beacon_lost, value.toInt());
|
_preferences->putInt(preference_restart_ble_beacon_lost, value.toInt());
|
||||||
configChanged = true;
|
configChanged = true;
|
||||||
}
|
}
|
||||||
|
else if(key == "TSKNTWK")
|
||||||
|
{
|
||||||
|
_preferences->putInt(preference_task_size_network, value.toInt());
|
||||||
|
configChanged = true;
|
||||||
|
}
|
||||||
|
else if(key == "TSKNUKI")
|
||||||
|
{
|
||||||
|
_preferences->putInt(preference_task_size_nuki, value.toInt());
|
||||||
|
configChanged = true;
|
||||||
|
}
|
||||||
|
else if(key == "TSKPD")
|
||||||
|
{
|
||||||
|
_preferences->putInt(preference_task_size_pd, value.toInt());
|
||||||
|
configChanged = true;
|
||||||
|
}
|
||||||
|
else if(key == "ALMAX")
|
||||||
|
{
|
||||||
|
_preferences->putInt(preference_authlog_max_entries, value.toInt());
|
||||||
|
configChanged = true;
|
||||||
|
}
|
||||||
|
else if(key == "KPMAX")
|
||||||
|
{
|
||||||
|
_preferences->putInt(preference_keypad_max_entries, value.toInt());
|
||||||
|
configChanged = true;
|
||||||
|
}
|
||||||
|
else if(key == "TCMAX")
|
||||||
|
{
|
||||||
|
_preferences->putInt(preference_timecontrol_max_entries, value.toInt());
|
||||||
|
configChanged = true;
|
||||||
|
}
|
||||||
else if(key == "ACLLVLCHANGED")
|
else if(key == "ACLLVLCHANGED")
|
||||||
{
|
{
|
||||||
aclLvlChanged = true;
|
aclLvlChanged = true;
|
||||||
@@ -1071,23 +1109,25 @@ void WebCfgServer::buildHtml(String& response)
|
|||||||
if(_preferences->getBool(preference_check_updates)) printParameter(response, "Latest Firmware", _preferences->getString(preference_latest_version).c_str(), "/ota");
|
if(_preferences->getBool(preference_check_updates)) printParameter(response, "Latest Firmware", _preferences->getString(preference_latest_version).c_str(), "/ota");
|
||||||
|
|
||||||
response.concat("</table><br><table id=\"tblnav\"><tbody>");
|
response.concat("</table><br><table id=\"tblnav\"><tbody>");
|
||||||
response.concat("<tr><td><h3>MQTT and Network Configuration</h3></td><td class=\"tdbtn\">");
|
response.concat("<tr><td><h5>MQTT and Network Configuration</h5></td><td class=\"tdbtn\">");
|
||||||
buildNavigationButton(response, "Edit", "/mqttconfig", _brokerConfigured ? "" : "<font color=\"#f07000\"><em>(!) Please configure MQTT broker</em></font>");
|
buildNavigationButton(response, "Edit", "/mqttconfig", _brokerConfigured ? "" : "<font color=\"#f07000\"><em>(!) Please configure MQTT broker</em></font>");
|
||||||
response.concat("</td></tr><tr><td><h3>Nuki Configuration</h3></td><td class=\"tdbtn\">");
|
response.concat("</td></tr><tr><td><h5>Nuki Configuration</h5></td><td class=\"tdbtn\">");
|
||||||
buildNavigationButton(response, "Edit", "/nukicfg");
|
buildNavigationButton(response, "Edit", "/nukicfg");
|
||||||
response.concat("</td></tr><tr><td><h3>Access Level Configuration</h3></td><td class=\"tdbtn\">");
|
response.concat("</td></tr><tr><td><h5>Access Level Configuration</h5></td><td class=\"tdbtn\">");
|
||||||
buildNavigationButton(response, "Edit", "/acclvl");
|
buildNavigationButton(response, "Edit", "/acclvl");
|
||||||
response.concat("</td></tr><tr><td><h3>Credentials</h3></td><td class=\"tdbtn\">");
|
response.concat("</td></tr><tr><td><h5>Credentials</h5></td><td class=\"tdbtn\">");
|
||||||
buildNavigationButton(response, "Edit", "/cred", _pinsConfigured ? "" : "<font color=\"#f07000\"><em>(!) Please configure PIN</em></font>");
|
buildNavigationButton(response, "Edit", "/cred", _pinsConfigured ? "" : "<font color=\"#f07000\"><em>(!) Please configure PIN</em></font>");
|
||||||
response.concat("</td></tr><tr><td><h3>GPIO Configuration</h3></td><td class=\"tdbtn\">");
|
response.concat("</td></tr><tr><td><h5>GPIO Configuration</h5></td><td class=\"tdbtn\">");
|
||||||
buildNavigationButton(response, "Edit", "/gpiocfg");
|
buildNavigationButton(response, "Edit", "/gpiocfg");
|
||||||
response.concat("</td></tr><tr><td><h3>Firmware update</h3></td><td class=\"tdbtn\">");
|
response.concat("</td></tr><tr><td><h5>Firmware update</h5></td><td class=\"tdbtn\">");
|
||||||
buildNavigationButton(response, "Open", "/ota");
|
buildNavigationButton(response, "Open", "/ota");
|
||||||
|
response.concat("</td></tr><tr><td><h5>Advanced Configuration</h5></td><td class=\"tdbtn\">");
|
||||||
|
buildNavigationButton(response, "Edit", "/advanced");
|
||||||
response.concat("</td></tr>");
|
response.concat("</td></tr>");
|
||||||
|
|
||||||
if(_allowRestartToPortal)
|
if(_allowRestartToPortal)
|
||||||
{
|
{
|
||||||
response.concat("<tr><td><h3>Wi-Fi</h3></td><td class=\"tdbtn\">");
|
response.concat("<tr><td><h5>Wi-Fi</h5></td><td class=\"tdbtn\">");
|
||||||
buildNavigationButton(response, "Restart and configure Wi-Fi", "/wifi");
|
buildNavigationButton(response, "Restart and configure Wi-Fi", "/wifi");
|
||||||
response.concat("</td></tr>");
|
response.concat("</td></tr>");
|
||||||
}
|
}
|
||||||
@@ -1257,6 +1297,26 @@ void WebCfgServer::buildMqttConfigHtml(String &response)
|
|||||||
response.concat("</body></html>");
|
response.concat("</body></html>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WebCfgServer::buildAdvancedConfigHtml(String &response)
|
||||||
|
{
|
||||||
|
buildHtmlHeader(response);
|
||||||
|
response.concat("<form method=\"post\" action=\"savecfg\">");
|
||||||
|
response.concat("<h3>Advanced Configuration</h3>");
|
||||||
|
response.concat("<h4 style=\"color: #ff0000\">Warning: Changing these settings can lead to bootloops that might require you to erase the ESP32 and reflash nukihub using USB/serial</h4>");
|
||||||
|
response.concat("<table>");
|
||||||
|
printInputField(response, "TSKNTWK", "Task size Network", _preferences->getInt(preference_task_size_network, 12288), 6);
|
||||||
|
printInputField(response, "TSKNUKI", "Task size Nuki", _preferences->getInt(preference_task_size_nuki, 8192), 6);
|
||||||
|
printInputField(response, "TSKPD", "Task size Presence Detection", _preferences->getInt(preference_task_size_pd, 1024), 6);
|
||||||
|
printInputField(response, "ALMAX", "Max auth log entries", _preferences->getInt(preference_authlog_max_entries, 5), 3);
|
||||||
|
printInputField(response, "KPMAX", "Max keypad entries", _preferences->getInt(preference_keypad_max_entries, 10), 3);
|
||||||
|
printInputField(response, "TCMAX", "Max timecontrol entries", _preferences->getInt(preference_timecontrol_max_entries, 10), 3);
|
||||||
|
response.concat("</table>");
|
||||||
|
|
||||||
|
response.concat("<br><input type=\"submit\" name=\"submit\" value=\"Save\">");
|
||||||
|
response.concat("</form>");
|
||||||
|
response.concat("</body></html>");
|
||||||
|
}
|
||||||
|
|
||||||
void WebCfgServer::buildAccLvlHtml(String &response)
|
void WebCfgServer::buildAccLvlHtml(String &response)
|
||||||
{
|
{
|
||||||
buildHtmlHeader(response);
|
buildHtmlHeader(response);
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ private:
|
|||||||
void buildOtaHtml(String& response, bool errored);
|
void buildOtaHtml(String& response, bool errored);
|
||||||
void buildOtaCompletedHtml(String& response);
|
void buildOtaCompletedHtml(String& response);
|
||||||
void buildMqttConfigHtml(String& response);
|
void buildMqttConfigHtml(String& response);
|
||||||
|
void buildAdvancedConfigHtml(String& response);
|
||||||
void buildNukiConfigHtml(String& response);
|
void buildNukiConfigHtml(String& response);
|
||||||
void buildGpioConfigHtml(String& response);
|
void buildGpioConfigHtml(String& response);
|
||||||
void buildConfirmHtml(String& response, const String &message, uint32_t redirectDelay = 5);
|
void buildConfirmHtml(String& response, const String &message, uint32_t redirectDelay = 5);
|
||||||
|
|||||||
12
src/main.cpp
12
src/main.cpp
@@ -52,7 +52,11 @@ void networkTask(void *pvParameters)
|
|||||||
{
|
{
|
||||||
networkOpener->update();
|
networkOpener->update();
|
||||||
}
|
}
|
||||||
webCfgServer->update();
|
|
||||||
|
if(preferences->getBool(preference_webserver_enabled, true))
|
||||||
|
{
|
||||||
|
webCfgServer->update();
|
||||||
|
}
|
||||||
|
|
||||||
// millis() is about to overflow. Restart device to prevent problems with overflow
|
// millis() is about to overflow. Restart device to prevent problems with overflow
|
||||||
if(millis() > restartTs)
|
if(millis() > restartTs)
|
||||||
@@ -112,12 +116,12 @@ void setupTasks()
|
|||||||
{
|
{
|
||||||
// configMAX_PRIORITIES is 25
|
// configMAX_PRIORITIES is 25
|
||||||
|
|
||||||
xTaskCreatePinnedToCore(networkTask, "ntw", 12288, NULL, 3, &networkTaskHandle, 1);
|
xTaskCreatePinnedToCore(networkTask, "ntw", preferences->getInt(preference_task_size_network, 12288), NULL, 3, &networkTaskHandle, 1);
|
||||||
xTaskCreatePinnedToCore(nukiTask, "nuki", 8192, NULL, 2, &nukiTaskHandle, 1);
|
xTaskCreatePinnedToCore(nukiTask, "nuki", preferences->getInt(preference_task_size_nuki, 8192), NULL, 2, &nukiTaskHandle, 1);
|
||||||
|
|
||||||
if(preferences->getInt(preference_presence_detection_timeout) >= 0)
|
if(preferences->getInt(preference_presence_detection_timeout) >= 0)
|
||||||
{
|
{
|
||||||
xTaskCreatePinnedToCore(presenceDetectionTask, "prdet", 1024, NULL, 5, &presenceDetectionTaskHandle, 1);
|
xTaskCreatePinnedToCore(presenceDetectionTask, "prdet", preferences->getInt(preference_task_size_pd, 1024), NULL, 5, &presenceDetectionTaskHandle, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user