diff --git a/Network.cpp b/Network.cpp index b1dd720..023c0b2 100644 --- a/Network.cpp +++ b/Network.cpp @@ -44,7 +44,7 @@ void Network::initialize() const char* brokerAddr = _preferences->getString(preference_mqtt_broker).c_str(); strcpy(_mqttBrokerAddr, brokerAddr); - Serial.print("MQTT Broker: "); + Serial.print(F("MQTT Broker: ")); Serial.println(_mqttBrokerAddr); _mqttClient.setServer(_mqttBrokerAddr, 1883); _mqttClient.setCallback(Network::onMqttDataReceivedCallback); @@ -116,7 +116,7 @@ void Network::onMqttDataReceived(char *&topic, byte *&payload, unsigned int &len { if(strcmp(value, "") == 0) return; - Serial.print("lockstate setpoint received: "); + Serial.print(F("Lockstate action received: ")); Serial.println(value); if(_lockActionReceivedCallback != NULL) { diff --git a/Nuki.cpp b/Nuki.cpp index 46bcbda..a5b0c32 100644 --- a/Nuki.cpp +++ b/Nuki.cpp @@ -1,11 +1,13 @@ #include "Nuki.h" #include +#include "PreferencesKeys.h" Nuki* nukiInst; -Nuki::Nuki(const std::string& name, uint32_t id, Network* network) +Nuki::Nuki(const std::string& name, uint32_t id, Network* network, Preferences* preferences) : _nukiBle(name, id), - _network(network) + _network(network), + _preferences(preferences) { nukiInst = this; @@ -20,6 +22,25 @@ Nuki::Nuki(const std::string& name, uint32_t id, Network* network) void Nuki::initialize() { _nukiBle.initialize(); + + _intervalLockstate = _preferences->getInt(preference_query_interval_lockstate); + _intervalBattery = _preferences->getInt(preference_query_interval_battery); + + if(_intervalLockstate == 0) + { + _intervalLockstate = 30; + _preferences->putInt(preference_query_interval_lockstate, _intervalLockstate); + } + if(_intervalBattery == 0) + { + _intervalBattery = 60 * 30; + _preferences->putInt(preference_query_interval_battery, _intervalBattery); + } + + Serial.print(F("Lock state interval: ")); + Serial.print(_intervalLockstate); + Serial.print(F("| Battery interval: ")); + Serial.println(_intervalBattery); } void Nuki::update() @@ -44,35 +65,33 @@ void Nuki::update() if(_nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs) { - _nextLockStateUpdateTs = ts + 5000; + _nextLockStateUpdateTs = ts + _intervalLockstate * 1000; updateKeyTurnerState(); } if(_nextBatteryReportTs == 0 || ts > _nextBatteryReportTs) { - _nextBatteryReportTs = ts + 60000 * 5; + _nextBatteryReportTs = ts + _intervalBattery * 1000; updateBatteryState(); } if(_nextLockAction != (LockAction)0xff) { _nukiBle.lockAction(_nextLockAction, 0, 0); _nextLockAction = (LockAction)0xff; -// _nextLockStateUpdateTs = ts + 11000; } } - void Nuki::updateKeyTurnerState() { _nukiBle.requestKeyTurnerState(&_keyTurnerState); char str[20]; lockstateToString(_keyTurnerState.lockState, str); - Serial.print(F("Nuki lock state: ")); - Serial.println(str); if(_keyTurnerState.lockState != _lastKeyTurnerState.lockState) { _network->publishKeyTurnerState(str); + Serial.print(F("Nuki lock state: ")); + Serial.println(str); } memcpy(&_lastKeyTurnerState, &_keyTurnerState, sizeof(KeyTurnerState)); @@ -83,12 +102,12 @@ void Nuki::updateBatteryState() { _nukiBle.requestBatteryReport(&_batteryReport); - Serial.print("Voltage: "); Serial.println(_batteryReport.batteryVoltage); - Serial.print("Drain: "); Serial.println(_batteryReport.batteryDrain); - Serial.print("Resistance: "); Serial.println(_batteryReport.batteryResistance); - Serial.print("Max Current: "); Serial.println(_batteryReport.maxTurnCurrent); - Serial.print("Crit. State: "); Serial.println(_batteryReport.criticalBatteryState); - Serial.print("Lock Dist: "); Serial.println(_batteryReport.lockDistance); + Serial.print(F("Voltage: ")); Serial.println(_batteryReport.batteryVoltage); + Serial.print(F("Drain: ")); Serial.println(_batteryReport.batteryDrain); + Serial.print(F("Resistance: ")); Serial.println(_batteryReport.batteryResistance); + Serial.print(F("Max Current: ")); Serial.println(_batteryReport.maxTurnCurrent); + Serial.print(F("Crit. State: ")); Serial.println(_batteryReport.criticalBatteryState); + Serial.print(F("Lock Dist: ")); Serial.println(_batteryReport.lockDistance); _network->publishBatteryVoltage((float)_batteryReport.batteryVoltage / (float)1000); } @@ -152,6 +171,6 @@ LockAction Nuki::lockActionToEnum(const char *str) void Nuki::onLockActionReceived(const char *value) { nukiInst->_nextLockAction = nukiInst->lockActionToEnum(value); - Serial.print("Action: "); + Serial.print(F("Action: ")); Serial.println((int)nukiInst->_nextLockAction); } diff --git a/Nuki.h b/Nuki.h index 8e2e549..41c3ef7 100644 --- a/Nuki.h +++ b/Nuki.h @@ -7,7 +7,7 @@ class Nuki { public: - Nuki(const std::string& name, uint32_t id, Network* network); + Nuki(const std::string& name, uint32_t id, Network* network, Preferences* preferences); void initialize(); void update(); @@ -23,6 +23,9 @@ private: NukiBle _nukiBle; Network* _network; + Preferences* _preferences; + int _intervalLockstate = 0; // seconds + int _intervalBattery = 0; // seconds KeyTurnerState _lastKeyTurnerState; KeyTurnerState _keyTurnerState; diff --git a/PreferencesKeys.h b/PreferencesKeys.h index ca4685a..59290ec 100644 --- a/PreferencesKeys.h +++ b/PreferencesKeys.h @@ -1,3 +1,8 @@ #pragma once -#define preference_mqtt_broker "mqttbroker" \ No newline at end of file +#define preference_mqtt_broker "mqttbroker" +#define preference_query_interval_lockstate "lockStInterval" +#define preference_query_interval_battery "batInterval" + + + diff --git a/WebCfgServer.cpp b/WebCfgServer.cpp index 9e3e338..e2823c5 100644 --- a/WebCfgServer.cpp +++ b/WebCfgServer.cpp @@ -61,12 +61,21 @@ void WebCfgServer::update() TokenType lastTokenType = getParameterType(lastToken); TokenType tokenType = getParameterType(token); - if(lastTokenType == TokenType::MQTT_SERVER && tokenType == TokenType::NONE) + if(lastTokenType == TokenType::MqttServer && tokenType == TokenType::None) { - configChanged = true; _preferences->putString(preference_mqtt_broker, token); configChanged = true; } + else if(lastTokenType == TokenType::QueryIntervalLockstate && tokenType == TokenType::None) + { + _preferences->putInt(preference_query_interval_lockstate, String(token).toInt()); + configChanged = true; + } + else if(lastTokenType == TokenType::QueryIntervalBattery && tokenType == TokenType::None) + { + _preferences->putInt(preference_query_interval_battery, String(token).toInt()); + configChanged = true; + } } lastToken = token; token = strtok(NULL, "?=&"); @@ -104,25 +113,13 @@ void WebCfgServer::serveHtml(WiFiClient &client) client.print(_preferences->getString(preference_mqtt_broker)); client.println("\" NAME=\"MQTTSERVER\" SIZE=\"25\" MAXLENGTH=\"40\">
"); -// client.print("DNS Server: dnsServerAddress); -// client.println("\" NAME=\"DNSSERVER\" SIZE=\"25\" MAXLENGTH=\"16\">
"); -// -// client.print("Gateway: gatewayAddress); -// client.println("\" NAME=\"GATEWAY\" SIZE=\"25\" MAXLENGTH=\"16\">
"); -// -// client.print("IP Address: ipAddress); -// client.println("\" NAME=\"IPADDRESS\" SIZE=\"25\" MAXLENGTH=\"16\">
"); -// -// client.print("Subnet mask: subnetMask); -// client.println("\" NAME=\"SUBNET\" SIZE=\"25\" MAXLENGTH=\"16\">
"); -// -// client.print("MQTT publish interval (ms): mqttPublishInterval); -// client.println("\" NAME=\"INTERVAL\" SIZE=\"25\" MAXLENGTH=\"6\">
"); + client.print("Query interval lock state (seconds): getInt(preference_query_interval_lockstate)); + client.println("\" NAME=\"LSTINT\" SIZE=\"25\" MAXLENGTH=\"16\">
"); + + client.print("Query interval battery (seconds): getInt(preference_query_interval_battery)); + client.println("\" NAME=\"BATINT\" SIZE=\"25\" MAXLENGTH=\"16\">
"); client.println(""); @@ -132,17 +129,22 @@ void WebCfgServer::serveHtml(WiFiClient &client) client.println(""); client.println(""); - - - } TokenType WebCfgServer::getParameterType(char *&token) { if (strcmp(token, "MQTTSERVER") == 0) { - return TokenType::MQTT_SERVER; + return TokenType::MqttServer; + } + if (strcmp(token, "LSTINT") == 0) + { + return TokenType::QueryIntervalLockstate; + } + if (strcmp(token, "BATINT") == 0) + { + return TokenType::QueryIntervalBattery; } - return TokenType::NONE; + return TokenType::None; } diff --git a/WebCfgServer.h b/WebCfgServer.h index 4526607..3b9ff7b 100644 --- a/WebCfgServer.h +++ b/WebCfgServer.h @@ -5,8 +5,10 @@ enum class TokenType { - NONE, - MQTT_SERVER, + None, + MqttServer, + QueryIntervalLockstate, + QueryIntervalBattery, }; class WebCfgServer @@ -21,6 +23,7 @@ public: private: void serveHtml(WiFiClient& client); + TokenType getParameterType(char*& token); WiFiServer _wifiServer; diff --git a/main.cpp b/main.cpp index 9b18718..008b2bf 100644 --- a/main.cpp +++ b/main.cpp @@ -40,7 +40,7 @@ void setup() preferences->begin("nukihub", false); network = new Network(preferences); webCfgServer = new WebCfgServer(preferences); - nuki = new Nuki("Main Door", 2020001, network); + nuki = new Nuki("Main Door", 2020001, network, preferences); network->initialize(); webCfgServer->initialize();