From b4607909fed6c109abf4fea72a9088d0e8cb3cbe Mon Sep 17 00:00:00 2001 From: technyon Date: Sun, 29 Jan 2023 11:28:55 +0100 Subject: [PATCH] publish HA auto discovery for door sensor only if keypad connected --- NetworkLock.cpp | 7 +++++-- NetworkLock.h | 2 +- NukiWrapper.cpp | 11 ++++++++++- NukiWrapper.h | 2 ++ 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/NetworkLock.cpp b/NetworkLock.cpp index 7665500..8450946 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -468,12 +468,15 @@ 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, const bool& hasKeypad, char *lockAction, +void NetworkLock::publishHASSConfig(char *deviceType, const char *baseTopic, char *name, char *uidString, const bool& hasDoorSensor, const bool& hasKeypad, char *lockAction, char *unlockAction, char *openAction, char *lockedState, char *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); + if(hasDoorSensor) + { + _network->publishHASSConfigDoorSensor(deviceType, baseTopic, name, uidString, lockAction, unlockAction, openAction, lockedState, unlockedState); + } _network->publishHASSWifiRssiConfig(deviceType, baseTopic, name, uidString); _network->publishHASSBleRssiConfig(deviceType, baseTopic, name, uidString); } diff --git a/NetworkLock.h b/NetworkLock.h index 7f41d49..0b00831 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, const bool& hasKeypad, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState); + void publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& hasDoorSensor, 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/NukiWrapper.cpp b/NukiWrapper.cpp index 2a81d32..7c72a76 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -599,12 +599,21 @@ 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, _hasKeypad, "lock", "unlock", "unlatch", "locked", "unlocked"); + + _network->publishHASSConfig("SmartLock", baseTopic.c_str(),(char*)_nukiConfig.name, uidString, _hasKeypad, hasDoorSensor(), "lock", "unlock", "unlatch", "locked", "unlocked"); _hassSetupCompleted = true; Log->println("HASS setup for lock completed."); } +bool NukiWrapper::hasDoorSensor() +{ + return _keyTurnerState.doorSensorState == Nuki::DoorSensorState::DoorClosed || + _keyTurnerState.doorSensorState == Nuki::DoorSensorState::DoorOpened || + _keyTurnerState.doorSensorState == Nuki::DoorSensorState::DoorStateUnknown || + _keyTurnerState.doorSensorState == Nuki::DoorSensorState::Calibrating;; +} + void NukiWrapper::disableHASS() { if(!_nukiConfigValid) // only ask for config once to save battery life diff --git a/NukiWrapper.h b/NukiWrapper.h index 051bd66..6a6e758 100644 --- a/NukiWrapper.h +++ b/NukiWrapper.h @@ -49,6 +49,8 @@ private: void setupHASS(); + bool hasDoorSensor(); + NukiLock::LockAction lockActionToEnum(const char* str); // char array at least 14 characters std::string _deviceName;