From 3111c59e0b6809a12bd321a6fc7674edf4dd2698 Mon Sep 17 00:00:00 2001 From: technyon Date: Sat, 9 Apr 2022 13:20:53 +0200 Subject: [PATCH] publish first config values via mqtt --- MqttTopics.h | 4 ++++ Network.cpp | 38 +++++++++++++++++++++++++++----------- Network.h | 3 +++ NukiWrapper.cpp | 20 ++++++++++++++++++++ NukiWrapper.h | 8 ++++++++ 5 files changed, 62 insertions(+), 11 deletions(-) diff --git a/MqttTopics.h b/MqttTopics.h index c608d7d..685b599 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -14,4 +14,8 @@ #define mqtt_topic_door_sensor_state "/lock/doorSensorState" #define mqtt_topic_lockstate_action "/lock/action" +#define mqtt_topic_config_button_enabled "/configuration/buttonEnabled" +#define mqtt_topic_config_led_enabled "/configuration/ledEnabled" +#define mqtt_topic_config_led_brightness "/configuration/ledBrightness" + #define mqtt_topic_presence "/presence/devices" diff --git a/Network.cpp b/Network.cpp index 54a2dc2..b0f75ce 100644 --- a/Network.cpp +++ b/Network.cpp @@ -128,10 +128,10 @@ bool Network::reconnect() Serial.println(F("MQTT connected")); _mqttConnected = true; delay(200); - char path[200] = {0}; - buildMqttPath(mqtt_topic_lockstate_action, path); - // ... and resubscribe - _mqttClient.subscribe(path); + subscribe(mqtt_topic_lockstate_action); + subscribe(mqtt_topic_config_button_enabled); + subscribe(mqtt_topic_config_led_enabled); + subscribe(mqtt_topic_config_led_brightness); } else { @@ -177,7 +177,7 @@ void Network::onMqttDataReceivedCallback(char *topic, byte *payload, unsigned in void Network::onMqttDataReceived(char *&topic, byte *&payload, unsigned int &length) { - char value[50]; + char value[50] = {0}; size_t l = min(length, sizeof(value)-1); for(int i=0; i _nextConfigUpdateTs) + { + _nextConfigUpdateTs = ts + _intervalConfig * 1000; + updateConfig(); + } + if(_nextLockAction != (Nuki::LockAction)0xff) { _nukiBle.lockAction(_nextLockAction, 0, 0); @@ -136,6 +142,12 @@ void NukiWrapper::updateBatteryState() _network->publishBatteryReport(_batteryReport); } +void NukiWrapper::updateConfig() +{ + readConfig(); + _network->publishConfig(_nukiConfig); +} + Nuki::LockAction NukiWrapper::lockActionToEnum(const char *str) { if(strcmp(str, "unlock") == 0) return Nuki::LockAction::Unlock; @@ -177,3 +189,11 @@ void NukiWrapper::notify(Nuki::EventType eventType) _statusUpdated = true; } } + +void NukiWrapper::readConfig() +{ + Serial.print(F("Reading config. Result: ")); + Nuki::CmdResult result = _nukiBle.requestConfig(&_nukiConfig); + _nukiConfigValid = result == Nuki::CmdResult::Success; + Serial.println(result); +} diff --git a/NukiWrapper.h b/NukiWrapper.h index 7870edd..deef33b 100644 --- a/NukiWrapper.h +++ b/NukiWrapper.h @@ -26,6 +26,9 @@ private: void updateKeyTurnerState(); void updateBatteryState(); + void updateConfig(); + + void readConfig(); Nuki::LockAction lockActionToEnum(const char* str); // char array at least 14 characters @@ -36,6 +39,7 @@ private: Preferences* _preferences; int _intervalLockstate = 0; // seconds int _intervalBattery = 0; // seconds + int _intervalConfig = 60 * 60; // seconds Nuki::KeyTurnerState _lastKeyTurnerState; Nuki::KeyTurnerState _keyTurnerState; @@ -43,10 +47,14 @@ private: Nuki::BatteryReport _batteryReport; Nuki::BatteryReport _lastBatteryReport; + Nuki::Config _nukiConfig = {0}; + bool _nukiConfigValid = false; + bool _paired = false; bool _statusUpdated = false; unsigned long _nextLockStateUpdateTs = 0; unsigned long _nextBatteryReportTs = 0; + unsigned long _nextConfigUpdateTs = 0; unsigned long _nextPairTs = 0; Nuki::LockAction _nextLockAction = (Nuki::LockAction)0xff; };