From 4f442d7b1dc73ee438b2f2361c7f6882ac13b54a Mon Sep 17 00:00:00 2001 From: technyon Date: Sat, 2 Jul 2022 12:46:18 +0200 Subject: [PATCH] move publish presence detection to Network class --- Network.cpp | 24 +++++++++++++++++++++++- Network.h | 5 +++++ NetworkLock.cpp | 21 ++------------------- NetworkLock.h | 3 --- NetworkOpener.cpp | 12 ------------ NetworkOpener.h | 1 - PresenceDetection.cpp | 2 +- PresenceDetection.h | 6 +++--- main.cpp | 4 +--- 9 files changed, 35 insertions(+), 43 deletions(-) diff --git a/Network.cpp b/Network.cpp index 0dcbebc..fe644df 100644 --- a/Network.cpp +++ b/Network.cpp @@ -129,6 +129,17 @@ int Network::update() } } + if(_presenceCsv != nullptr && strlen(_presenceCsv) > 0) + { + bool success = publishString(_mqttPresencePrefix, mqtt_topic_presence, _presenceCsv); + if(!success) + { + Serial.println(F("Failed to publish presence CSV data.")); + Serial.println(_presenceCsv); + } + _presenceCsv = nullptr; + } + _device->mqttClient()->loop(); return 0; } @@ -233,6 +244,12 @@ void Network::reconfigureDevice() _device->reconfigure(); } +void Network::setMqttPresencePath(char *path) +{ + memset(_mqttPresencePrefix, 0, sizeof(_mqttPresencePrefix)); + strcpy(_mqttPresencePrefix, path); +} + bool Network::isMqttConnected() { return _mqttConnected; @@ -372,4 +389,9 @@ void Network::removeHASSConfig(char* uidString) _device->mqttClient()->publish(path.c_str(), NULL, 0U, true); } -} \ No newline at end of file +} + +void Network::publishPresenceDetection(char *csv) +{ + _presenceCsv = csv; +} diff --git a/Network.h b/Network.h index ee2e093..204c0b7 100644 --- a/Network.h +++ b/Network.h @@ -20,6 +20,7 @@ public: int update(); void registerMqttReceiver(MqttReceiver* receiver); void reconfigureDevice(); + void setMqttPresencePath(char* path); void subscribe(const char* prefix, const char* path); void publishFloat(const char* prefix, const char* topic, const float value, const uint8_t precision = 2); @@ -31,6 +32,8 @@ public: void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); void removeHASSConfig(char* uidString); + void publishPresenceDetection(char* csv); + PubSubClient* mqttClient(); bool isMqttConnected(); @@ -52,9 +55,11 @@ private: char _mqttBrokerAddr[101] = {0}; char _mqttUser[31] = {0}; char _mqttPass[31] = {0}; + char _mqttPresencePrefix[181] = {0}; std::vector _subscribedTopics; int _networkTimeout = 0; std::vector _mqttReceivers; + char* _presenceCsv = nullptr; unsigned long _lastConnectedTs = 0; }; diff --git a/NetworkLock.cpp b/NetworkLock.cpp index 06a4b4f..76f1360 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -40,6 +40,8 @@ void NetworkLock::initialize() _preferences->putString(preference_mqtt_lock_path, _mqttPath); } + _network->setMqttPresencePath(_mqttPath); + _network->subscribe(_mqttPath, mqtt_topic_lock_action); for(const auto& topic : _configTopics) { @@ -47,20 +49,6 @@ void NetworkLock::initialize() } } -void NetworkLock::update() -{ - if(_presenceCsv != nullptr && strlen(_presenceCsv) > 0) - { - bool success = publishString(mqtt_topic_presence, _presenceCsv); - if(!success) - { - Serial.println(F("Failed to publish presence CSV data.")); - Serial.println(_presenceCsv); - } - _presenceCsv = nullptr; - } -} - void NetworkLock::onMqttDataReceived(char *&topic, byte *&payload, unsigned int &length) { char value[50] = {0}; @@ -181,11 +169,6 @@ void NetworkLock::publishAdvancedConfig(const NukiLock::AdvancedConfig &config) publishBool(mqtt_topic_config_auto_lock, config.autoLockEnabled == 1); } -void NetworkLock::publishPresenceDetection(char *csv) -{ - _presenceCsv = csv; -} - void NetworkLock::setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char *)) { _lockActionReceivedCallback = lockActionReceivedCallback; diff --git a/NetworkLock.h b/NetworkLock.h index 3558b0b..b8226a4 100644 --- a/NetworkLock.h +++ b/NetworkLock.h @@ -18,7 +18,6 @@ public: virtual ~NetworkLock(); void initialize(); - void update(); void publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurnerState, const NukiLock::KeyTurnerState& lastKeyTurnerState); void publishAuthorizationInfo(const uint32_t authId, const char* authName); @@ -26,7 +25,6 @@ public: void publishBatteryReport(const NukiLock::BatteryReport& batteryReport); void publishConfig(const NukiLock::Config& config); void publishAdvancedConfig(const NukiLock::AdvancedConfig& config); - void publishPresenceDetection(char* csv); void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); void removeHASSConfig(char* uidString); @@ -51,7 +49,6 @@ private: Network* _network; Preferences* _preferences; - char* _presenceCsv = nullptr; std::vector _configTopics; char _mqttPath[181] = {0}; diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 2c5d88c..408c67f 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -38,18 +38,6 @@ void NetworkOpener::initialize() _network->registerMqttReceiver(this); } -void NetworkOpener::update() -{ - bool connected = _network->mqttClient()->connected(); - - if(!_isConnected && connected) - { - subscribe(mqtt_topic_lock_action); - } - - _isConnected = connected; -} - void NetworkOpener::onMqttDataReceived(char *&topic, byte *&payload, unsigned int &length) { char value[50] = {0}; diff --git a/NetworkOpener.h b/NetworkOpener.h index 7dcccb5..7eec66c 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -18,7 +18,6 @@ public: virtual ~NetworkOpener() = default; void initialize(); - void update(); void publishKeyTurnerState(const NukiOpener::OpenerState& keyTurnerState, const NukiOpener::OpenerState& lastKeyTurnerState); void publishAuthorizationInfo(const uint32_t authId, const char* authName); diff --git a/PresenceDetection.cpp b/PresenceDetection.cpp index 1b95e4e..681bcc0 100644 --- a/PresenceDetection.cpp +++ b/PresenceDetection.cpp @@ -1,7 +1,7 @@ #include "PresenceDetection.h" #include "PreferencesKeys.h" -PresenceDetection::PresenceDetection(Preferences* preferences, BleScanner::Scanner *bleScanner, NetworkLock* network) +PresenceDetection::PresenceDetection(Preferences* preferences, BleScanner::Scanner *bleScanner, Network* network) : _preferences(preferences), _bleScanner(bleScanner), _network(network) diff --git a/PresenceDetection.h b/PresenceDetection.h index 8dc82a0..6cc210c 100644 --- a/PresenceDetection.h +++ b/PresenceDetection.h @@ -2,7 +2,7 @@ #include "BleScanner.h" #include "BleInterfaces.h" -#include "NetworkLock.h" +#include "Network.h" struct PdDevice { @@ -18,7 +18,7 @@ struct PdDevice class PresenceDetection : public BleScanner::Subscriber { public: - PresenceDetection(Preferences* preferences, BleScanner::Scanner* bleScanner, NetworkLock* network); + PresenceDetection(Preferences* preferences, BleScanner::Scanner* bleScanner, Network* network); virtual ~PresenceDetection(); void initialize(); @@ -31,7 +31,7 @@ private: Preferences* _preferences; BleScanner::Scanner* _bleScanner; - NetworkLock* _network; + Network* _network; char* _csv = {0}; std::map _devices; int _timeout = 20000; diff --git a/main.cpp b/main.cpp index b5fdddd..daf9de3 100644 --- a/main.cpp +++ b/main.cpp @@ -36,8 +36,6 @@ void networkTask(void *pvParameters) // Network Device and MQTT is connected. Process all updates. case 0: network->update(); - networkLock->update(); - networkOpener->update(); webCfgServer->update(); break; case 1: @@ -210,7 +208,7 @@ void setup() webCfgServer = new WebCfgServer(nuki, nukiOpener, network, ethServer, preferences, networkDevice == NetworkDeviceType::WiFi); webCfgServer->initialize(); - presenceDetection = new PresenceDetection(preferences, bleScanner, networkLock); + presenceDetection = new PresenceDetection(preferences, bleScanner, network); presenceDetection->initialize(); setupTasks();