diff --git a/src/Config.h b/src/Config.h index d032352..7ef96ef 100644 --- a/src/Config.h +++ b/src/Config.h @@ -4,7 +4,7 @@ #define NUKI_HUB_VERSION "9.02" #define NUKI_HUB_BUILD "unknownbuildnr" -#define NUKI_HUB_DATE "2024-11-03" +#define NUKI_HUB_DATE "2024-11-04" #define GITHUB_LATEST_RELEASE_URL (char*)"https://github.com/technyon/nuki_hub/releases/latest" #define GITHUB_OTA_MANIFEST_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/manifest.json" diff --git a/src/NukiNetwork.cpp b/src/NukiNetwork.cpp index 88c7b08..5755cf6 100644 --- a/src/NukiNetwork.cpp +++ b/src/NukiNetwork.cpp @@ -2700,6 +2700,7 @@ void NukiNetwork::publishHASSConfigAdditionalOpenerEntities(char *deviceType, co json = createHassJson(uidString, "_ring_event", "Ring", name, baseTopic, String("~") + mqtt_topic_lock_ring, deviceType, "doorbell", "", "", "", {{(char*)"val_tpl", (char*)"{ \"event_type\": \"{{ value }}\" }"}}); json["event_types"][0] = "ring"; json["event_types"][1] = "ringlocked"; + json["event_types"][2] = "standby"; serializeJson(json, _buffer, _bufferSize); String path = createHassTopicPath("event", "ring", uidString); _device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, _buffer); diff --git a/src/NukiNetworkOpener.cpp b/src/NukiNetworkOpener.cpp index b1e2692..3dbf265 100644 --- a/src/NukiNetworkOpener.cpp +++ b/src/NukiNetworkOpener.cpp @@ -43,6 +43,7 @@ void NukiNetworkOpener::initialize() _network->initTopic(_mqttPath, mqtt_topic_query_lockstate, "0"); _network->initTopic(_mqttPath, mqtt_topic_query_battery, "0"); _network->initTopic(_mqttPath, mqtt_topic_lock_binary_ring, "standby"); + _network->initTopic(_mqttPath, mqtt_topic_lock_ring, "standby"); _network->subscribe(_mqttPath, mqtt_topic_query_config); _network->subscribe(_mqttPath, mqtt_topic_query_lockstate); _network->subscribe(_mqttPath, mqtt_topic_query_battery); @@ -128,6 +129,7 @@ void NukiNetworkOpener::update() { _resetRingStateTs = 0; publishString(mqtt_topic_lock_binary_ring, "standby", true); + publishString(mqtt_topic_lock_ring, "standby", true); } } @@ -647,10 +649,25 @@ void NukiNetworkOpener::publishAuthorizationInfo(const std::list _lastRollingLog) { - _lastRollingLog = log.index; serializeJson(entry, _buffer, _bufferSize); publishString(mqtt_topic_lock_log_rolling, _buffer, true); publishInt(mqtt_topic_lock_log_rolling_last, log.index, true); + + if(log.loggingType == NukiOpener::LoggingType::DoorbellRecognition && _lastRollingLog > 0) + { + if((log.data[0] & 3) == 0) + { + Log->println(F("Nuki opener: Ring detected (Locked)")); + publishRing(true); + } + else + { + Log->println(F("Nuki opener: Ring detected (Open)")); + publishRing(false); + } + } + + _lastRollingLog = log.index; } } @@ -658,7 +675,7 @@ void NukiNetworkOpener::publishAuthorizationInfo(const std::list= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0) { - _statusUpdated = false; - _nextLockStateUpdateTs = ts + _intervalLockstate * 1000; updateKeyTurnerState(); + _nextLockStateUpdateTs = ts + _intervalLockstate * 1000; + _statusUpdated = false; _network->publishStatusUpdated(_statusUpdated); } if(_network->mqttConnectionState() == 2) @@ -448,7 +448,8 @@ void NukiOpenerWrapper::updateKeyTurnerState() } _retryLockstateCount = 0; - if(_statusUpdated && + if((!isPinValid() || !_publishAuthData) && + _statusUpdated && _keyTurnerState.lockState == NukiOpener::LockState::Locked && _lastKeyTurnerState.lockState == NukiOpener::LockState::Locked && _lastKeyTurnerState.nukiState == _keyTurnerState.nukiState) @@ -458,7 +459,8 @@ void NukiOpenerWrapper::updateKeyTurnerState() } else { - if(_keyTurnerState.lockState != _lastKeyTurnerState.lockState && + if((!isPinValid() || !_publishAuthData) && + _keyTurnerState.lockState != _lastKeyTurnerState.lockState && _keyTurnerState.lockState == NukiOpener::LockState::Open && _keyTurnerState.trigger == NukiOpener::Trigger::Manual) { @@ -3882,14 +3884,14 @@ void NukiOpenerWrapper::notify(Nuki::EventType eventType) { if(eventType == Nuki::EventType::KeyTurnerStatusReset) { - _newSignal = false; + _newSignal = 0; Log->println("KeyTurnerStatusReset"); } else if(eventType == Nuki::EventType::KeyTurnerStatusUpdated) { - if(!_statusUpdated && !_newSignal) + if(!_statusUpdated && _newSignal < 5) { - _newSignal = true; + _newSignal++; Log->println("KeyTurnerStatusUpdated"); _statusUpdated = true; _statusUpdatedTs = espMillis(); diff --git a/src/NukiOpenerWrapper.h b/src/NukiOpenerWrapper.h index 177efa9..f0c892f 100644 --- a/src/NukiOpenerWrapper.h +++ b/src/NukiOpenerWrapper.h @@ -135,7 +135,7 @@ private: bool _paired = false; bool _statusUpdated = false; - bool _newSignal = false; + int _newSignal = 0; bool _hasKeypad = false; bool _keypadEnabled = false; uint _maxKeypadCodeCount = 0; diff --git a/src/NukiWrapper.cpp b/src/NukiWrapper.cpp index e2ca06b..49aba9a 100644 --- a/src/NukiWrapper.cpp +++ b/src/NukiWrapper.cpp @@ -362,9 +362,9 @@ void NukiWrapper::update() if(_nukiOfficial->getStatusUpdated() || _statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0) { Log->println("Updating Lock state based on status, timer or query"); + updateKeyTurnerState(); _statusUpdated = false; _nextLockStateUpdateTs = ts + _intervalLockstate * 1000; - updateKeyTurnerState(); _network->publishStatusUpdated(_statusUpdated); } if(_network->mqttConnectionState() == 2) @@ -4000,14 +4000,14 @@ void NukiWrapper::notify(Nuki::EventType eventType) { if(eventType == Nuki::EventType::KeyTurnerStatusReset) { - _newSignal = false; + _newSignal = 0; Log->println("KeyTurnerStatusReset"); } else if(eventType == Nuki::EventType::KeyTurnerStatusUpdated) { - if(!_statusUpdated && !_newSignal) + if(!_statusUpdated && _newSignal < 5) { - _newSignal = true; + _newSignal++; Log->println("KeyTurnerStatusUpdated"); _statusUpdated = true; _statusUpdatedTs = espMillis(); diff --git a/src/NukiWrapper.h b/src/NukiWrapper.h index 890f7b4..2358e02 100644 --- a/src/NukiWrapper.h +++ b/src/NukiWrapper.h @@ -134,7 +134,7 @@ private: bool _pairedAsApp = false; bool _paired = false; bool _statusUpdated = false; - bool _newSignal = false; + int _newSignal = 0; bool _hasKeypad = false; bool _keypadEnabled = false; uint _maxKeypadCodeCount = 0; diff --git a/src/WebCfgServer.cpp b/src/WebCfgServer.cpp index 9d6f3eb..790d387 100644 --- a/src/WebCfgServer.cpp +++ b/src/WebCfgServer.cpp @@ -1737,12 +1737,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, String& message) { _nukiOpener->disableHASS(); } - - _preferences->putString(preference_mqtt_hass_discovery, ""); - } - else if(_preferences->getString(preference_mqtt_hass_discovery, "") == "") - { - _preferences->putString(preference_mqtt_hass_discovery, "homeassistant"); } _preferences->putBool(preference_mqtt_hass_enabled, (value == "1")); Log->print(F("Setting changed: ")); @@ -1763,16 +1757,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, String& message) _nukiOpener->disableHASS(); } _preferences->putString(preference_mqtt_hass_discovery, value); - - if(value != "" && !_preferences->getBool(preference_mqtt_hass_enabled, false)) - { - _preferences->putBool(preference_mqtt_hass_enabled, true); - } - else if(value == "" && _preferences->getBool(preference_mqtt_hass_enabled, false)) - { - _preferences->putBool(preference_mqtt_hass_enabled, false); - } - Log->print(F("Setting changed: ")); Log->println(key); configChanged = true; @@ -3541,12 +3525,12 @@ esp_err_t WebCfgServer::buildMqttConfigHtml(PsychicRequest *request) printInputField(&response, "MQTTUSER", "MQTT User (# to clear)", _preferences->getString(preference_mqtt_user).c_str(), 30, "", false, true); printInputField(&response, "MQTTPASS", "MQTT Password", "*", 30, "", true, true); printInputField(&response, "MQTTPATH", "MQTT NukiHub Path", _preferences->getString(preference_mqtt_lock_path).c_str(), 180, ""); - printCheckBox(&response, "ENHADISC", "Enable Home Assistant auto discovery", _preferences->getBool(preference_mqtt_hass_enabled), ""); + printCheckBox(&response, "ENHADISC", "Enable Home Assistant auto discovery", _preferences->getBool(preference_mqtt_hass_enabled), "chkHass"); response.print("
"); response.print("

Advanced MQTT Configuration

"); response.print(""); - printInputField(&response, "HASSDISCOVERY", "Home Assistant discovery topic (usually \"homeassistant\")", _preferences->getString(preference_mqtt_hass_discovery).c_str(), 30, ""); + printInputField(&response, "HASSDISCOVERY", "Home Assistant discovery topic (usually \"homeassistant\")", _preferences->getString(preference_mqtt_hass_discovery).c_str(), 30, "class=\"chkHass\""); if(_preferences->getBool(preference_opener_enabled, false)) { printCheckBox(&response, "OPENERCONT", "Set Nuki Opener Lock/Unlock action in Home Assistant to Continuous mode", _preferences->getBool(preference_opener_continuous_mode), ""); @@ -3566,7 +3550,9 @@ esp_err_t WebCfgServer::buildMqttConfigHtml(PsychicRequest *request) response.print("* If no encryption is configured for the MQTT broker, leave empty.

"); response.print("
"); response.print(""); - response.print(""); + response.print(""); + response.print(""); + response.print(""); return response.endSend(); }