Update Tasks
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
#include "CharBuffer.h"
|
||||
|
||||
void CharBuffer::initialize()
|
||||
void CharBuffer::initialize(char16_t buffer_size)
|
||||
{
|
||||
_buffer = new char[CHAR_BUFFER_SIZE];
|
||||
_buffer = new char[buffer_size];
|
||||
}
|
||||
|
||||
char *CharBuffer::get()
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#define CHAR_BUFFER_SIZE 4096
|
||||
|
||||
class CharBuffer
|
||||
{
|
||||
public:
|
||||
static void initialize();
|
||||
static void initialize(char16_t buffer_size);
|
||||
static char* get();
|
||||
|
||||
private:
|
||||
|
||||
@@ -23,3 +23,11 @@
|
||||
#define MQTT_CLEAN_SESSIONS false
|
||||
|
||||
#define GPIO_DEBOUNCE_TIME 200
|
||||
|
||||
#define CHAR_BUFFER_SIZE 4096
|
||||
#define NETWORK_TASK_SIZE 12288
|
||||
#define NUKI_TASK_SIZE 8192
|
||||
#define PD_TASK_SIZE 1024
|
||||
#define MAX_AUTHLOG 5
|
||||
#define MAX_KEYPAD 10
|
||||
#define MAX_TIMECONTROL 10
|
||||
@@ -265,6 +265,12 @@ bool Network::update()
|
||||
{
|
||||
unsigned long ts = millis();
|
||||
|
||||
if(ts > 120000 && ts < 125000 && _preferences->getInt(preference_bootloop_counter, 0) > 0)
|
||||
{
|
||||
_preferences->putInt(preference_bootloop_counter, 0);
|
||||
Log->println(F("Bootloop counter reset"));
|
||||
}
|
||||
|
||||
_device->update();
|
||||
|
||||
if(!_mqttEnabled)
|
||||
|
||||
@@ -401,7 +401,7 @@ void NetworkLock::publishState(NukiLock::LockState lockState)
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkLock::publishAuthorizationInfo(const std::list<NukiLock::LogEntry>& logEntries)
|
||||
void NetworkLock::publishAuthorizationInfo(const std::list<NukiLock::LogEntry>& logEntries, bool latest)
|
||||
{
|
||||
char str[50];
|
||||
char authName[33];
|
||||
@@ -430,77 +430,83 @@ void NetworkLock::publishAuthorizationInfo(const std::list<NukiLock::LogEntry>&
|
||||
}
|
||||
}
|
||||
|
||||
auto entry = json.add<JsonVariant>();
|
||||
|
||||
entry["index"] = log.index;
|
||||
entry["authorizationId"] = log.authId;
|
||||
entry["authorizationName"] = authName;
|
||||
entry["timeYear"] = log.timeStampYear;
|
||||
entry["timeMonth"] = log.timeStampMonth;
|
||||
entry["timeDay"] = log.timeStampDay;
|
||||
entry["timeHour"] = log.timeStampHour;
|
||||
entry["timeMinute"] = log.timeStampMinute;
|
||||
entry["timeSecond"] = log.timeStampSecond;
|
||||
|
||||
memset(str, 0, sizeof(str));
|
||||
loggingTypeToString(log.loggingType, str);
|
||||
entry["type"] = str;
|
||||
|
||||
switch(log.loggingType)
|
||||
if(!latest)
|
||||
{
|
||||
case NukiLock::LoggingType::LockAction:
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::lockactionToString((NukiLock::LockAction)log.data[0], str);
|
||||
entry["action"] = str;
|
||||
auto entry = json.add<JsonVariant>();
|
||||
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::triggerToString((NukiLock::Trigger)log.data[1], str);
|
||||
entry["trigger"] = str;
|
||||
entry["index"] = log.index;
|
||||
entry["authorizationId"] = log.authId;
|
||||
entry["authorizationName"] = authName;
|
||||
entry["timeYear"] = log.timeStampYear;
|
||||
entry["timeMonth"] = log.timeStampMonth;
|
||||
entry["timeDay"] = log.timeStampDay;
|
||||
entry["timeHour"] = log.timeStampHour;
|
||||
entry["timeMinute"] = log.timeStampMinute;
|
||||
entry["timeSecond"] = log.timeStampSecond;
|
||||
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[3], str);
|
||||
entry["completionStatus"] = str;
|
||||
entry["completionStatusVal"] = log.data[3];
|
||||
break;
|
||||
case NukiLock::LoggingType::KeypadAction:
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::lockactionToString((NukiLock::LockAction)log.data[0], str);
|
||||
entry["action"] = str;
|
||||
memset(str, 0, sizeof(str));
|
||||
loggingTypeToString(log.loggingType, str);
|
||||
entry["type"] = str;
|
||||
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[2], str);
|
||||
entry["completionStatus"] = str;
|
||||
entry["completionStatusVal"] = log.data[2];
|
||||
break;
|
||||
case NukiLock::LoggingType::DoorSensor:
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::lockactionToString((NukiLock::LockAction)log.data[0], str);
|
||||
switch(log.loggingType)
|
||||
{
|
||||
case NukiLock::LoggingType::LockAction:
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::lockactionToString((NukiLock::LockAction)log.data[0], str);
|
||||
entry["action"] = str;
|
||||
|
||||
switch(log.data[0])
|
||||
{
|
||||
case 0:
|
||||
entry["action"] = "DoorOpened";
|
||||
break;
|
||||
case 1:
|
||||
entry["action"] = "DoorClosed";
|
||||
break;
|
||||
case 2:
|
||||
entry["action"] = "SensorJammed";
|
||||
break;
|
||||
default:
|
||||
entry["action"] = "Unknown";
|
||||
break;
|
||||
}
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::triggerToString((NukiLock::Trigger)log.data[1], str);
|
||||
entry["trigger"] = str;
|
||||
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[2], str);
|
||||
entry["completionStatus"] = str;
|
||||
break;
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[3], str);
|
||||
entry["completionStatus"] = str;
|
||||
entry["completionStatusVal"] = log.data[3];
|
||||
break;
|
||||
case NukiLock::LoggingType::KeypadAction:
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::lockactionToString((NukiLock::LockAction)log.data[0], str);
|
||||
entry["action"] = str;
|
||||
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[2], str);
|
||||
entry["completionStatus"] = str;
|
||||
entry["completionStatusVal"] = log.data[2];
|
||||
break;
|
||||
case NukiLock::LoggingType::DoorSensor:
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::lockactionToString((NukiLock::LockAction)log.data[0], str);
|
||||
|
||||
switch(log.data[0])
|
||||
{
|
||||
case 0:
|
||||
entry["action"] = "DoorOpened";
|
||||
break;
|
||||
case 1:
|
||||
entry["action"] = "DoorClosed";
|
||||
break;
|
||||
case 2:
|
||||
entry["action"] = "SensorJammed";
|
||||
break;
|
||||
default:
|
||||
entry["action"] = "Unknown";
|
||||
break;
|
||||
}
|
||||
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiLock::completionStatusToString((NukiLock::CompletionStatus)log.data[2], str);
|
||||
entry["completionStatus"] = str;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
serializeJson(json, _buffer, _bufferSize);
|
||||
publishString(mqtt_topic_lock_log, _buffer);
|
||||
if(!latest)
|
||||
{
|
||||
serializeJson(json, _buffer, _bufferSize);
|
||||
publishString(mqtt_topic_lock_log, _buffer);
|
||||
}
|
||||
|
||||
if(authFound)
|
||||
{
|
||||
|
||||
@@ -24,7 +24,7 @@ public:
|
||||
|
||||
void publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurnerState, const NukiLock::KeyTurnerState& lastKeyTurnerState);
|
||||
void publishState(NukiLock::LockState lockState);
|
||||
void publishAuthorizationInfo(const std::list<NukiLock::LogEntry>& logEntries);
|
||||
void publishAuthorizationInfo(const std::list<NukiLock::LogEntry>& logEntries, bool latest);
|
||||
void clearAuthorizationInfo();
|
||||
void publishCommandResult(const char* resultStr);
|
||||
void publishLockstateCommandResult(const char* resultStr);
|
||||
|
||||
@@ -370,7 +370,7 @@ void NetworkOpener::publishState(NukiOpener::OpenerState lockState)
|
||||
}
|
||||
}
|
||||
|
||||
void NetworkOpener::publishAuthorizationInfo(const std::list<NukiOpener::LogEntry>& logEntries)
|
||||
void NetworkOpener::publishAuthorizationInfo(const std::list<NukiOpener::LogEntry>& logEntries, bool latest)
|
||||
{
|
||||
char str[50];
|
||||
char authName[33];
|
||||
@@ -399,100 +399,106 @@ void NetworkOpener::publishAuthorizationInfo(const std::list<NukiOpener::LogEntr
|
||||
}
|
||||
}
|
||||
|
||||
auto entry = json.add<JsonVariant>();
|
||||
|
||||
entry["index"] = log.index;
|
||||
entry["authorizationId"] = log.authId;
|
||||
entry["authorizationName"] = _authName;
|
||||
entry["timeYear"] = log.timeStampYear;
|
||||
entry["timeMonth"] = log.timeStampMonth;
|
||||
entry["timeDay"] = log.timeStampDay;
|
||||
entry["timeHour"] = log.timeStampHour;
|
||||
entry["timeMinute"] = log.timeStampMinute;
|
||||
entry["timeSecond"] = log.timeStampSecond;
|
||||
|
||||
memset(str, 0, sizeof(str));
|
||||
loggingTypeToString(log.loggingType, str);
|
||||
entry["type"] = str;
|
||||
|
||||
switch(log.loggingType)
|
||||
if(!latest)
|
||||
{
|
||||
case NukiOpener::LoggingType::LockAction:
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiOpener::lockactionToString((NukiOpener::LockAction)log.data[0], str);
|
||||
entry["action"] = str;
|
||||
auto entry = json.add<JsonVariant>();
|
||||
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiOpener::triggerToString((NukiOpener::Trigger)log.data[1], str);
|
||||
entry["trigger"] = str;
|
||||
entry["index"] = log.index;
|
||||
entry["authorizationId"] = log.authId;
|
||||
entry["authorizationName"] = _authName;
|
||||
entry["timeYear"] = log.timeStampYear;
|
||||
entry["timeMonth"] = log.timeStampMonth;
|
||||
entry["timeDay"] = log.timeStampDay;
|
||||
entry["timeHour"] = log.timeStampHour;
|
||||
entry["timeMinute"] = log.timeStampMinute;
|
||||
entry["timeSecond"] = log.timeStampSecond;
|
||||
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiOpener::completionStatusToString((NukiOpener::CompletionStatus)log.data[3], str);
|
||||
entry["completionStatus"] = str;
|
||||
break;
|
||||
case NukiOpener::LoggingType::KeypadAction:
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiOpener::lockactionToString((NukiOpener::LockAction)log.data[0], str);
|
||||
entry["action"] = str;
|
||||
memset(str, 0, sizeof(str));
|
||||
loggingTypeToString(log.loggingType, str);
|
||||
entry["type"] = str;
|
||||
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiOpener::completionStatusToString((NukiOpener::CompletionStatus)log.data[2], str);
|
||||
entry["completionStatus"] = str;
|
||||
break;
|
||||
case NukiOpener::LoggingType::DoorbellRecognition:
|
||||
switch(log.data[0] & 3)
|
||||
{
|
||||
case 0:
|
||||
entry["mode"] = "None";
|
||||
break;
|
||||
case 1:
|
||||
entry["mode"] = "RTO";
|
||||
break;
|
||||
case 2:
|
||||
entry["mode"] = "CM";
|
||||
break;
|
||||
default:
|
||||
entry["mode"] = "Unknown";
|
||||
break;
|
||||
}
|
||||
switch(log.loggingType)
|
||||
{
|
||||
case NukiOpener::LoggingType::LockAction:
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiOpener::lockactionToString((NukiOpener::LockAction)log.data[0], str);
|
||||
entry["action"] = str;
|
||||
|
||||
switch(log.data[1])
|
||||
{
|
||||
case 0:
|
||||
entry["source"] = "Doorbell";
|
||||
break;
|
||||
case 1:
|
||||
entry["source"] = "Timecontrol";
|
||||
break;
|
||||
case 2:
|
||||
entry["source"] = "App";
|
||||
break;
|
||||
case 3:
|
||||
entry["source"] = "Button";
|
||||
break;
|
||||
case 4:
|
||||
entry["source"] = "Fob";
|
||||
break;
|
||||
case 5:
|
||||
entry["source"] = "Bridge";
|
||||
break;
|
||||
case 6:
|
||||
entry["source"] = "Keypad";
|
||||
break;
|
||||
default:
|
||||
entry["source"] = "Unknown";
|
||||
break; }
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiOpener::triggerToString((NukiOpener::Trigger)log.data[1], str);
|
||||
entry["trigger"] = str;
|
||||
|
||||
entry["geofence"] = log.data[2] == 1 ? "active" : "inactive";
|
||||
entry["doorbellSuppression"] = log.data[3] == 1 ? "active" : "inactive";
|
||||
entry["completionStatus"] = str;
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiOpener::completionStatusToString((NukiOpener::CompletionStatus)log.data[3], str);
|
||||
entry["completionStatus"] = str;
|
||||
break;
|
||||
case NukiOpener::LoggingType::KeypadAction:
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiOpener::lockactionToString((NukiOpener::LockAction)log.data[0], str);
|
||||
entry["action"] = str;
|
||||
|
||||
break;
|
||||
memset(str, 0, sizeof(str));
|
||||
NukiOpener::completionStatusToString((NukiOpener::CompletionStatus)log.data[2], str);
|
||||
entry["completionStatus"] = str;
|
||||
break;
|
||||
case NukiOpener::LoggingType::DoorbellRecognition:
|
||||
switch(log.data[0] & 3)
|
||||
{
|
||||
case 0:
|
||||
entry["mode"] = "None";
|
||||
break;
|
||||
case 1:
|
||||
entry["mode"] = "RTO";
|
||||
break;
|
||||
case 2:
|
||||
entry["mode"] = "CM";
|
||||
break;
|
||||
default:
|
||||
entry["mode"] = "Unknown";
|
||||
break;
|
||||
}
|
||||
|
||||
switch(log.data[1])
|
||||
{
|
||||
case 0:
|
||||
entry["source"] = "Doorbell";
|
||||
break;
|
||||
case 1:
|
||||
entry["source"] = "Timecontrol";
|
||||
break;
|
||||
case 2:
|
||||
entry["source"] = "App";
|
||||
break;
|
||||
case 3:
|
||||
entry["source"] = "Button";
|
||||
break;
|
||||
case 4:
|
||||
entry["source"] = "Fob";
|
||||
break;
|
||||
case 5:
|
||||
entry["source"] = "Bridge";
|
||||
break;
|
||||
case 6:
|
||||
entry["source"] = "Keypad";
|
||||
break;
|
||||
default:
|
||||
entry["source"] = "Unknown";
|
||||
break; }
|
||||
|
||||
entry["geofence"] = log.data[2] == 1 ? "active" : "inactive";
|
||||
entry["doorbellSuppression"] = log.data[3] == 1 ? "active" : "inactive";
|
||||
entry["completionStatus"] = str;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
serializeJson(json, _buffer, _bufferSize);
|
||||
publishString(mqtt_topic_lock_log, _buffer);
|
||||
if(!latest)
|
||||
{
|
||||
serializeJson(json, _buffer, _bufferSize);
|
||||
publishString(mqtt_topic_lock_log, _buffer);
|
||||
}
|
||||
|
||||
if(authFound)
|
||||
{
|
||||
|
||||
@@ -21,7 +21,7 @@ public:
|
||||
void publishKeyTurnerState(const NukiOpener::OpenerState& keyTurnerState, const NukiOpener::OpenerState& lastKeyTurnerState);
|
||||
void publishRing(const bool locked);
|
||||
void publishState(NukiOpener::OpenerState lockState);
|
||||
void publishAuthorizationInfo(const std::list<NukiOpener::LogEntry>& logEntries);
|
||||
void publishAuthorizationInfo(const std::list<NukiOpener::LogEntry>& logEntries, bool latest);
|
||||
void clearAuthorizationInfo();
|
||||
void publishCommandResult(const char* resultStr);
|
||||
void publishLockstateCommandResult(const char* resultStr);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "Logger.h"
|
||||
#include "RestartReason.h"
|
||||
#include <NukiOpenerUtils.h>
|
||||
#include "Config.h"
|
||||
|
||||
NukiOpenerWrapper* nukiOpenerInst;
|
||||
Preferences* nukiOpenerPreferences = nullptr;
|
||||
@@ -173,9 +174,19 @@ void NukiOpenerWrapper::update()
|
||||
setupHASS();
|
||||
}
|
||||
}
|
||||
if(_nextTimeControlUpdateTs != 0 && ts > _nextTimeControlUpdateTs)
|
||||
if(_waitAuthLogUpdateTs != 0 && ts > _waitAuthLogUpdateTs)
|
||||
{
|
||||
_nextTimeControlUpdateTs = 0;
|
||||
_waitAuthLogUpdateTs = 0;
|
||||
updateAuthData(true);
|
||||
}
|
||||
if(_waitKeypadUpdateTs != 0 && ts > _waitKeypadUpdateTs)
|
||||
{
|
||||
_waitKeypadUpdateTs = 0;
|
||||
updateKeypad(true);
|
||||
}
|
||||
if(_waitTimeControlUpdateTs != 0 && ts > _waitTimeControlUpdateTs)
|
||||
{
|
||||
_waitTimeControlUpdateTs = 0;
|
||||
updateTimeControl(true);
|
||||
}
|
||||
if(_hassEnabled && _configRead && _network->reconnected())
|
||||
@@ -197,7 +208,7 @@ void NukiOpenerWrapper::update()
|
||||
if(_hasKeypad && _keypadEnabled && (_nextKeypadUpdateTs == 0 || ts > _nextKeypadUpdateTs || (queryCommands & QUERY_COMMAND_KEYPAD) > 0))
|
||||
{
|
||||
_nextKeypadUpdateTs = ts + _intervalKeypad * 1000;
|
||||
updateKeypad();
|
||||
updateKeypad(false);
|
||||
}
|
||||
|
||||
if(_nextLockAction != (NukiOpener::LockAction)0xff && ts > _nextRetryTs)
|
||||
@@ -379,7 +390,7 @@ void NukiOpenerWrapper::updateKeyTurnerState()
|
||||
if(_publishAuthData)
|
||||
{
|
||||
Log->println(F("Publishing auth data"));
|
||||
updateAuthData();
|
||||
updateAuthData(false);
|
||||
Log->println(F("Done publishing auth data"));
|
||||
}
|
||||
|
||||
@@ -477,7 +488,7 @@ void NukiOpenerWrapper::updateConfig()
|
||||
}
|
||||
}
|
||||
|
||||
void NukiOpenerWrapper::updateAuthData()
|
||||
void NukiOpenerWrapper::updateAuthData(bool retrieved)
|
||||
{
|
||||
if(!isPinValid())
|
||||
{
|
||||
@@ -485,40 +496,53 @@ void NukiOpenerWrapper::updateAuthData()
|
||||
return;
|
||||
}
|
||||
|
||||
Nuki::CmdResult result = _nukiOpener.retrieveLogEntries(0, _preferences->getInt(preference_authlog_max_entries, 5), 1, false);
|
||||
Log->print(F("Retrieve log entries: "));
|
||||
Log->println(result);
|
||||
if(result != Nuki::CmdResult::Success)
|
||||
if(!retrieved)
|
||||
{
|
||||
return;
|
||||
Nuki::CmdResult result = _nukiOpener.retrieveLogEntries(0, 3, 1, false);
|
||||
Log->print(F("Retrieve log entries: "));
|
||||
Log->println(result);
|
||||
printCommandResult(result);
|
||||
if(result == Nuki::CmdResult::Success)
|
||||
{
|
||||
Nuki::CmdResult result = _nukiOpener.retrieveLogEntries(0, _preferences->getInt(preference_authlog_max_entries, MAX_AUTHLOG), 1, false);
|
||||
if(result == Nuki::CmdResult::Success)
|
||||
{
|
||||
_waitAuthLogUpdateTs = millis() + 5000;
|
||||
}
|
||||
delay(150);
|
||||
|
||||
std::list<NukiOpener::LogEntry> log;
|
||||
_nukiOpener.getLogEntries(&log);
|
||||
_network->publishAuthorizationInfo(log, true);
|
||||
}
|
||||
}
|
||||
|
||||
delay(_preferences->getInt(preference_authlog_max_entries, 5) * 30);
|
||||
|
||||
std::list<NukiOpener::LogEntry> log;
|
||||
_nukiOpener.getLogEntries(&log);
|
||||
|
||||
if(log.size() > _preferences->getInt(preference_authlog_max_entries, 5))
|
||||
else
|
||||
{
|
||||
log.resize(_preferences->getInt(preference_authlog_max_entries, 5));
|
||||
}
|
||||
std::list<NukiOpener::LogEntry> log;
|
||||
_nukiOpener.getLogEntries(&log);
|
||||
|
||||
Log->print(F("Log size: "));
|
||||
Log->println(log.size());
|
||||
if(log.size() > _preferences->getInt(preference_authlog_max_entries, MAX_AUTHLOG))
|
||||
{
|
||||
log.resize(_preferences->getInt(preference_authlog_max_entries, MAX_AUTHLOG));
|
||||
}
|
||||
|
||||
if(log.size() > 0)
|
||||
{
|
||||
_network->publishAuthorizationInfo(log);
|
||||
Log->print(F("Log size: "));
|
||||
Log->println(log.size());
|
||||
|
||||
if(log.size() > 0)
|
||||
{
|
||||
_network->publishAuthorizationInfo(log, false);
|
||||
}
|
||||
}
|
||||
postponeBleWatchdog();
|
||||
}
|
||||
|
||||
void NukiOpenerWrapper::updateKeypad()
|
||||
void NukiOpenerWrapper::updateKeypad(bool retrieved)
|
||||
{
|
||||
if(!_preferences->getBool(preference_keypad_info_enabled)) return;
|
||||
|
||||
Log->print(F("Querying opener keypad: "));
|
||||
Nuki::CmdResult result = _nukiOpener.retrieveKeypadEntries(0, _preferences->getInt(preference_keypad_max_entries, 10));
|
||||
Nuki::CmdResult result = _nukiOpener.retrieveKeypadEntries(0, _preferences->getInt(preference_keypad_max_entries, MAX_KEYPAD));
|
||||
printCommandResult(result);
|
||||
if(result == Nuki::CmdResult::Success)
|
||||
{
|
||||
@@ -530,9 +554,9 @@ void NukiOpenerWrapper::updateKeypad()
|
||||
|
||||
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))
|
||||
if(entries.size() > _preferences->getInt(preference_keypad_max_entries, MAX_KEYPAD))
|
||||
{
|
||||
entries.resize(_preferences->getInt(preference_keypad_max_entries, 10));
|
||||
entries.resize(_preferences->getInt(preference_keypad_max_entries, MAX_KEYPAD));
|
||||
}
|
||||
|
||||
uint keypadCount = entries.size();
|
||||
@@ -569,7 +593,7 @@ void NukiOpenerWrapper::updateTimeControl(bool retrieved)
|
||||
printCommandResult(result);
|
||||
if(result == Nuki::CmdResult::Success)
|
||||
{
|
||||
_nextTimeControlUpdateTs = millis() + 5000;
|
||||
_waitTimeControlUpdateTs = millis() + 5000;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -582,9 +606,9 @@ void NukiOpenerWrapper::updateTimeControl(bool retrieved)
|
||||
|
||||
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))
|
||||
if(timeControlEntries.size() > _preferences->getInt(preference_timecontrol_max_entries, MAX_TIMECONTROL))
|
||||
{
|
||||
timeControlEntries.resize(_preferences->getInt(preference_timecontrol_max_entries, 10));
|
||||
timeControlEntries.resize(_preferences->getInt(preference_timecontrol_max_entries, MAX_TIMECONTROL));
|
||||
}
|
||||
|
||||
_network->publishTimeControl(timeControlEntries);
|
||||
@@ -1372,7 +1396,7 @@ void NukiOpenerWrapper::onKeypadCommandReceived(const char *command, const uint
|
||||
entry.code = codeInt;
|
||||
result = _nukiOpener.addKeypadEntry(entry);
|
||||
Log->print("Add keypad code: "); Log->println((int)result);
|
||||
updateKeypad();
|
||||
updateKeypad(false);
|
||||
}
|
||||
else if(strcmp(command, "delete") == 0)
|
||||
{
|
||||
@@ -1383,7 +1407,7 @@ void NukiOpenerWrapper::onKeypadCommandReceived(const char *command, const uint
|
||||
}
|
||||
result = _nukiOpener.deleteKeypadEntry(id);
|
||||
Log->print("Delete keypad code: "); Log->println((int)result);
|
||||
updateKeypad();
|
||||
updateKeypad(false);
|
||||
}
|
||||
else if(strcmp(command, "update") == 0)
|
||||
{
|
||||
@@ -1417,7 +1441,7 @@ void NukiOpenerWrapper::onKeypadCommandReceived(const char *command, const uint
|
||||
entry.enabled = enabled == 0 ? 0 : 1;
|
||||
result = _nukiOpener.updateKeypadEntry(entry);
|
||||
Log->print("Update keypad code: "); Log->println((int)result);
|
||||
updateKeypad();
|
||||
updateKeypad(false);
|
||||
}
|
||||
else if(command == "--")
|
||||
{
|
||||
@@ -1770,7 +1794,7 @@ void NukiOpenerWrapper::onKeypadJsonCommandReceived(const char *value)
|
||||
return;
|
||||
}
|
||||
|
||||
updateKeypad();
|
||||
updateKeypad(false);
|
||||
|
||||
if((int)result != -1)
|
||||
{
|
||||
|
||||
@@ -61,8 +61,8 @@ private:
|
||||
void updateKeyTurnerState();
|
||||
void updateBatteryState();
|
||||
void updateConfig();
|
||||
void updateAuthData();
|
||||
void updateKeypad();
|
||||
void updateAuthData(bool retrieved);
|
||||
void updateKeypad(bool retrieved);
|
||||
void updateTimeControl(bool retrieved);
|
||||
void postponeBleWatchdog();
|
||||
|
||||
@@ -132,7 +132,9 @@ private:
|
||||
unsigned long _nextLockStateUpdateTs = 0;
|
||||
unsigned long _nextBatteryReportTs = 0;
|
||||
unsigned long _nextConfigUpdateTs = 0;
|
||||
unsigned long _nextTimeControlUpdateTs = 0;
|
||||
unsigned long _waitAuthLogUpdateTs = 0;
|
||||
unsigned long _waitKeypadUpdateTs = 0;
|
||||
unsigned long _waitTimeControlUpdateTs = 0;
|
||||
unsigned long _nextKeypadUpdateTs = 0;
|
||||
unsigned long _nextPairTs = 0;
|
||||
long _nextRssiTs = 0;
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "Logger.h"
|
||||
#include "RestartReason.h"
|
||||
#include <NukiLockUtils.h>
|
||||
#include "Config.h"
|
||||
|
||||
NukiWrapper* nukiInst;
|
||||
Preferences* nukiLockPreferences = nullptr;
|
||||
@@ -192,9 +193,19 @@ void NukiWrapper::update()
|
||||
setupHASS();
|
||||
}
|
||||
}
|
||||
if(_nextTimeControlUpdateTs != 0 && ts > _nextTimeControlUpdateTs)
|
||||
if(_waitAuthLogUpdateTs != 0 && ts > _waitAuthLogUpdateTs)
|
||||
{
|
||||
_nextTimeControlUpdateTs = 0;
|
||||
_waitAuthLogUpdateTs = 0;
|
||||
updateAuthData(true);
|
||||
}
|
||||
if(_waitKeypadUpdateTs != 0 && ts > _waitKeypadUpdateTs)
|
||||
{
|
||||
_waitKeypadUpdateTs = 0;
|
||||
updateKeypad(true);
|
||||
}
|
||||
if(_waitTimeControlUpdateTs != 0 && ts > _waitTimeControlUpdateTs)
|
||||
{
|
||||
_waitTimeControlUpdateTs = 0;
|
||||
updateTimeControl(true);
|
||||
}
|
||||
if(_hassEnabled && _configRead && _network->reconnected())
|
||||
@@ -216,7 +227,7 @@ void NukiWrapper::update()
|
||||
if(_hasKeypad && _keypadEnabled && (_nextKeypadUpdateTs == 0 || ts > _nextKeypadUpdateTs || (queryCommands & QUERY_COMMAND_KEYPAD) > 0))
|
||||
{
|
||||
_nextKeypadUpdateTs = ts + _intervalKeypad * 1000;
|
||||
updateKeypad();
|
||||
updateKeypad(false);
|
||||
}
|
||||
|
||||
if(_nextLockAction != (NukiLock::LockAction)0xff && ts > _nextRetryTs)
|
||||
@@ -353,7 +364,7 @@ void NukiWrapper::updateKeyTurnerState()
|
||||
if(_publishAuthData)
|
||||
{
|
||||
Log->println(F("Publishing auth data"));
|
||||
updateAuthData();
|
||||
updateAuthData(false);
|
||||
Log->println(F("Done publishing auth data"));
|
||||
}
|
||||
|
||||
@@ -458,7 +469,7 @@ void NukiWrapper::updateConfig()
|
||||
}
|
||||
}
|
||||
|
||||
void NukiWrapper::updateAuthData()
|
||||
void NukiWrapper::updateAuthData(bool retrieved)
|
||||
{
|
||||
if(!isPinValid())
|
||||
{
|
||||
@@ -466,42 +477,63 @@ void NukiWrapper::updateAuthData()
|
||||
return;
|
||||
}
|
||||
|
||||
Nuki::CmdResult result = _nukiLock.retrieveLogEntries(0, _preferences->getInt(preference_authlog_max_entries, 5), 1, false);
|
||||
Log->print(F("Retrieve log entries: "));
|
||||
Log->println(result);
|
||||
if(result != Nuki::CmdResult::Success)
|
||||
if(!retrieved)
|
||||
{
|
||||
return;
|
||||
Nuki::CmdResult result = _nukiLock.retrieveLogEntries(0, 3, 1, false);
|
||||
Log->print(F("Retrieve log entries: "));
|
||||
Log->println(result);
|
||||
printCommandResult(result);
|
||||
if(result == Nuki::CmdResult::Success)
|
||||
{
|
||||
Nuki::CmdResult result = _nukiLock.retrieveLogEntries(0, _preferences->getInt(preference_authlog_max_entries, MAX_AUTHLOG), 1, false);
|
||||
if(result == Nuki::CmdResult::Success)
|
||||
{
|
||||
_waitAuthLogUpdateTs = millis() + 5000;
|
||||
}
|
||||
delay(150);
|
||||
|
||||
std::list<NukiLock::LogEntry> log;
|
||||
_nukiLock.getLogEntries(&log);
|
||||
_network->publishAuthorizationInfo(log, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::list<NukiLock::LogEntry> log;
|
||||
_nukiLock.getLogEntries(&log);
|
||||
|
||||
if(log.size() > _preferences->getInt(preference_authlog_max_entries, MAX_AUTHLOG))
|
||||
{
|
||||
log.resize(_preferences->getInt(preference_authlog_max_entries, MAX_AUTHLOG));
|
||||
}
|
||||
|
||||
Log->print(F("Log size: "));
|
||||
Log->println(log.size());
|
||||
|
||||
if(log.size() > 0)
|
||||
{
|
||||
_network->publishAuthorizationInfo(log, false);
|
||||
}
|
||||
}
|
||||
|
||||
delay(_preferences->getInt(preference_authlog_max_entries, 5) * 30);
|
||||
|
||||
std::list<NukiLock::LogEntry> 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->println(log.size());
|
||||
|
||||
if(log.size() > 0)
|
||||
{
|
||||
_network->publishAuthorizationInfo(log);
|
||||
}
|
||||
postponeBleWatchdog();
|
||||
}
|
||||
|
||||
void NukiWrapper::updateKeypad()
|
||||
void NukiWrapper::updateKeypad(bool retrieved)
|
||||
{
|
||||
if(!_preferences->getBool(preference_keypad_info_enabled)) return;
|
||||
|
||||
Log->print(F("Querying lock keypad: "));
|
||||
Nuki::CmdResult result = _nukiLock.retrieveKeypadEntries(0, _preferences->getInt(preference_keypad_max_entries, 10));
|
||||
printCommandResult(result);
|
||||
if(result == Nuki::CmdResult::Success)
|
||||
if(!retrieved)
|
||||
{
|
||||
Log->print(F("Querying lock keypad: "));
|
||||
Nuki::CmdResult result = _nukiLock.retrieveKeypadEntries(0, _preferences->getInt(preference_keypad_max_entries, MAX_KEYPAD));
|
||||
printCommandResult(result);
|
||||
if(result == Nuki::CmdResult::Success)
|
||||
{
|
||||
_waitKeypadUpdateTs = millis() + 5000;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::list<NukiLock::KeypadEntry> entries;
|
||||
_nukiLock.getKeypadEntries(&entries);
|
||||
@@ -511,9 +543,9 @@ void NukiWrapper::updateKeypad()
|
||||
|
||||
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))
|
||||
if(entries.size() > _preferences->getInt(preference_keypad_max_entries, MAX_KEYPAD))
|
||||
{
|
||||
entries.resize(_preferences->getInt(preference_keypad_max_entries, 10));
|
||||
entries.resize(_preferences->getInt(preference_keypad_max_entries, MAX_KEYPAD));
|
||||
}
|
||||
|
||||
uint keypadCount = entries.size();
|
||||
@@ -550,7 +582,7 @@ void NukiWrapper::updateTimeControl(bool retrieved)
|
||||
printCommandResult(result);
|
||||
if(result == Nuki::CmdResult::Success)
|
||||
{
|
||||
_nextTimeControlUpdateTs = millis() + 5000;
|
||||
_waitTimeControlUpdateTs = millis() + 5000;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -563,9 +595,9 @@ void NukiWrapper::updateTimeControl(bool retrieved)
|
||||
|
||||
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))
|
||||
if(timeControlEntries.size() > _preferences->getInt(preference_timecontrol_max_entries, MAX_TIMECONTROL))
|
||||
{
|
||||
timeControlEntries.resize(_preferences->getInt(preference_timecontrol_max_entries, 10));
|
||||
timeControlEntries.resize(_preferences->getInt(preference_timecontrol_max_entries, MAX_TIMECONTROL));
|
||||
}
|
||||
|
||||
_network->publishTimeControl(timeControlEntries);
|
||||
@@ -1358,7 +1390,7 @@ void NukiWrapper::onKeypadCommandReceived(const char *command, const uint &id, c
|
||||
entry.code = codeInt;
|
||||
result = _nukiLock.addKeypadEntry(entry);
|
||||
Log->print("Add keypad code: "); Log->println((int)result);
|
||||
updateKeypad();
|
||||
updateKeypad(false);
|
||||
}
|
||||
else if(strcmp(command, "delete") == 0)
|
||||
{
|
||||
@@ -1369,7 +1401,7 @@ void NukiWrapper::onKeypadCommandReceived(const char *command, const uint &id, c
|
||||
}
|
||||
result = _nukiLock.deleteKeypadEntry(id);
|
||||
Log->print("Delete keypad code: "); Log->println((int)result);
|
||||
updateKeypad();
|
||||
updateKeypad(false);
|
||||
}
|
||||
else if(strcmp(command, "update") == 0)
|
||||
{
|
||||
@@ -1403,7 +1435,7 @@ void NukiWrapper::onKeypadCommandReceived(const char *command, const uint &id, c
|
||||
entry.enabled = enabled == 0 ? 0 : 1;
|
||||
result = _nukiLock.updateKeypadEntry(entry);
|
||||
Log->print("Update keypad code: "); Log->println((int)result);
|
||||
updateKeypad();
|
||||
updateKeypad(false);
|
||||
}
|
||||
else if(command == "--")
|
||||
{
|
||||
@@ -1756,7 +1788,7 @@ void NukiWrapper::onKeypadJsonCommandReceived(const char *value)
|
||||
return;
|
||||
}
|
||||
|
||||
updateKeypad();
|
||||
updateKeypad(false);
|
||||
|
||||
if((int)result != -1)
|
||||
{
|
||||
|
||||
@@ -59,8 +59,8 @@ private:
|
||||
void updateKeyTurnerState();
|
||||
void updateBatteryState();
|
||||
void updateConfig();
|
||||
void updateAuthData();
|
||||
void updateKeypad();
|
||||
void updateAuthData(bool retrieved);
|
||||
void updateKeypad(bool retrieved);
|
||||
void updateTimeControl(bool retrieved);
|
||||
void postponeBleWatchdog();
|
||||
|
||||
@@ -127,7 +127,9 @@ private:
|
||||
unsigned long _nextLockStateUpdateTs = 0;
|
||||
unsigned long _nextBatteryReportTs = 0;
|
||||
unsigned long _nextConfigUpdateTs = 0;
|
||||
unsigned long _nextTimeControlUpdateTs = 0;
|
||||
unsigned long _waitAuthLogUpdateTs = 0;
|
||||
unsigned long _waitKeypadUpdateTs = 0;
|
||||
unsigned long _waitTimeControlUpdateTs = 0;
|
||||
unsigned long _nextKeypadUpdateTs = 0;
|
||||
unsigned long _nextRssiTs = 0;
|
||||
unsigned long _lastRssi = 0;
|
||||
|
||||
@@ -78,6 +78,9 @@
|
||||
#define preference_authlog_max_entries (char*)"authmaxentry"
|
||||
#define preference_keypad_max_entries (char*)"kpmaxentry"
|
||||
#define preference_timecontrol_max_entries (char*)"tcmaxentry"
|
||||
#define preference_bootloop_counter (char*)"btlpcounter"
|
||||
#define preference_enable_bootloop_reset (char*)"enabtlprst"
|
||||
#define preference_buffer_size (char*)"buffsize"
|
||||
|
||||
class DebugPreferences
|
||||
{
|
||||
@@ -87,8 +90,8 @@ private:
|
||||
preference_started_before, preference_config_version, preference_device_id_lock, preference_device_id_opener, preference_nuki_id_lock, preference_nuki_id_opener, preference_mqtt_broker, preference_mqtt_broker_port, preference_mqtt_user, preference_mqtt_password, preference_mqtt_log_enabled, preference_check_updates, preference_webserver_enabled,
|
||||
preference_lock_enabled, preference_lock_pin_status, preference_mqtt_lock_path, preference_opener_enabled, preference_opener_pin_status,
|
||||
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_ip_dhcp_enabled, preference_ip_address, preference_ip_subnet, preference_ip_gateway, preference_ip_dns_server,
|
||||
preference_enable_bootloop_reset, preference_mqtt_ca, preference_mqtt_crt, preference_mqtt_key, preference_mqtt_hass_discovery, preference_mqtt_hass_cu_url,
|
||||
preference_buffer_size, 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_hostname,
|
||||
preference_network_timeout, preference_restart_on_disconnect, 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,
|
||||
@@ -109,7 +112,7 @@ private:
|
||||
std::vector<char*> _boolPrefs =
|
||||
{
|
||||
preference_started_before, preference_mqtt_log_enabled, preference_check_updates, preference_lock_enabled, preference_opener_enabled, preference_opener_continuous_mode,
|
||||
preference_webserver_enabled, preference_restart_on_disconnect, preference_keypad_control_enabled, preference_keypad_info_enabled,
|
||||
preference_enable_bootloop_reset, preference_webserver_enabled, preference_restart_on_disconnect, preference_keypad_control_enabled, preference_keypad_info_enabled,
|
||||
preference_timecontrol_control_enabled, preference_timecontrol_info_enabled, preference_register_as_app, preference_ip_dhcp_enabled,
|
||||
preference_publish_authdata, preference_has_mac_saved, preference_publish_debug_info, preference_network_wifi_fallback_disabled
|
||||
};
|
||||
|
||||
@@ -475,32 +475,63 @@ bool WebCfgServer::processArgs(String& message)
|
||||
}
|
||||
else if(key == "TSKNTWK")
|
||||
{
|
||||
if(value.toInt() > 12287 && value.toInt() < 32769)
|
||||
{
|
||||
_preferences->putInt(preference_task_size_network, value.toInt());
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "TSKNUKI")
|
||||
{
|
||||
_preferences->putInt(preference_task_size_nuki, value.toInt());
|
||||
configChanged = true;
|
||||
if(value.toInt() > 8191 && value.toInt() < 32769)
|
||||
{
|
||||
_preferences->putInt(preference_task_size_nuki, value.toInt());
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "TSKPD")
|
||||
{
|
||||
_preferences->putInt(preference_task_size_pd, value.toInt());
|
||||
configChanged = true;
|
||||
if(value.toInt() > 1023 && value.toInt() < 4049)
|
||||
{
|
||||
_preferences->putInt(preference_task_size_pd, value.toInt());
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "ALMAX")
|
||||
{
|
||||
_preferences->putInt(preference_authlog_max_entries, value.toInt());
|
||||
configChanged = true;
|
||||
if(value.toInt() > 0 && value.toInt() < 51)
|
||||
{
|
||||
_preferences->putInt(preference_authlog_max_entries, value.toInt());
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "KPMAX")
|
||||
{
|
||||
_preferences->putInt(preference_keypad_max_entries, value.toInt());
|
||||
configChanged = true;
|
||||
if(value.toInt() > 0 && value.toInt() < 101)
|
||||
{
|
||||
_preferences->putInt(preference_keypad_max_entries, value.toInt());
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "TCMAX")
|
||||
{
|
||||
_preferences->putInt(preference_timecontrol_max_entries, value.toInt());
|
||||
if(value.toInt() > 0 && value.toInt() < 51)
|
||||
{
|
||||
_preferences->putInt(preference_timecontrol_max_entries, value.toInt());
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "BUFFSIZE")
|
||||
{
|
||||
if(value.toInt() > 4095 && value.toInt() < 32769)
|
||||
{
|
||||
_preferences->putInt(preference_buffer_size, value.toInt());
|
||||
configChanged = true;
|
||||
}
|
||||
}
|
||||
else if(key == "BTLPRST")
|
||||
{
|
||||
_preferences->putBool(preference_enable_bootloop_reset, (value == "1"));
|
||||
configChanged = true;
|
||||
}
|
||||
else if(key == "ACLLVLCHANGED")
|
||||
@@ -1121,8 +1152,13 @@ void WebCfgServer::buildHtml(String& response)
|
||||
buildNavigationButton(response, "Edit", "/gpiocfg");
|
||||
response.concat("</td></tr><tr><td><h5>Firmware update</h5></td><td class=\"tdbtn\">");
|
||||
buildNavigationButton(response, "Open", "/ota");
|
||||
response.concat("</td></tr><tr><td><h5>Advanced Configuration</h5></td><td class=\"tdbtn\">");
|
||||
buildNavigationButton(response, "Edit", "/advanced");
|
||||
|
||||
if(_preferences->getBool(preference_publish_debug_info, false))
|
||||
{
|
||||
response.concat("</td></tr><tr><td><h5>Advanced Configuration</h5></td><td class=\"tdbtn\">");
|
||||
buildNavigationButton(response, "Edit", "/advanced");
|
||||
}
|
||||
|
||||
response.concat("</td></tr>");
|
||||
|
||||
if(_allowRestartToPortal)
|
||||
@@ -1304,12 +1340,17 @@ void WebCfgServer::buildAdvancedConfigHtml(String &response)
|
||||
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("<tr><td>Current bootloop prevention state</td><td>");
|
||||
response.concat(_preferences->getBool(preference_enable_bootloop_reset, false) ? "Enabled" : "Disabled");
|
||||
response.concat("</td></tr>");
|
||||
printCheckBox(response, "BTLPRST", "Enable Bootloop prevention (Try to reset these settings to default on bootloop)", true, "");
|
||||
printInputField(response, "BUFFSIZE", "Char buffer size (min 4096, max 32768)", _preferences->getInt(preference_buffer_size, CHAR_BUFFER_SIZE), 6);
|
||||
printInputField(response, "TSKNTWK", "Task size Network (min 12288, max 32768)", _preferences->getInt(preference_task_size_network, NETWORK_TASK_SIZE), 6);
|
||||
printInputField(response, "TSKNUKI", "Task size Nuki (min 8192, max 32768)", _preferences->getInt(preference_task_size_nuki, NUKI_TASK_SIZE), 6);
|
||||
printInputField(response, "TSKPD", "Task size Presence Detection (min 1024, max 4048)", _preferences->getInt(preference_task_size_pd, PD_TASK_SIZE), 6);
|
||||
printInputField(response, "ALMAX", "Max auth log entries (min 1, max 50)", _preferences->getInt(preference_authlog_max_entries, MAX_AUTHLOG), 3);
|
||||
printInputField(response, "KPMAX", "Max keypad entries (min 1, max 100)", _preferences->getInt(preference_keypad_max_entries, MAX_KEYPAD), 3);
|
||||
printInputField(response, "TCMAX", "Max timecontrol entries (min 1, max 50)", _preferences->getInt(preference_timecontrol_max_entries, MAX_TIMECONTROL), 3);
|
||||
response.concat("</table>");
|
||||
|
||||
response.concat("<br><input type=\"submit\" name=\"submit\" value=\"Save\">");
|
||||
|
||||
37
src/main.cpp
37
src/main.cpp
@@ -116,12 +116,12 @@ void setupTasks()
|
||||
{
|
||||
// configMAX_PRIORITIES is 25
|
||||
|
||||
xTaskCreatePinnedToCore(networkTask, "ntw", preferences->getInt(preference_task_size_network, 12288), NULL, 3, &networkTaskHandle, 1);
|
||||
xTaskCreatePinnedToCore(nukiTask, "nuki", preferences->getInt(preference_task_size_nuki, 8192), NULL, 2, &nukiTaskHandle, 1);
|
||||
xTaskCreatePinnedToCore(networkTask, "ntw", preferences->getInt(preference_task_size_network, NETWORK_TASK_SIZE), NULL, 3, &networkTaskHandle, 1);
|
||||
xTaskCreatePinnedToCore(nukiTask, "nuki", preferences->getInt(preference_task_size_nuki, NUKI_TASK_SIZE), NULL, 2, &nukiTaskHandle, 1);
|
||||
|
||||
if(preferences->getInt(preference_presence_detection_timeout) >= 0)
|
||||
{
|
||||
xTaskCreatePinnedToCore(presenceDetectionTask, "prdet", preferences->getInt(preference_task_size_pd, 1024), NULL, 5, &presenceDetectionTaskHandle, 1);
|
||||
xTaskCreatePinnedToCore(presenceDetectionTask, "prdet", preferences->getInt(preference_task_size_pd, PD_TASK_SIZE), NULL, 5, &presenceDetectionTaskHandle, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -265,6 +265,27 @@ void setup()
|
||||
|
||||
initializeRestartReason();
|
||||
|
||||
if(preferences->getBool(preference_enable_bootloop_reset, false) &&
|
||||
(esp_reset_reason() == esp_reset_reason_t::ESP_RST_PANIC ||
|
||||
esp_reset_reason() == esp_reset_reason_t::ESP_RST_INT_WDT ||
|
||||
esp_reset_reason() == esp_reset_reason_t::ESP_RST_TASK_WDT ||
|
||||
esp_reset_reason() == esp_reset_reason_t::ESP_RST_WDT))
|
||||
{
|
||||
preferences->putInt(preference_bootloop_counter, preferences->getInt(preference_bootloop_counter, 0) + 1);
|
||||
Log->println(F("Bootloop counter incremented"));
|
||||
|
||||
if(preferences->getInt(preference_bootloop_counter) == 10)
|
||||
{
|
||||
preferences->putInt(preference_buffer_size, CHAR_BUFFER_SIZE);
|
||||
preferences->putInt(preference_task_size_network, NETWORK_TASK_SIZE);
|
||||
preferences->putInt(preference_task_size_nuki, NUKI_TASK_SIZE);
|
||||
preferences->putInt(preference_task_size_pd, PD_TASK_SIZE);
|
||||
preferences->putInt(preference_authlog_max_entries, MAX_AUTHLOG);
|
||||
preferences->putInt(preference_keypad_max_entries, MAX_KEYPAD);
|
||||
preferences->putInt(preference_timecontrol_max_entries, MAX_TIMECONTROL);
|
||||
preferences->putInt(preference_bootloop_counter, 0);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t devIdOpener = preferences->getUInt(preference_device_id_opener);
|
||||
|
||||
@@ -276,7 +297,9 @@ void setup()
|
||||
deviceIdOpener->assignId(deviceIdLock->get());
|
||||
}
|
||||
|
||||
CharBuffer::initialize();
|
||||
char16_t buffer_size = preferences->getInt(preference_buffer_size, 4096);
|
||||
|
||||
CharBuffer::initialize(buffer_size);
|
||||
|
||||
if(preferences->getInt(preference_restart_timer) != 0)
|
||||
{
|
||||
@@ -292,15 +315,15 @@ void setup()
|
||||
openerEnabled = preferences->getBool(preference_opener_enabled);
|
||||
|
||||
const String mqttLockPath = preferences->getString(preference_mqtt_lock_path);
|
||||
network = new Network(preferences, gpio, mqttLockPath, CharBuffer::get(), CHAR_BUFFER_SIZE);
|
||||
network = new Network(preferences, gpio, mqttLockPath, CharBuffer::get(), buffer_size);
|
||||
network->initialize();
|
||||
|
||||
networkLock = new NetworkLock(network, preferences, CharBuffer::get(), CHAR_BUFFER_SIZE);
|
||||
networkLock = new NetworkLock(network, preferences, CharBuffer::get(), buffer_size);
|
||||
networkLock->initialize();
|
||||
|
||||
if(openerEnabled)
|
||||
{
|
||||
networkOpener = new NetworkOpener(network, preferences, CharBuffer::get(), CHAR_BUFFER_SIZE);
|
||||
networkOpener = new NetworkOpener(network, preferences, CharBuffer::get(), buffer_size);
|
||||
networkOpener->initialize();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user