diff --git a/CMakeLists.txt b/CMakeLists.txt index ed3a719..6c774a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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, # 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} PRIVATE diff --git a/NukiWrapper.cpp b/NukiWrapper.cpp index 4c811e9..bd79123 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -6,8 +6,9 @@ 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), + _bleScanner(scanner), _nukiBle(deviceName, id), _network(network), _preferences(preferences) @@ -27,16 +28,13 @@ NukiWrapper::NukiWrapper(const std::string& deviceName, uint32_t id, Network* ne NukiWrapper::~NukiWrapper() { - delete _bleScanner; _bleScanner = nullptr; } void NukiWrapper::initialize() { - _bleScanner = new BleScanner::Scanner(); - _bleScanner->initialize(_deviceName); - _bleScanner->setScanDuration(10); + _nukiBle.initialize(); _nukiBle.registerBleScanner(_bleScanner); @@ -88,8 +86,6 @@ void NukiWrapper::update() } } - vTaskDelay( 20 / portTICK_PERIOD_MS); - _bleScanner->update(); _nukiBle.updateConnectionState(); unsigned long ts = millis(); @@ -304,11 +300,6 @@ const bool NukiWrapper::isPaired() return _paired; } -BleScanner::Scanner* NukiWrapper::bleScanner() -{ - return _bleScanner; -} - void NukiWrapper::notify(Nuki::EventType eventType) { if(eventType == Nuki::EventType::KeyTurnerStatusUpdated) diff --git a/NukiWrapper.h b/NukiWrapper.h index 122cee6..f6cc4c4 100644 --- a/NukiWrapper.h +++ b/NukiWrapper.h @@ -9,7 +9,7 @@ class NukiWrapper : public Nuki::SmartlockEventHandler { 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(); void initialize(); @@ -22,8 +22,6 @@ public: const NukiLock::KeyTurnerState& keyTurnerState(); const bool isPaired(); - BleScanner::Scanner* bleScanner(); - void notify(Nuki::EventType eventType) override; private: diff --git a/PreferencesKeys.h b/PreferencesKeys.h index f7253fe..8e48fc1 100644 --- a/PreferencesKeys.h +++ b/PreferencesKeys.h @@ -1,11 +1,14 @@ #pragma once +#define preference_started_befores "run" #define preference_deviceId "deviceId" #define preference_mqtt_broker "mqttbroker" #define preference_mqtt_broker_port "mqttport" #define preference_mqtt_user "mqttuser" #define preference_mqtt_password "mqttpass" +#define preference_lock_enabled "lockena" #define preference_mqtt_lock_path "mqttpath" +#define preference_opener_enabled "openerena" #define preference_mqtt_opener_path "mqttoppath" #define preference_hostname "hostname" #define preference_network_timeout "nettmout" diff --git a/WebCfgServer.cpp b/WebCfgServer.cpp index a6e7283..6711c56 100644 --- a/WebCfgServer.cpp +++ b/WebCfgServer.cpp @@ -108,6 +108,8 @@ bool WebCfgServer::processArgs(String& message) bool clearCredentials = false; bool publishAuthData = false; + bool lockEnabled = false; + bool openerEnabled = false; int count = _server.args(); for(int index = 0; index < count; index++) @@ -184,6 +186,14 @@ bool WebCfgServer::processArgs(String& message) { publishAuthData = true; } + else if(key == "LOCKENA") + { + lockEnabled = true; + } + else if(key == "OPENA") + { + openerEnabled = true; + } else if(key == "CREDUSER") { if(value == "#") @@ -201,7 +211,7 @@ bool WebCfgServer::processArgs(String& message) _preferences->putString(preference_cred_password, value); configChanged = true; } - else if(key == "NUKIPIN") + else if(key == "NUKIPIN" && _nuki != nullptr) { if(value == "#") { @@ -222,6 +232,18 @@ bool WebCfgServer::processArgs(String& message) 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) { _preferences->putString(preference_mqtt_user, ""); @@ -262,15 +284,23 @@ void WebCfgServer::buildHtml(String& response) String version = " "; version.concat(nuki_hub_version); - char lockstateArr[20]; - NukiLock::lockstateToString(_nuki->keyTurnerState().lockState, lockstateArr); - String lockState = " "; - lockState.concat(lockstateArr); - response.concat(""); - printParameter(response, "Paired", _nuki->isPaired() ? " Yes" : " No"); + + bool lockEnabled = _preferences->getBool(preference_lock_enabled); + + String lockState = " "; + if(lockEnabled) + { + char lockstateArr[20]; + NukiLock::lockstateToString(_nuki->keyTurnerState().lockState, lockstateArr); + lockState.concat(lockstateArr); + printParameter(response, "Paired", _nuki->isPaired() ? " Yes" : " No"); + } printParameter(response, "MQTT Connected", _network->isMqttConnected() ? " Yes" : " No"); - printParameter(response, "Lock state", lockState.c_str()); + if(lockEnabled) + { + printParameter(response, "Lock state", lockState.c_str()); + } printParameter(response, "Firmware", version.c_str()); response.concat("


