diff --git a/MqttTopics.h b/MqttTopics.h index 138e370..04c089a 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -9,6 +9,7 @@ #define mqtt_topic_battery_lock_distance "/battery/lockDistance" #define mqtt_topic_lock_state "/lock/state" +#define mqtt_topic_lock_binary_state "/lock/binaryState" #define mqtt_topic_lock_trigger "/lock/trigger" #define mqtt_topic_lock_auth_id "/lock/authorizationId" #define mqtt_topic_lock_auth_name "/lock/authorizationName" diff --git a/Network.cpp b/Network.cpp index e669a7d..69bc1e5 100644 --- a/Network.cpp +++ b/Network.cpp @@ -365,7 +365,7 @@ void Network::publishHASSConfig(char* deviceType, const char* baseTopic, char* n configJSON.concat("\",\"pl_open\":\""); configJSON.concat(openAction); configJSON.concat("\",\"stat_t\":\"~"); - configJSON.concat(mqtt_topic_lock_state); + configJSON.concat(mqtt_topic_lock_binary_state); configJSON.concat("\",\"stat_locked\":\""); configJSON.concat(lockedState); configJSON.concat("\",\"stat_unlocked\":\""); diff --git a/NetworkLock.cpp b/NetworkLock.cpp index 7f705dd..d490465 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -43,6 +43,8 @@ void NetworkLock::initialize() _network->setMqttPresencePath(_mqttPath); + _haEnabled = _preferences->getString(preference_mqtt_hass_discovery) != ""; + _network->subscribe(_mqttPath, mqtt_topic_lock_action); for(const auto& topic : _configTopics) { @@ -117,6 +119,11 @@ void NetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurne memset(&str, 0, sizeof(str)); lockstateToString(keyTurnerState.lockState, str); publishString(mqtt_topic_lock_state, str); + + if(_haEnabled) + { + publishBinaryState(keyTurnerState.lockState); + } } if(_firstTunerStatePublish || keyTurnerState.trigger != lastKeyTurnerState.trigger) @@ -155,6 +162,27 @@ void NetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurne _firstTunerStatePublish = false; } +void NetworkLock::publishBinaryState(NukiLock::LockState lockState) +{ + switch(lockState) + { + case NukiLock::LockState::Locked: + case NukiLock::LockState::Locking: + publishString(mqtt_topic_lock_binary_state, "locked"); + break; + case NukiLock::LockState::Unlocked: + case NukiLock::LockState::Unlocking: + case NukiLock::LockState::Unlatched: + case NukiLock::LockState::Unlatching: + case NukiLock::LockState::UnlockedLnga: + publishString(mqtt_topic_lock_binary_state, "unlocked"); + break; + default: + break; + } +} + + void NetworkLock::publishAuthorizationInfo(const uint32_t authId, const char *authName) { publishUInt(mqtt_topic_lock_auth_id, authId); diff --git a/NetworkLock.h b/NetworkLock.h index 1af06c0..45b3234 100644 --- a/NetworkLock.h +++ b/NetworkLock.h @@ -20,6 +20,7 @@ public: void update(); void publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurnerState, const NukiLock::KeyTurnerState& lastKeyTurnerState); + void publishBinaryState(NukiLock::LockState lockState); void publishAuthorizationInfo(const uint32_t authId, const char* authName); void publishCommandResult(const char* resultStr); void publishBatteryReport(const NukiLock::BatteryReport& batteryReport); @@ -52,6 +53,7 @@ private: bool _firstTunerStatePublish = true; unsigned long _lastMaintenanceTs = 0; + bool _haEnabled= false; bool (*_lockActionReceivedCallback)(const char* value) = nullptr; void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr; diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 2b32f8f..3b2dab9 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -34,6 +34,8 @@ void NetworkOpener::initialize() _preferences->putString(preference_mqtt_opener_path, _mqttPath); } + _haEnabled = _preferences->getString(preference_mqtt_hass_discovery) != ""; + _network->subscribe(_mqttPath, mqtt_topic_lock_action); for(const auto& topic : _configTopics) { @@ -86,6 +88,11 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn memset(&str, 0, sizeof(str)); lockstateToString(keyTurnerState.lockState, str); publishString(mqtt_topic_lock_state, str); + + if(_haEnabled) + { + publishBinaryState(keyTurnerState.lockState); + } } if(_firstTunerStatePublish || keyTurnerState.trigger != lastKeyTurnerState.trigger) @@ -118,6 +125,23 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn _firstTunerStatePublish = false; } +void NetworkOpener::publishBinaryState(NukiOpener::LockState lockState) +{ + switch(lockState) + { + case NukiOpener::LockState::Locked: + case NukiOpener::LockState::RTOactive: + publishString(mqtt_topic_lock_binary_state, "locked"); + break; + case NukiOpener::LockState::Open: + case NukiOpener::LockState::Opening: + publishString(mqtt_topic_lock_binary_state, "unlocked"); + break; + default: + break; + } +} + void NetworkOpener::publishAuthorizationInfo(const uint32_t authId, const char *authName) { publishUInt(mqtt_topic_lock_auth_id, authId); @@ -224,4 +248,4 @@ bool NetworkOpener::comparePrefixedPath(const char *fullPath, const char *subPat char prefixedPath[500]; buildMqttPath(subPath, prefixedPath); return strcmp(fullPath, prefixedPath) == 0; -} \ No newline at end of file +} diff --git a/NetworkOpener.h b/NetworkOpener.h index 4dcc428..db90ee1 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -19,6 +19,7 @@ public: void initialize(); void publishKeyTurnerState(const NukiOpener::OpenerState& keyTurnerState, const NukiOpener::OpenerState& lastKeyTurnerState); + void publishBinaryState(NukiOpener::LockState lockState); void publishAuthorizationInfo(const uint32_t authId, const char* authName); void publishCommandResult(const char* resultStr); void publishBatteryReport(const NukiOpener::BatteryReport& batteryReport); @@ -54,6 +55,7 @@ private: std::vector _configTopics; bool _firstTunerStatePublish = true; + bool _haEnabled= false; bool (*_lockActionReceivedCallback)(const char* value) = nullptr; void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr; diff --git a/Version.h b/Version.h index c7eb4ec..345ba74 100644 --- a/Version.h +++ b/Version.h @@ -1,3 +1,3 @@ #pragma once -#define nuki_hub_version "5.5" \ No newline at end of file +#define nuki_hub_version "5.6" \ No newline at end of file diff --git a/webflash/nuki_hub.bin b/webflash/nuki_hub.bin index a7e48d3..9119dd6 100644 Binary files a/webflash/nuki_hub.bin and b/webflash/nuki_hub.bin differ