allow to enabld or disable lock/opener

This commit is contained in:
technyon
2022-06-01 19:47:27 +02:00
parent 76c0bc5427
commit 1ce8eb6603
6 changed files with 107 additions and 36 deletions

View File

@@ -7,7 +7,7 @@ project(nuki_hub CXX)
# ARDUHAL_LOG_LEVEL_NONE, define ARDUHAL_LOG_LEVEL_ERROR, define ARDUHAL_LOG_LEVEL_WARN, define ARDUHAL_LOG_LEVEL_INFO, # ARDUHAL_LOG_LEVEL_NONE, define ARDUHAL_LOG_LEVEL_ERROR, define ARDUHAL_LOG_LEVEL_WARN, define ARDUHAL_LOG_LEVEL_INFO,
# define ARDUHAL_LOG_LEVEL_DEBUG, define ARDUHAL_LOG_LEVEL_VERBOSE # define ARDUHAL_LOG_LEVEL_DEBUG, define ARDUHAL_LOG_LEVEL_VERBOSE
set(LOG_LEVEL ARDUHAL_LOG_LEVEL_DEBUG) set(LOG_LEVEL ARDUHAL_LOG_LEVEL_NONE)
include_directories(${PROJECT_NAME} include_directories(${PROJECT_NAME}
PRIVATE PRIVATE

View File

@@ -6,8 +6,9 @@
NukiWrapper* nukiInst; NukiWrapper* nukiInst;
NukiWrapper::NukiWrapper(const std::string& deviceName, uint32_t id, Network* network, Preferences* preferences) NukiWrapper::NukiWrapper(const std::string& deviceName, uint32_t id, BleScanner::Scanner* scanner, Network* network, Preferences* preferences)
: _deviceName(deviceName), : _deviceName(deviceName),
_bleScanner(scanner),
_nukiBle(deviceName, id), _nukiBle(deviceName, id),
_network(network), _network(network),
_preferences(preferences) _preferences(preferences)
@@ -27,16 +28,13 @@ NukiWrapper::NukiWrapper(const std::string& deviceName, uint32_t id, Network* ne
NukiWrapper::~NukiWrapper() NukiWrapper::~NukiWrapper()
{ {
delete _bleScanner;
_bleScanner = nullptr; _bleScanner = nullptr;
} }
void NukiWrapper::initialize() void NukiWrapper::initialize()
{ {
_bleScanner = new BleScanner::Scanner();
_bleScanner->initialize(_deviceName);
_bleScanner->setScanDuration(10);
_nukiBle.initialize(); _nukiBle.initialize();
_nukiBle.registerBleScanner(_bleScanner); _nukiBle.registerBleScanner(_bleScanner);
@@ -88,8 +86,6 @@ void NukiWrapper::update()
} }
} }
vTaskDelay( 20 / portTICK_PERIOD_MS);
_bleScanner->update();
_nukiBle.updateConnectionState(); _nukiBle.updateConnectionState();
unsigned long ts = millis(); unsigned long ts = millis();
@@ -304,11 +300,6 @@ const bool NukiWrapper::isPaired()
return _paired; return _paired;
} }
BleScanner::Scanner* NukiWrapper::bleScanner()
{
return _bleScanner;
}
void NukiWrapper::notify(Nuki::EventType eventType) void NukiWrapper::notify(Nuki::EventType eventType)
{ {
if(eventType == Nuki::EventType::KeyTurnerStatusUpdated) if(eventType == Nuki::EventType::KeyTurnerStatusUpdated)

View File

@@ -9,7 +9,7 @@
class NukiWrapper : public Nuki::SmartlockEventHandler class NukiWrapper : public Nuki::SmartlockEventHandler
{ {
public: public:
NukiWrapper(const std::string& deviceName, uint32_t id, Network* network, Preferences* preferences); NukiWrapper(const std::string& deviceName, uint32_t id, BleScanner::Scanner* scanner, Network* network, Preferences* preferences);
virtual ~NukiWrapper(); virtual ~NukiWrapper();
void initialize(); void initialize();
@@ -22,8 +22,6 @@ public:
const NukiLock::KeyTurnerState& keyTurnerState(); const NukiLock::KeyTurnerState& keyTurnerState();
const bool isPaired(); const bool isPaired();
BleScanner::Scanner* bleScanner();
void notify(Nuki::EventType eventType) override; void notify(Nuki::EventType eventType) override;
private: private:

View File

@@ -1,11 +1,14 @@
#pragma once #pragma once
#define preference_started_befores "run"
#define preference_deviceId "deviceId" #define preference_deviceId "deviceId"
#define preference_mqtt_broker "mqttbroker" #define preference_mqtt_broker "mqttbroker"
#define preference_mqtt_broker_port "mqttport" #define preference_mqtt_broker_port "mqttport"
#define preference_mqtt_user "mqttuser" #define preference_mqtt_user "mqttuser"
#define preference_mqtt_password "mqttpass" #define preference_mqtt_password "mqttpass"
#define preference_lock_enabled "lockena"
#define preference_mqtt_lock_path "mqttpath" #define preference_mqtt_lock_path "mqttpath"
#define preference_opener_enabled "openerena"
#define preference_mqtt_opener_path "mqttoppath" #define preference_mqtt_opener_path "mqttoppath"
#define preference_hostname "hostname" #define preference_hostname "hostname"
#define preference_network_timeout "nettmout" #define preference_network_timeout "nettmout"

View File

@@ -108,6 +108,8 @@ bool WebCfgServer::processArgs(String& message)
bool clearCredentials = false; bool clearCredentials = false;
bool publishAuthData = false; bool publishAuthData = false;
bool lockEnabled = false;
bool openerEnabled = false;
int count = _server.args(); int count = _server.args();
for(int index = 0; index < count; index++) for(int index = 0; index < count; index++)
@@ -184,6 +186,14 @@ bool WebCfgServer::processArgs(String& message)
{ {
publishAuthData = true; publishAuthData = true;
} }
else if(key == "LOCKENA")
{
lockEnabled = true;
}
else if(key == "OPENA")
{
openerEnabled = true;
}
else if(key == "CREDUSER") else if(key == "CREDUSER")
{ {
if(value == "#") if(value == "#")
@@ -201,7 +211,7 @@ bool WebCfgServer::processArgs(String& message)
_preferences->putString(preference_cred_password, value); _preferences->putString(preference_cred_password, value);
configChanged = true; configChanged = true;
} }
else if(key == "NUKIPIN") else if(key == "NUKIPIN" && _nuki != nullptr)
{ {
if(value == "#") if(value == "#")
{ {
@@ -222,6 +232,18 @@ bool WebCfgServer::processArgs(String& message)
configChanged = true; configChanged = true;
} }
if(_preferences->getBool(preference_lock_enabled) != lockEnabled)
{
_preferences->putBool(preference_lock_enabled, lockEnabled);
configChanged = true;
}
if(_preferences->getBool(preference_opener_enabled) != openerEnabled)
{
_preferences->putBool(preference_opener_enabled, openerEnabled);
configChanged = true;
}
if(clearMqttCredentials) if(clearMqttCredentials)
{ {
_preferences->putString(preference_mqtt_user, ""); _preferences->putString(preference_mqtt_user, "");
@@ -262,15 +284,23 @@ void WebCfgServer::buildHtml(String& response)
String version = "&nbsp;"; String version = "&nbsp;";
version.concat(nuki_hub_version); version.concat(nuki_hub_version);
char lockstateArr[20];
NukiLock::lockstateToString(_nuki->keyTurnerState().lockState, lockstateArr);
String lockState = "&nbsp;";
lockState.concat(lockstateArr);
response.concat("<table>"); response.concat("<table>");
printParameter(response, "Paired", _nuki->isPaired() ? "&nbsp;Yes" : "&nbsp;No");
bool lockEnabled = _preferences->getBool(preference_lock_enabled);
String lockState = "&nbsp;";
if(lockEnabled)
{
char lockstateArr[20];
NukiLock::lockstateToString(_nuki->keyTurnerState().lockState, lockstateArr);
lockState.concat(lockstateArr);
printParameter(response, "Paired", _nuki->isPaired() ? "&nbsp;Yes" : "&nbsp;No");
}
printParameter(response, "MQTT Connected", _network->isMqttConnected() ? "&nbsp;Yes" : "&nbsp;No"); printParameter(response, "MQTT Connected", _network->isMqttConnected() ? "&nbsp;Yes" : "&nbsp;No");
printParameter(response, "Lock state", lockState.c_str()); if(lockEnabled)
{
printParameter(response, "Lock state", lockState.c_str());
}
printParameter(response, "Firmware", version.c_str()); printParameter(response, "Firmware", version.c_str());
response.concat("</table><br><br>"); response.concat("</table><br><br>");
@@ -282,8 +312,16 @@ void WebCfgServer::buildHtml(String& response)
printInputField(response, "MQTTPORT", "MQTT Broker port", _preferences->getInt(preference_mqtt_broker_port), 5); printInputField(response, "MQTTPORT", "MQTT Broker port", _preferences->getInt(preference_mqtt_broker_port), 5);
printInputField(response, "MQTTUSER", "MQTT User (# to clear)", _preferences->getString(preference_mqtt_user).c_str(), 30); printInputField(response, "MQTTUSER", "MQTT User (# to clear)", _preferences->getString(preference_mqtt_user).c_str(), 30);
printInputField(response, "MQTTPASS", "MQTT Password", "*", 30, true); printInputField(response, "MQTTPASS", "MQTT Password", "*", 30, true);
printInputField(response, "MQTTPATH", "MQTT Lock Path", _preferences->getString(preference_mqtt_lock_path).c_str(), 180); printCheckBox(response, "LOCKENA", "NUKI Lock enabled", _preferences->getBool(preference_lock_enabled));
printInputField(response, "MQTTOPPATH", "MQTT Opener Path", _preferences->getString(preference_mqtt_opener_path).c_str(), 180); if(_preferences->getBool(preference_lock_enabled))
{
printInputField(response, "MQTTPATH", "MQTT Lock Path", _preferences->getString(preference_mqtt_lock_path).c_str(), 180);
}
printCheckBox(response, "OPENA", "NUKI Opener enabled", _preferences->getBool(preference_opener_enabled));
if(_preferences->getBool(preference_opener_enabled))
{
printInputField(response, "MQTTOPPATH", "MQTT Opener Path", _preferences->getString(preference_mqtt_opener_path).c_str(), 180);
}
printInputField(response, "HOSTNAME", "Host name", _preferences->getString(preference_hostname).c_str(), 100); printInputField(response, "HOSTNAME", "Host name", _preferences->getString(preference_hostname).c_str(), 100);
printInputField(response, "NETTIMEOUT", "Network Timeout until restart (seconds; -1 to disable)", _preferences->getInt(preference_network_timeout), 5); printInputField(response, "NETTIMEOUT", "Network Timeout until restart (seconds; -1 to disable)", _preferences->getInt(preference_network_timeout), 5);
printInputField(response, "LSTINT", "Query interval lock state (seconds)", _preferences->getInt(preference_query_interval_lockstate), 10); printInputField(response, "LSTINT", "Query interval lock state (seconds)", _preferences->getInt(preference_query_interval_lockstate), 10);
@@ -413,7 +451,10 @@ void WebCfgServer::processUnpair()
buildConfirmHtml(response, "Unpairing NUKI and restarting.", 3); buildConfirmHtml(response, "Unpairing NUKI and restarting.", 3);
_server.send(200, "text/html", response); _server.send(200, "text/html", response);
_nuki->unpair(); if(_nuki != nullptr)
{
_nuki->unpair();
}
waitAndProcess(false, 1000); waitAndProcess(false, 1000);
ESP.restart(); ESP.restart();
} }

View File

@@ -13,12 +13,16 @@
Network* network = nullptr; Network* network = nullptr;
NetworkOpener* networkOpener = nullptr; NetworkOpener* networkOpener = nullptr;
WebCfgServer* webCfgServer = nullptr; WebCfgServer* webCfgServer = nullptr;
BleScanner::Scanner* bleScanner = nullptr;
NukiWrapper* nuki = nullptr; NukiWrapper* nuki = nullptr;
NukiOpenerWrapper* nukiOpener = nullptr; NukiOpenerWrapper* nukiOpener = nullptr;
PresenceDetection* presenceDetection = nullptr; PresenceDetection* presenceDetection = nullptr;
Preferences* preferences = nullptr; Preferences* preferences = nullptr;
EthServer* ethServer = nullptr; EthServer* ethServer = nullptr;
bool lockEnabled = false;
bool openerEnabled = false;
void networkTask(void *pvParameters) void networkTask(void *pvParameters)
{ {
while(true) while(true)
@@ -34,8 +38,16 @@ void nukiTask(void *pvParameters)
{ {
while(true) while(true)
{ {
nuki->update(); bleScanner->update();
nukiOpener->update(); vTaskDelay( 20 / portTICK_PERIOD_MS);
if(lockEnabled)
{
nuki->update();
}
if(openerEnabled)
{
nukiOpener->update();
}
} }
} }
@@ -101,17 +113,29 @@ void initEthServer(const NetworkDeviceType device)
} }
} }
void initNuki()
{
}
void setup() void setup()
{ {
pinMode(NETWORK_SELECT, INPUT_PULLUP); pinMode(NETWORK_SELECT, INPUT_PULLUP);
Serial.begin(115200); Serial.begin(115200);
preferences = new Preferences();
preferences->begin("nukihub", false);
if(!preferences->getBool(preference_started_befores))
{
preferences->putBool(preference_started_befores, true);
preferences->putBool(preference_lock_enabled, true);
}
// const NetworkDeviceType networkDevice = NetworkDeviceType::WiFi; // const NetworkDeviceType networkDevice = NetworkDeviceType::WiFi;
const NetworkDeviceType networkDevice = digitalRead(NETWORK_SELECT) == HIGH ? NetworkDeviceType::WiFi : NetworkDeviceType::W5500; const NetworkDeviceType networkDevice = digitalRead(NETWORK_SELECT) == HIGH ? NetworkDeviceType::WiFi : NetworkDeviceType::W5500;
preferences = new Preferences();
preferences->begin("nukihub", false);
network = new Network(networkDevice, preferences); network = new Network(networkDevice, preferences);
network->initialize(); network->initialize();
networkOpener = new NetworkOpener(network, preferences); networkOpener = new NetworkOpener(network, preferences);
@@ -126,16 +150,30 @@ void setup()
initEthServer(networkDevice); initEthServer(networkDevice);
nuki = new NukiWrapper("NukiHub", deviceId, network, preferences); bleScanner = new BleScanner::Scanner();
nuki->initialize(); bleScanner->initialize("NukiHub");
bleScanner->setScanDuration(10);
nukiOpener = new NukiOpenerWrapper("NukiHub", deviceId, nuki->bleScanner(), networkOpener, preferences); lockEnabled = preferences->getBool(preference_lock_enabled);
nukiOpener->initialize(); Serial.println(lockEnabled ? F("NUKI Lock enabled") : F("NUKI Lock disabled"));
if(lockEnabled)
{
nuki = new NukiWrapper("NukiHub", deviceId, bleScanner, network, preferences);
nuki->initialize();
}
openerEnabled = preferences->getBool(preference_opener_enabled);
Serial.println(openerEnabled ? F("NUKI Opener enabled") : F("NUKI Opener disabled"));
if(openerEnabled)
{
nukiOpener = new NukiOpenerWrapper("NukiHub", deviceId, bleScanner, networkOpener, preferences);
nukiOpener->initialize();
}
webCfgServer = new WebCfgServer(nuki, network, ethServer, preferences, networkDevice == NetworkDeviceType::WiFi); webCfgServer = new WebCfgServer(nuki, network, ethServer, preferences, networkDevice == NetworkDeviceType::WiFi);
webCfgServer->initialize(); webCfgServer->initialize();
presenceDetection = new PresenceDetection(preferences, nuki->bleScanner(), network); presenceDetection = new PresenceDetection(preferences, bleScanner, network);
presenceDetection->initialize(); presenceDetection->initialize();
setupTasks(); setupTasks();