From 66ed2cdbd6c84b8f9b80b8f433441a8ae0ae281b Mon Sep 17 00:00:00 2001 From: technyon Date: Sun, 29 Jan 2023 11:14:38 +0100 Subject: [PATCH] publish HA auto discovery for keypad only if keypad connected --- Network.cpp | 48 +++++++++++++++++++++++++---------------------- Network.h | 2 +- NetworkLock.cpp | 4 ++-- NetworkLock.h | 2 +- NetworkOpener.cpp | 2 +- NukiWrapper.cpp | 2 +- 6 files changed, 32 insertions(+), 28 deletions(-) diff --git a/Network.cpp b/Network.cpp index 703a380..030fade 100644 --- a/Network.cpp +++ b/Network.cpp @@ -450,7 +450,7 @@ bool Network::publishString(const char* prefix, const char *topic, const char *v return _device->mqttPublish(path, MQTT_QOS_LEVEL, true, value) > 0; } -void Network::publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState) +void Network::publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& hasKeypad, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState) { String discoveryTopic = _preferences->getString(preference_mqtt_hass_discovery); @@ -515,29 +515,33 @@ void Network::publishHASSConfig(char* deviceType, const char* baseTopic, char* n _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, configJSON.c_str()); - // Keypad battery critical - configJSON = "{\"dev\":{\"ids\":[\"nuki_"; - configJSON.concat(uidString); - configJSON.concat("\"],\"mf\":\"Nuki\",\"mdl\":\""); - configJSON.concat(deviceType); - configJSON.concat("\",\"name\":\""); - configJSON.concat(name); - configJSON.concat("\"},\"~\":\""); - configJSON.concat(baseTopic); - configJSON.concat("\",\"name\":\""); - configJSON.concat(name); - configJSON.concat(" keypad battery low\",\"unique_id\":\""); - configJSON.concat(uidString); - configJSON.concat("_keypad_battery_low\",\"dev_cla\":\"battery\",\"ent_cat\":\"diagnostic\",\"pl_off\":\"0\",\"pl_on\":\"1\",\"stat_t\":\"~"); - configJSON.concat(mqtt_topic_battery_keypad_critical); - configJSON.concat("\"}"); + if(hasKeypad) + { + // Keypad battery critical + configJSON = "{\"dev\":{\"ids\":[\"nuki_"; + configJSON.concat(uidString); + configJSON.concat("\"],\"mf\":\"Nuki\",\"mdl\":\""); + configJSON.concat(deviceType); + configJSON.concat("\",\"name\":\""); + configJSON.concat(name); + configJSON.concat("\"},\"~\":\""); + configJSON.concat(baseTopic); + configJSON.concat("\",\"name\":\""); + configJSON.concat(name); + configJSON.concat(" keypad battery low\",\"unique_id\":\""); + configJSON.concat(uidString); + configJSON.concat( + "_keypad_battery_low\",\"dev_cla\":\"battery\",\"ent_cat\":\"diagnostic\",\"pl_off\":\"0\",\"pl_on\":\"1\",\"stat_t\":\"~"); + configJSON.concat(mqtt_topic_battery_keypad_critical); + configJSON.concat("\"}"); - path = discoveryTopic; - path.concat("/binary_sensor/"); - path.concat(uidString); - path.concat("/keypad_battery_low/config"); + path = discoveryTopic; + path.concat("/binary_sensor/"); + path.concat(uidString); + path.concat("/keypad_battery_low/config"); - _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, configJSON.c_str()); + _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, configJSON.c_str()); + } // Battery voltage configJSON = "{\"dev\":{\"ids\":[\"nuki_"; diff --git a/Network.h b/Network.h index 6375b39..5baf16b 100644 --- a/Network.h +++ b/Network.h @@ -33,7 +33,7 @@ public: void publishBool(const char* prefix, const char* topic, const bool value); bool publishString(const char* prefix, const char* topic, const char* value); - void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); + void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& hasKeypad, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); void publishHASSConfigBatLevel(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); void publishHASSConfigDoorSensor(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); void publishHASSConfigRingDetect(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); diff --git a/NetworkLock.cpp b/NetworkLock.cpp index 6466a19..7665500 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -468,10 +468,10 @@ bool NetworkLock::comparePrefixedPath(const char *fullPath, const char *subPath) return strcmp(fullPath, prefixedPath) == 0; } -void NetworkLock::publishHASSConfig(char *deviceType, const char *baseTopic, char *name, char *uidString, char *lockAction, +void NetworkLock::publishHASSConfig(char *deviceType, const char *baseTopic, char *name, char *uidString, const bool& hasKeypad, char *lockAction, char *unlockAction, char *openAction, char *lockedState, char *unlockedState) { - _network->publishHASSConfig(deviceType, baseTopic, name, uidString, lockAction, unlockAction, openAction, lockedState, unlockedState); + _network->publishHASSConfig(deviceType, baseTopic, name, uidString, hasKeypad, lockAction, unlockAction, openAction, lockedState, unlockedState); _network->publishHASSConfigBatLevel(deviceType, baseTopic, name, uidString, lockAction, unlockAction, openAction, lockedState, unlockedState); _network->publishHASSConfigDoorSensor(deviceType, baseTopic, name, uidString, lockAction, unlockAction, openAction, lockedState, unlockedState); _network->publishHASSWifiRssiConfig(deviceType, baseTopic, name, uidString); diff --git a/NetworkLock.h b/NetworkLock.h index 1fffd3e..7f41d49 100644 --- a/NetworkLock.h +++ b/NetworkLock.h @@ -29,7 +29,7 @@ public: void publishRssi(const int& rssi); void publishRetry(const std::string& message); void publishBleAddress(const std::string& address); - void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); + void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& hasKeypad, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); void removeHASSConfig(char* uidString); void publishKeypad(const std::list& entries, uint maxKeypadCodeCount); void publishKeypadCommandResult(const char* result); diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index f55b07c..9fe4898 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -389,7 +389,7 @@ void NetworkOpener::publishBleAddress(const std::string &address) void NetworkOpener::publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState) { - _network->publishHASSConfig(deviceType, baseTopic, name, uidString, lockAction, unlockAction, openAction, lockedState, unlockedState); + _network->publishHASSConfig(deviceType, baseTopic, name, uidString, false, lockAction, unlockAction, openAction, lockedState, unlockedState); _network->publishHASSConfigRingDetect(deviceType, baseTopic, name, uidString, lockAction, unlockAction, openAction, lockedState, unlockedState); _network->publishHASSBleRssiConfig(deviceType, baseTopic, name, uidString); } diff --git a/NukiWrapper.cpp b/NukiWrapper.cpp index 12dec2f..2a81d32 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -599,7 +599,7 @@ void NukiWrapper::setupHASS() String baseTopic = _preferences->getString(preference_mqtt_lock_path); char uidString[20]; itoa(_nukiConfig.nukiId, uidString, 16); - _network->publishHASSConfig("SmartLock",baseTopic.c_str(),(char*)_nukiConfig.name,uidString,"lock","unlock","unlatch","locked","unlocked"); + _network->publishHASSConfig("SmartLock", baseTopic.c_str(),(char*)_nukiConfig.name, uidString, _hasKeypad, "lock", "unlock", "unlatch", "locked", "unlocked"); _hassSetupCompleted = true; Log->println("HASS setup for lock completed.");