allow to enabld or disable lock/opener
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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("<table>");
|
||||
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("</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, "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();
|
||||
}
|
||||
|
||||
56
main.cpp
56
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();
|
||||
|
||||
Reference in New Issue
Block a user