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_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"

View File

@@ -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\":\"");

View File

@@ -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);

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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<char*> _configTopics;
bool _firstTunerStatePublish = true;
bool _haEnabled= false;
bool (*_lockActionReceivedCallback)(const char* value) = nullptr;
void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr;

View File

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

Binary file not shown.