"); @@ -282,8 +312,16 @@ void WebCfgServer::buildHtml(String& response) 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, "MQTTPASS", "MQTT Password", "*", 30, true); - printInputField(response, "MQTTPATH", "MQTT Lock Path", _preferences->getString(preference_mqtt_lock_path).c_str(), 180); - printInputField(response, "MQTTOPPATH", "MQTT Opener Path", _preferences->getString(preference_mqtt_opener_path).c_str(), 180); + printCheckBox(response, "LOCKENA", "NUKI Lock enabled", _preferences->getBool(preference_lock_enabled)); + 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, "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); @@ -413,7 +451,10 @@ void WebCfgServer::processUnpair() buildConfirmHtml(response, "Unpairing NUKI and restarting.", 3); _server.send(200, "text/html", response); - _nuki->unpair(); + if(_nuki != nullptr) + { + _nuki->unpair(); + } waitAndProcess(false, 1000); ESP.restart(); } diff --git a/main.cpp b/main.cpp index 9bde357..b4566bb 100644 --- a/main.cpp +++ b/main.cpp @@ -13,12 +13,16 @@ Network* network = nullptr; NetworkOpener* networkOpener = nullptr; WebCfgServer* webCfgServer = nullptr; +BleScanner::Scanner* bleScanner = nullptr; NukiWrapper* nuki = nullptr; NukiOpenerWrapper* nukiOpener = nullptr; PresenceDetection* presenceDetection = nullptr; Preferences* preferences = nullptr; EthServer* ethServer = nullptr; +bool lockEnabled = false; +bool openerEnabled = false; + void networkTask(void *pvParameters) { while(true) @@ -34,8 +38,16 @@ void nukiTask(void *pvParameters) { while(true) { - nuki->update(); - nukiOpener->update(); + bleScanner->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() { pinMode(NETWORK_SELECT, INPUT_PULLUP); 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 = digitalRead(NETWORK_SELECT) == HIGH ? NetworkDeviceType::WiFi : NetworkDeviceType::W5500; - preferences = new Preferences(); - preferences->begin("nukihub", false); network = new Network(networkDevice, preferences); network->initialize(); networkOpener = new NetworkOpener(network, preferences); @@ -126,16 +150,30 @@ void setup() initEthServer(networkDevice); - nuki = new NukiWrapper("NukiHub", deviceId, network, preferences); - nuki->initialize(); + bleScanner = new BleScanner::Scanner(); + bleScanner->initialize("NukiHub"); + bleScanner->setScanDuration(10); - nukiOpener = new NukiOpenerWrapper("NukiHub", deviceId, nuki->bleScanner(), networkOpener, preferences); - nukiOpener->initialize(); + lockEnabled = preferences->getBool(preference_lock_enabled); + 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->initialize(); - presenceDetection = new PresenceDetection(preferences, nuki->bleScanner(), network); + presenceDetection = new PresenceDetection(preferences, bleScanner, network); presenceDetection->initialize(); setupTasks();