diff --git a/NetworkLock.cpp b/NetworkLock.cpp index 83377a7..cd00d0f 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -223,11 +223,6 @@ void NetworkLock::publishStateAsJson(const char* action, const NukiLock::KeyTurn lockstateToString(keyTurnerState.lockState, str); json.concat("\"state\": \""); json.concat(str); json.concat("\",\n"); - // state - memset(&str, 0, sizeof(str)); - lockstateToString(keyTurnerState.lockState, str); - json.concat("\"state\": \""); json.concat(str); json.concat("\",\n"); - // trigger memset(&str, 0, sizeof(str)); triggerToString(keyTurnerState.trigger, str); diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 09de990..44dd6bc 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -112,7 +112,7 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn if(_firstTunerStatePublish || keyTurnerState.doorSensorState != lastKeyTurnerState.doorSensorState) { memset(&str, 0, sizeof(str)); - NukiLock::doorSensorStateToString(keyTurnerState.doorSensorState, str); + NukiOpener::doorSensorStateToString(keyTurnerState.doorSensorState, str); publishString(mqtt_topic_lock_door_sensor_state, str); } @@ -125,6 +125,43 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn _firstTunerStatePublish = false; } +void NetworkOpener::publishStateAsJson(const char *action, const NukiOpener::OpenerState &keyTurnerState, const uint32_t authId, const char *authName) +{ + char str[50]; + String json = "{\n"; + + // action + json.concat("\"action\": \""); json.concat(action); json.concat("\",\n"); + + // state + memset(&str, 0, sizeof(str)); + lockstateToString(keyTurnerState.lockState, str); + json.concat("\"state\": \""); json.concat(str); json.concat("\",\n"); + + // trigger + memset(&str, 0, sizeof(str)); + triggerToString(keyTurnerState.trigger, str); + json.concat("\"trigger\": \""); json.concat(str); json.concat("\",\n"); + + // completion status + memset(&str, 0, sizeof(str)); + NukiOpener::completionStatusToString(keyTurnerState.lastLockActionCompletionStatus, str); + json.concat("\"completionStatus\": \""); json.concat(str); json.concat("\",\n"); + + // Door sensor state + memset(&str, 0, sizeof(str)); + NukiOpener::doorSensorStateToString(keyTurnerState.doorSensorState, str); + json.concat("\"doorSensorState\": \""); json.concat(str); json.concat("\",\n"); + + // Auth date + json.concat("\"authorizationId\": "); json.concat(authId == 0xffff ? 0 : authId); json.concat(",\n"); + json.concat("\"authorizationName\": \""); json.concat(authName); json.concat("\"\n"); + + json.concat("}"); + + publishString(mqtt_topic_lock_state_json, json.c_str()); +} + void NetworkOpener::publishBinaryState(NukiOpener::LockState lockState) { switch(lockState) diff --git a/NetworkOpener.h b/NetworkOpener.h index db90ee1..3981b92 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 publishStateAsJson(const char* action, const NukiOpener::OpenerState& keyTurnerState, const uint32_t authId, const char* authName); void publishBinaryState(NukiOpener::LockState lockState); void publishAuthorizationInfo(const uint32_t authId, const char* authName); void publishCommandResult(const char* resultStr); diff --git a/NukiOpenerWrapper.cpp b/NukiOpenerWrapper.cpp index fb17262..0712eae 100644 --- a/NukiOpenerWrapper.cpp +++ b/NukiOpenerWrapper.cpp @@ -40,6 +40,7 @@ void NukiOpenerWrapper::initialize() _intervalLockstate = _preferences->getInt(preference_query_interval_lockstate); _intervalBattery = _preferences->getInt(preference_query_interval_battery); _publishAuthData = _preferences->getBool(preference_publish_authdata); + _publishJson = _preferences->getBool(preference_publish_json); if(_intervalLockstate == 0) { @@ -164,6 +165,11 @@ void NukiOpenerWrapper::updateKeyTurnerState() { updateAuthData(); } + + if(_publishJson) + { + _network->publishStateAsJson(_lastLockAction, _keyTurnerState, _lastAuthId, _lastAuthName); + } } void NukiOpenerWrapper::updateBatteryState() @@ -204,17 +210,20 @@ void NukiOpenerWrapper::updateAuthData() if(log.size() > 0) { const NukiOpener::LogEntry& entry = log.front(); -// log_d("Log: %d-%d-%d %d:%d:%d %s", entry.timeStampYear, entry.timeStampMonth, entry.timeStampDay, -// entry.timeStampHour, entry.timeStampMinute, entry.timeStampSecond, entry.name); + if(entry.authId != _lastAuthId) { _network->publishAuthorizationInfo(entry.authId, (char *) entry.name); _lastAuthId = entry.authId; + memset(_lastAuthName, 0, sizeof(_lastAuthName)); + memcpy(_lastAuthName, entry.name, sizeof(entry.name)); } } else { _network->publishAuthorizationInfo(0, ""); + _lastAuthId = 0; + memset(_lastAuthName, 0, sizeof(_lastAuthName)); } } @@ -233,6 +242,9 @@ NukiOpener::LockAction NukiOpenerWrapper::lockActionToEnum(const char *str) bool NukiOpenerWrapper::onLockActionReceivedCallback(const char *value) { + memset(&nukiOpenerInst->_lastLockAction, 0, sizeof(_lastLockAction)); + strcpy(nukiOpenerInst->_lastLockAction, value); + NukiOpener::LockAction action = nukiOpenerInst->lockActionToEnum(value); nukiOpenerInst->_nextLockAction = action; return (int)action != 0xff; diff --git a/NukiOpenerWrapper.h b/NukiOpenerWrapper.h index 43b8c29..80b9927 100644 --- a/NukiOpenerWrapper.h +++ b/NukiOpenerWrapper.h @@ -59,7 +59,9 @@ private: NukiOpener::OpenerState _lastKeyTurnerState; NukiOpener::OpenerState _keyTurnerState; + char _lastLockAction[25] = { 0 }; uint32_t _lastAuthId = 0xffff; + char _lastAuthName[33] = {0}; NukiOpener::BatteryReport _batteryReport; NukiOpener::BatteryReport _lastBatteryReport; @@ -71,6 +73,7 @@ private: bool _paired = false; bool _statusUpdated = false; + bool _publishJson = false; unsigned long _nextLockStateUpdateTs = 0; unsigned long _nextBatteryReportTs = 0; unsigned long _nextConfigUpdateTs = 0; diff --git a/NukiWrapper.cpp b/NukiWrapper.cpp index 621107c..1511b8c 100644 --- a/NukiWrapper.cpp +++ b/NukiWrapper.cpp @@ -286,9 +286,6 @@ void NukiWrapper::updateKeypad() NukiLock::LockAction NukiWrapper::lockActionToEnum(const char *str) { - memset(&_lastLockAction, 0, sizeof(_lastLockAction)); - strcpy(_lastLockAction, str); - if(strcmp(str, "unlock") == 0) return NukiLock::LockAction::Unlock; else if(strcmp(str, "lock") == 0) return NukiLock::LockAction::Lock; else if(strcmp(str, "unlatch") == 0) return NukiLock::LockAction::Unlatch; @@ -303,6 +300,9 @@ NukiLock::LockAction NukiWrapper::lockActionToEnum(const char *str) bool NukiWrapper::onLockActionReceivedCallback(const char *value) { + memset(&nukiInst->_lastLockAction, 0, sizeof(_lastLockAction)); + strcpy(nukiInst->_lastLockAction, value); + NukiLock::LockAction action = nukiInst->lockActionToEnum(value); nukiInst->_nextLockAction = action; return (int)action != 0xff; diff --git a/NukiWrapper.h b/NukiWrapper.h index c6fd654..ebf0287 100644 --- a/NukiWrapper.h +++ b/NukiWrapper.h @@ -66,6 +66,7 @@ private: NukiLock::KeyTurnerState _lastKeyTurnerState; NukiLock::KeyTurnerState _keyTurnerState; + char _lastLockAction[15] = { 0 }; uint32_t _lastAuthId = 0xffff; char _lastAuthName[33] = {0}; @@ -89,5 +90,4 @@ private: unsigned long _nextConfigUpdateTs = 0; unsigned long _nextKeypadUpdateTs = 0; NukiLock::LockAction _nextLockAction = (NukiLock::LockAction)0xff; - char _lastLockAction[15] = { 0 }; };