From 6b986d09ed8665a89cb8b82dac1a55b15321ea8a Mon Sep 17 00:00:00 2001 From: technyon Date: Fri, 2 Sep 2022 19:25:10 +0200 Subject: [PATCH] add ring detection --- NetworkOpener.cpp | 18 ++++++++++++++++++ NetworkOpener.h | 3 +++ NukiOpenerWrapper.cpp | 24 +++++++++++++++--------- main.cpp | 1 + 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 09351af..554797d 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -43,6 +43,18 @@ void NetworkOpener::initialize() } } +void NetworkOpener::update() +{ + if(_resetLockStateTs != 0 && millis() >= _resetLockStateTs) + { + char str[50]; + memset(str, 0, sizeof(str)); + _resetLockStateTs = 0; + lockstateToString(NukiOpener::LockState::Locked, str); + publishString(mqtt_topic_lock_state, str); + } +} + void NetworkOpener::onMqttDataReceived(char *&topic, byte *&payload, unsigned int &length) { char value[50] = {0}; @@ -125,6 +137,12 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn _firstTunerStatePublish = false; } +void NetworkOpener::publishRing() +{ + publishString(mqtt_topic_lock_state, "ring"); + _resetLockStateTs = millis() + 2000; +} + void NetworkOpener::publishBinaryState(NukiOpener::LockState lockState) { switch(lockState) diff --git a/NetworkOpener.h b/NetworkOpener.h index 6df5615..02e6425 100644 --- a/NetworkOpener.h +++ b/NetworkOpener.h @@ -17,8 +17,10 @@ public: virtual ~NetworkOpener() = default; void initialize(); + void update(); void publishKeyTurnerState(const NukiOpener::OpenerState& keyTurnerState, const NukiOpener::OpenerState& lastKeyTurnerState); + void publishRing(); void publishBinaryState(NukiOpener::LockState lockState); void publishAuthorizationInfo(const std::list& logEntries); void clearAuthorizationInfo(); @@ -58,6 +60,7 @@ private: bool _firstTunerStatePublish = true; bool _haEnabled= false; + unsigned long _resetLockStateTs = 0; bool (*_lockActionReceivedCallback)(const char* value) = nullptr; void (*_configUpdateReceivedCallback)(const char* path, const char* value) = nullptr; diff --git a/NukiOpenerWrapper.cpp b/NukiOpenerWrapper.cpp index e83ef94..206b49b 100644 --- a/NukiOpenerWrapper.cpp +++ b/NukiOpenerWrapper.cpp @@ -147,17 +147,23 @@ void NukiOpenerWrapper::unpair() void NukiOpenerWrapper::updateKeyTurnerState() { _nukiOpener.requestOpenerState(&_keyTurnerState); - _network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState); - if(_keyTurnerState.lockState != _lastKeyTurnerState.lockState) + if(_keyTurnerState.lockState == NukiOpener::LockState::Locked && _lastKeyTurnerState.lockState == NukiOpener::LockState::Locked) { - char lockStateStr[20]; - lockstateToString(_keyTurnerState.lockState, lockStateStr); - Serial.print(F("Nuki opener state: ")); - Serial.println((int)_keyTurnerState.lockState); -// Serial.println((int)_keyTurnerState.nukiState); -// Serial.println((int)_keyTurnerState.currentTimeYear); -// Serial.println((int)_keyTurnerState.ringToOpenTimer); + Serial.println(F("Nuki opener: Ring detected")); + _network->publishRing(); + } + else + { + _network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState); + + if(_keyTurnerState.lockState != _lastKeyTurnerState.lockState) + { + char lockStateStr[20]; + lockstateToString(_keyTurnerState.lockState, lockStateStr); + Serial.print(F("Nuki opener state: ")); + Serial.println((int)_keyTurnerState.lockState); + } } if(_publishAuthData) diff --git a/main.cpp b/main.cpp index 69e8d25..910be82 100644 --- a/main.cpp +++ b/main.cpp @@ -38,6 +38,7 @@ void networkTask(void *pvParameters) case 0: case 1: networkLock->update(); + networkOpener->update(); network->update(); webCfgServer->update(); break;