diff --git a/src/NukiNetworkOpener.cpp b/src/NukiNetworkOpener.cpp index 360cf6f..c44f492 100644 --- a/src/NukiNetworkOpener.cpp +++ b/src/NukiNetworkOpener.cpp @@ -453,19 +453,19 @@ void NukiNetworkOpener::publishState(NukiOpener::OpenerState lockState) { case NukiOpener::LockState::Locked: _nukiPublisher->publishString(mqtt_topic_lock_ha_state, "locked", true); - _nukiPublisher->publishString(mqtt_topic_lock_binary_state, "locked", true); + _nukiPublisher->publishString(mqtt_topic_lock_binary_state, "locked", true); break; case NukiOpener::LockState::RTOactive: _nukiPublisher->publishString(mqtt_topic_lock_ha_state, "unlocked", true); - _nukiPublisher->publishString(mqtt_topic_lock_binary_state, "unlocked", true); + _nukiPublisher->publishString(mqtt_topic_lock_binary_state, "unlocked", true); break; case NukiOpener::LockState::Open: _nukiPublisher->publishString(mqtt_topic_lock_ha_state, "open", true); - _nukiPublisher->publishString(mqtt_topic_lock_binary_state, "unlocked", true); + _nukiPublisher->publishString(mqtt_topic_lock_binary_state, "unlocked", true); break; case NukiOpener::LockState::Opening: _nukiPublisher->publishString(mqtt_topic_lock_ha_state, "opening", true); - _nukiPublisher->publishString(mqtt_topic_lock_binary_state, "unlocked", true); + _nukiPublisher->publishString(mqtt_topic_lock_binary_state, "unlocked", true); break; case NukiOpener::LockState::Undefined: case NukiOpener::LockState::Uncalibrated: diff --git a/src/NukiOpenerWrapper.cpp b/src/NukiOpenerWrapper.cpp index 86b4250..599f6e0 100644 --- a/src/NukiOpenerWrapper.cpp +++ b/src/NukiOpenerWrapper.cpp @@ -257,6 +257,9 @@ void NukiOpenerWrapper::update() _nextLockAction = (NukiOpener::LockAction) 0xff; _network->publishRetry("--"); retryCount = 0; + _statusUpdated = true; + Log->println(F("Opener: updating status after action")); + _statusUpdatedTs = ts; if(_intervalLockstate > 10) { _nextLockStateUpdateTs = ts + 10 * 1000; @@ -439,16 +442,27 @@ bool NukiOpenerWrapper::updateKeyTurnerState() if(result != Nuki::CmdResult::Success) { + Log->println("Query opener state failed"); _retryLockstateCount++; postponeBleWatchdog(); if(_retryLockstateCount < _nrOfRetries + 1) { + Log->print(F("Query opener state retrying in ")); + Log->print(_retryDelay); + Log->println("ms"); _nextLockStateUpdateTs = espMillis() + _retryDelay; } return false; } _retryLockstateCount = 0; + const NukiOpener::LockState& lockState = _keyTurnerState.lockState; + + if(lockState != _lastKeyTurnerState.lockState) + { + _statusUpdatedTs = espMillis(); + } + if((!isPinValid() || !_publishAuthData) && _statusUpdated && _keyTurnerState.lockState == NukiOpener::LockState::Locked && @@ -479,6 +493,12 @@ bool NukiOpenerWrapper::updateKeyTurnerState() updateGpioOutputs(); _network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState); + if((_keyTurnerState.lockState == NukiOpener::LockState::Open || _keyTurnerState.lockState == NukiOpener::LockState::Opening) && espMillis() < _statusUpdatedTs + 10000) + { + updateStatus = true; + Log->println(F("Opener: Keep updating status on intermediate lock state")); + } + if(_keyTurnerState.nukiState == NukiOpener::State::ContinuousMode) { Log->println(F("Continuous Mode"));