From face4eb91ecf9a002679e70b90625e5cd69cfade Mon Sep 17 00:00:00 2001 From: technyon Date: Sun, 19 Mar 2023 21:30:05 +0100 Subject: [PATCH] add ha topic for last lock action sensor --- Config.h | 2 +- MqttTopics.h | 1 + Network.cpp | 25 ++++++++++++++++++++++--- Network.h | 3 ++- NetworkLock.cpp | 13 +++++++++++-- NetworkLock.h | 2 +- NetworkOpener.cpp | 11 ++++++++++- NetworkOpener.h | 2 +- NukiOpenerWrapper.cpp | 2 +- NukiWrapper.cpp | 2 +- 10 files changed, 51 insertions(+), 12 deletions(-) diff --git a/Config.h b/Config.h index 0e5992f..f9c63a0 100644 --- a/Config.h +++ b/Config.h @@ -1,6 +1,6 @@ #pragma once -#define NUKI_HUB_VERSION "8.18" +#define NUKI_HUB_VERSION "8.19-pre-1" #define MQTT_QOS_LEVEL 1 #define MQTT_CLEAN_SESSIONS false diff --git a/MqttTopics.h b/MqttTopics.h index f96b612..a002911 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -36,6 +36,7 @@ #define mqtt_topic_config_auto_lock "/configuration/autoLock" #define mqtt_topic_config_single_lock "/configuration/singleLock" #define mqtt_topic_config_sound_level "/configuration/soundLevel" +#define mqtt_topic_config_last_action_authorization "/configuration/lastActionAuthorizaton" #define mqtt_topic_info_hardware_version "/info/hardwareVersion" #define mqtt_topic_info_firmware_version "/info/firmwareVersion" diff --git a/Network.cpp b/Network.cpp index ab7d45d..8453f77 100644 --- a/Network.cpp +++ b/Network.cpp @@ -856,7 +856,7 @@ void Network::publishHASSConfigLedBrightness(char *deviceType, const char *baseT void Network::publishHASSConfigSoundLevel(char *deviceType, const char *baseTopic, char *name, char *uidString) { - publishHassTopic("number", + publishHassTopic("sensor", "sound_level", uidString, "_sound_level", @@ -874,6 +874,25 @@ void Network::publishHASSConfigSoundLevel(char *deviceType, const char *baseTopi { "max", "255" }}); } + +void Network::publishHASSConfigAccessLog(char *deviceType, const char *baseTopic, char *name, char *uidString) +{ + publishHassTopic("sensor", + "last_action_authorization", + uidString, + "_last_action_authorization", + "Last action authorization", + name, + baseTopic, + mqtt_topic_lock_log, + deviceType, + "", + "", + "diagnostic", + "", + { { "value_template", "{{ (value_json|selectattr('type', 'eq', 'LockAction')|selectattr('action', 'in', ['Lock', 'Unlock', 'Unlatch'])|first).authorizationName }}" }});} + + void Network::publishHASSWifiRssiConfig(char *deviceType, const char *baseTopic, char *name, char *uidString) { if(_device->signalStrength() == 127) @@ -1083,9 +1102,9 @@ void Network::removeHASSConfig(char* uidString) } } -void Network::removeHASSConfigDoorSensor(char *deviceType, const char *baseTopic, char *name, char *uidString) +void Network::removeHASSConfigTopic(char *deviceType, char *name, char *uidString) { - removeHassTopic("binary_sensor", "door_sensor", uidString); + removeHassTopic(deviceType, name, uidString); } void Network::publishPresenceDetection(char *csv) diff --git a/Network.h b/Network.h index 26218d0..9b1e839 100644 --- a/Network.h +++ b/Network.h @@ -46,10 +46,11 @@ public: void publishHASSConfigRingDetect(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSConfigLedBrightness(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSConfigSoundLevel(char* deviceType, const char* baseTopic, char* name, char* uidString); + void publishHASSConfigAccessLog(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSWifiRssiConfig(char* deviceType, const char* baseTopic, char* name, char* uidString); void publishHASSBleRssiConfig(char* deviceType, const char* baseTopic, char* name, char* uidString); void removeHASSConfig(char* uidString); - void removeHASSConfigDoorSensor(char* deviceType, const char* baseTopic, char* name, char* uidString); + void removeHASSConfigTopic(char* deviceType, char* name, char* uidString); void clearWifiFallback(); diff --git a/NetworkLock.cpp b/NetworkLock.cpp index 34845a1..5669aa8 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -515,7 +515,7 @@ 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& hasDoorSensor, const bool& hasKeypad, char *lockAction, +void NetworkLock::publishHASSConfig(char *deviceType, const char *baseTopic, char *name, char *uidString, const bool& hasDoorSensor, const bool& hasKeypad, const bool& publishAuthData, char *lockAction, char *unlockAction, char *openAction, char *lockedState, char *unlockedState) { _network->publishHASSConfig(deviceType, baseTopic, name, uidString, hasKeypad, lockAction, unlockAction, openAction, lockedState, unlockedState); @@ -527,10 +527,19 @@ void NetworkLock::publishHASSConfig(char *deviceType, const char *baseTopic, cha } else { - _network->removeHASSConfigDoorSensor(deviceType, baseTopic, name, uidString); + _network->removeHASSConfigTopic("binary_sensor", "door_sensor", uidString); } _network->publishHASSWifiRssiConfig(deviceType, baseTopic, name, uidString); _network->publishHASSBleRssiConfig(deviceType, baseTopic, name, uidString); + + if(publishAuthData) + { + _network->publishHASSConfigAccessLog(deviceType, baseTopic, name, uidString); + } + else + { + _network->removeHASSConfigTopic("sensor", "last_action_authorization", uidString); + } } void NetworkLock::removeHASSConfig(char *uidString) diff --git a/NetworkLock.h b/NetworkLock.h index d722d3d..d529fc5 100644 --- a/NetworkLock.h +++ b/NetworkLock.h @@ -31,7 +31,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& hasDoorSensor, 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, const bool& publishAuthData, 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 0650a5d..9241094 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -481,12 +481,21 @@ void NetworkOpener::publishBleAddress(const std::string &address) publishString(mqtt_topic_lock_address, address); } -void NetworkOpener::publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState) +void NetworkOpener::publishHASSConfig(char* deviceType, const char* baseTopic, char* name, char* uidString, const bool& publishAuthData, char* lockAction, char* unlockAction, char* openAction, char* lockedState, char* unlockedState) { _network->publishHASSConfig(deviceType, baseTopic, name, uidString, false, lockAction, unlockAction, openAction, lockedState, unlockedState); _network->publishHASSConfigRingDetect(deviceType, baseTopic, name, uidString); _network->publishHASSConfigSoundLevel(deviceType, baseTopic, name, uidString); _network->publishHASSBleRssiConfig(deviceType, baseTopic, name, uidString); + + if(publishAuthData) + { + _network->publishHASSConfigAccessLog(deviceType, baseTopic, name, uidString); + } + else + { + _network->removeHASSConfigTopic("sensor", "last_action_authorization", uidString); + } } void NetworkOpener::removeHASSConfig(char* uidString) diff --git a/NetworkOpener.h b/NetworkOpener.h index a868dcf..4853f84 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -31,7 +31,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& publishAuthData, 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/NukiOpenerWrapper.cpp b/NukiOpenerWrapper.cpp index 9bd9104..e7ade08 100644 --- a/NukiOpenerWrapper.cpp +++ b/NukiOpenerWrapper.cpp @@ -646,7 +646,7 @@ void NukiOpenerWrapper::setupHASS() String baseTopic = _preferences->getString(preference_mqtt_opener_path); char uidString[20]; itoa(_nukiConfig.nukiId, uidString, 16); - _network->publishHASSConfig("Opener",baseTopic.c_str(),(char*)_nukiConfig.name,uidString,"deactivateRTO","activateRTO","electricStrikeActuation","locked","unlocked"); + _network->publishHASSConfig("Opener",baseTopic.c_str(),(char*)_nukiConfig.name,uidString, _publishAuthData, "deactivateRTO","activateRTO","electricStrikeActuation","locked","unlocked"); _hassSetupCompleted = true; Log->println("HASS setup for opener completed."); diff --git a/NukiWrapper.cpp b/NukiWrapper.cpp index 35d828a..24ac52a 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -661,7 +661,7 @@ void NukiWrapper::setupHASS() char uidString[20]; itoa(_nukiConfig.nukiId, uidString, 16); - _network->publishHASSConfig("SmartLock", baseTopic.c_str(),(char*)_nukiConfig.name, uidString, hasDoorSensor(), _hasKeypad, "lock", "unlock", "unlatch", "locked", "unlocked"); + _network->publishHASSConfig("SmartLock", baseTopic.c_str(),(char*)_nukiConfig.name, uidString, hasDoorSensor(), _hasKeypad, _publishAuthData,"lock", "unlock", "unlatch", "locked", "unlocked"); _hassSetupCompleted = true; Log->println("HASS setup for lock completed.");