From 1b0402cfe7a71e6b1cf0e4d907d61942eabcd130 Mon Sep 17 00:00:00 2001 From: rodriguezst <2828844+rodriguezst@users.noreply.github.com> Date: Tue, 21 Jun 2022 22:19:19 +0000 Subject: [PATCH] Remove retained MQTT messages when changing HASS config --- Network.cpp | 22 ++++++++++++++++++++++ Network.h | 1 + NetworkOpener.cpp | 5 +++++ NetworkOpener.h | 1 + NukiOpenerWrapper.cpp | 20 ++++++++++++++++++++ NukiOpenerWrapper.h | 2 ++ NukiWrapper.cpp | 20 ++++++++++++++++++++ NukiWrapper.h | 2 ++ WebCfgServer.cpp | 9 +++++++++ 9 files changed, 82 insertions(+) diff --git a/Network.cpp b/Network.cpp index 46a328b..a51776f 100644 --- a/Network.cpp +++ b/Network.cpp @@ -412,6 +412,28 @@ void Network::publishHASSConfig(char* deviceType, const char* baseTopic, char* n } } +void Network::removeHASSConfig(char* uidString) +{ + String discoveryTopic = _preferences->getString(preference_mqtt_hass_discovery); + + if(discoveryTopic != "") + { + String path = discoveryTopic; + path.concat("/lock/"); + path.concat(uidString); + path.concat("/smartlock/config"); + + _device->mqttClient()->publish(path.c_str(), NULL, 0U, true); + + path = discoveryTopic; + path.concat("/binary_sensor/"); + path.concat(uidString); + path.concat("/battery_low/config"); + + _device->mqttClient()->publish(path.c_str(), NULL, 0U, true); + } +} + void Network::setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char *)) { _lockActionReceivedCallback = lockActionReceivedCallback; diff --git a/Network.h b/Network.h index bef677a..3703e93 100644 --- a/Network.h +++ b/Network.h @@ -37,6 +37,7 @@ public: 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); void setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char* value)); void setConfigUpdateReceivedCallback(void (*configUpdateReceivedCallback)(const char* path, const char* value)); diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index ac90b88..6de71c1 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -171,6 +171,11 @@ void NetworkOpener::publishHASSConfig(char* deviceType, const char* baseTopic, c _network->publishHASSConfig(deviceType, baseTopic, name, uidString, lockAction, unlockAction, openAction, lockedState, unlockedState); } +void NetworkOpener::removeHASSConfig(char* uidString) +{ + _network->removeHASSConfig(uidString); +} + void NetworkOpener::setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char *)) { _lockActionReceivedCallback = lockActionReceivedCallback; diff --git a/NetworkOpener.h b/NetworkOpener.h index 5136786..ee15822 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -27,6 +27,7 @@ public: void publishConfig(const NukiOpener::Config& config); void publishAdvancedConfig(const NukiOpener::AdvancedConfig& config); 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 setLockActionReceivedCallback(bool (*lockActionReceivedCallback)(const char* value)); void setConfigUpdateReceivedCallback(void (*configUpdateReceivedCallback)(const char* path, const char* value)); diff --git a/NukiOpenerWrapper.cpp b/NukiOpenerWrapper.cpp index b88ed4e..dc3eb49 100644 --- a/NukiOpenerWrapper.cpp +++ b/NukiOpenerWrapper.cpp @@ -320,3 +320,23 @@ void NukiOpenerWrapper::setupHASS() Serial.println(F("Unable to setup HASS. Invalid config received.")); } } + +void NukiOpenerWrapper::disableHASS() +{ + if(!_nukiConfigValid) // only ask for config once to save battery life + { + Nuki::CmdResult result = _nukiOpener.requestConfig(&_nukiConfig); + _nukiConfigValid = result == Nuki::CmdResult::Success; + } + if (_nukiConfigValid) + { + String baseTopic = _preferences->getString(preference_mqtt_opener_path); + char uidString[20]; + itoa(_nukiConfig.nukiId, uidString, 16); + _network->removeHASSConfig(uidString); + } + else + { + Serial.println(F("Unable to disable HASS. Invalid config received.")); + } +} diff --git a/NukiOpenerWrapper.h b/NukiOpenerWrapper.h index 250e6f2..43b8c29 100644 --- a/NukiOpenerWrapper.h +++ b/NukiOpenerWrapper.h @@ -18,6 +18,8 @@ public: void setPin(const uint16_t pin); void unpair(); + + void disableHASS(); const NukiOpener::OpenerState& keyTurnerState(); const bool isPaired(); diff --git a/NukiWrapper.cpp b/NukiWrapper.cpp index 8478b03..32fec91 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -342,3 +342,23 @@ void NukiWrapper::setupHASS() Serial.println(F("Unable to setup HASS. Invalid config received.")); } } + +void NukiWrapper::disableHASS() +{ + if(!_nukiConfigValid) // only ask for config once to save battery life + { + Nuki::CmdResult result = _nukiLock.requestConfig(&_nukiConfig); + _nukiConfigValid = result == Nuki::CmdResult::Success; + } + if (_nukiConfigValid) + { + String baseTopic = _preferences->getString(preference_mqtt_lock_path); + char uidString[20]; + itoa(_nukiConfig.nukiId, uidString, 16); + _network->removeHASSConfig(uidString); + } + else + { + Serial.println(F("Unable to disable HASS. Invalid config received.")); + } +} diff --git a/NukiWrapper.h b/NukiWrapper.h index 8f8eaa6..5133db2 100644 --- a/NukiWrapper.h +++ b/NukiWrapper.h @@ -18,6 +18,8 @@ public: void setPin(const uint16_t pin); void unpair(); + + void disableHASS(); const NukiLock::KeyTurnerState& keyTurnerState(); const bool isPaired(); diff --git a/WebCfgServer.cpp b/WebCfgServer.cpp index 1ae7afc..4ec332c 100644 --- a/WebCfgServer.cpp +++ b/WebCfgServer.cpp @@ -227,6 +227,15 @@ bool WebCfgServer::processArgs(String& message) } else if(key == "HASSDISCOVERY") { + // Previous HASS config has to be disabled first (remove retained MQTT messages) + if ( _nuki != nullptr ) + { + _nuki->disableHASS(); + } + if ( _nukiOpener != nullptr ) + { + _nukiOpener->disableHASS(); + } _preferences->putString(preference_mqtt_hass_discovery, value); configChanged = true; }