fixed issue #23: Using Lockngo does not change the lock state

This commit is contained in:
technyon
2022-08-06 18:22:10 +02:00
parent 241d39a2e4
commit bdb377a031
8 changed files with 60 additions and 3 deletions

View File

@@ -9,6 +9,7 @@
#define mqtt_topic_battery_lock_distance "/battery/lockDistance" #define mqtt_topic_battery_lock_distance "/battery/lockDistance"
#define mqtt_topic_lock_state "/lock/state" #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_trigger "/lock/trigger"
#define mqtt_topic_lock_auth_id "/lock/authorizationId" #define mqtt_topic_lock_auth_id "/lock/authorizationId"
#define mqtt_topic_lock_auth_name "/lock/authorizationName" #define mqtt_topic_lock_auth_name "/lock/authorizationName"

View File

@@ -365,7 +365,7 @@ void Network::publishHASSConfig(char* deviceType, const char* baseTopic, char* n
configJSON.concat("\",\"pl_open\":\""); configJSON.concat("\",\"pl_open\":\"");
configJSON.concat(openAction); configJSON.concat(openAction);
configJSON.concat("\",\"stat_t\":\"~"); configJSON.concat("\",\"stat_t\":\"~");
configJSON.concat(mqtt_topic_lock_state); configJSON.concat(mqtt_topic_lock_binary_state);
configJSON.concat("\",\"stat_locked\":\""); configJSON.concat("\",\"stat_locked\":\"");
configJSON.concat(lockedState); configJSON.concat(lockedState);
configJSON.concat("\",\"stat_unlocked\":\""); configJSON.concat("\",\"stat_unlocked\":\"");

View File

@@ -43,6 +43,8 @@ void NetworkLock::initialize()
_network->setMqttPresencePath(_mqttPath); _network->setMqttPresencePath(_mqttPath);
_haEnabled = _preferences->getString(preference_mqtt_hass_discovery) != "";
_network->subscribe(_mqttPath, mqtt_topic_lock_action); _network->subscribe(_mqttPath, mqtt_topic_lock_action);
for(const auto& topic : _configTopics) for(const auto& topic : _configTopics)
{ {
@@ -117,6 +119,11 @@ void NetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurne
memset(&str, 0, sizeof(str)); memset(&str, 0, sizeof(str));
lockstateToString(keyTurnerState.lockState, str); lockstateToString(keyTurnerState.lockState, str);
publishString(mqtt_topic_lock_state, str); publishString(mqtt_topic_lock_state, str);
if(_haEnabled)
{
publishBinaryState(keyTurnerState.lockState);
}
} }
if(_firstTunerStatePublish || keyTurnerState.trigger != lastKeyTurnerState.trigger) if(_firstTunerStatePublish || keyTurnerState.trigger != lastKeyTurnerState.trigger)
@@ -155,6 +162,27 @@ void NetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurne
_firstTunerStatePublish = false; _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) void NetworkLock::publishAuthorizationInfo(const uint32_t authId, const char *authName)
{ {
publishUInt(mqtt_topic_lock_auth_id, authId); publishUInt(mqtt_topic_lock_auth_id, authId);

View File

@@ -20,6 +20,7 @@ public:
void update(); void update();
void publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurnerState, const NukiLock::KeyTurnerState& lastKeyTurnerState); 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 publishAuthorizationInfo(const uint32_t authId, const char* authName);
void publishCommandResult(const char* resultStr); void publishCommandResult(const char* resultStr);
void publishBatteryReport(const NukiLock::BatteryReport& batteryReport); void publishBatteryReport(const NukiLock::BatteryReport& batteryReport);
@@ -52,6 +53,7 @@ private:
bool _firstTunerStatePublish = true; bool _firstTunerStatePublish = true;
unsigned long _lastMaintenanceTs = 0; unsigned long _lastMaintenanceTs = 0;
bool _haEnabled= false;
bool (*_lockActionReceivedCallback)(const char* value) = nullptr; bool (*_lockActionReceivedCallback)(const char* value) = nullptr;
void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr; void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr;

View File

@@ -34,6 +34,8 @@ void NetworkOpener::initialize()
_preferences->putString(preference_mqtt_opener_path, _mqttPath); _preferences->putString(preference_mqtt_opener_path, _mqttPath);
} }
_haEnabled = _preferences->getString(preference_mqtt_hass_discovery) != "";
_network->subscribe(_mqttPath, mqtt_topic_lock_action); _network->subscribe(_mqttPath, mqtt_topic_lock_action);
for(const auto& topic : _configTopics) for(const auto& topic : _configTopics)
{ {
@@ -86,6 +88,11 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn
memset(&str, 0, sizeof(str)); memset(&str, 0, sizeof(str));
lockstateToString(keyTurnerState.lockState, str); lockstateToString(keyTurnerState.lockState, str);
publishString(mqtt_topic_lock_state, str); publishString(mqtt_topic_lock_state, str);
if(_haEnabled)
{
publishBinaryState(keyTurnerState.lockState);
}
} }
if(_firstTunerStatePublish || keyTurnerState.trigger != lastKeyTurnerState.trigger) if(_firstTunerStatePublish || keyTurnerState.trigger != lastKeyTurnerState.trigger)
@@ -118,6 +125,23 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn
_firstTunerStatePublish = false; _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) void NetworkOpener::publishAuthorizationInfo(const uint32_t authId, const char *authName)
{ {
publishUInt(mqtt_topic_lock_auth_id, authId); publishUInt(mqtt_topic_lock_auth_id, authId);

View File

@@ -19,6 +19,7 @@ public:
void initialize(); void initialize();
void publishKeyTurnerState(const NukiOpener::OpenerState& keyTurnerState, const NukiOpener::OpenerState& lastKeyTurnerState); 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 publishAuthorizationInfo(const uint32_t authId, const char* authName);
void publishCommandResult(const char* resultStr); void publishCommandResult(const char* resultStr);
void publishBatteryReport(const NukiOpener::BatteryReport& batteryReport); void publishBatteryReport(const NukiOpener::BatteryReport& batteryReport);
@@ -54,6 +55,7 @@ private:
std::vector<char*> _configTopics; std::vector<char*> _configTopics;
bool _firstTunerStatePublish = true; bool _firstTunerStatePublish = true;
bool _haEnabled= false;
bool (*_lockActionReceivedCallback)(const char* value) = nullptr; bool (*_lockActionReceivedCallback)(const char* value) = nullptr;
void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr; void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr;

View File

@@ -1,3 +1,3 @@
#pragma once #pragma once
#define nuki_hub_version "5.5" #define nuki_hub_version "5.6"

Binary file not shown.