Fix Ring detection

This commit is contained in:
iranl
2024-11-04 21:14:53 +01:00
parent 791c7e21fe
commit 7ea04e6366
8 changed files with 41 additions and 35 deletions

View File

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

View File

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

View File

@@ -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<NukiOpener::Log
if(log.index > _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<NukiOpener::Log
if(latest)
{
publishString(mqtt_topic_lock_log_latest, _buffer, true);
publishString(mqtt_topic_lock_log_latest, _buffer, true);
}
else
{

View File

@@ -272,9 +272,9 @@ void NukiOpenerWrapper::update()
}
if(_statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _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();

View File

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

View File

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

View File

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

View File

@@ -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("</table><br>");
response.print("<h3>Advanced MQTT Configuration</h3>");
response.print("<table>");
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.<br><br>");
response.print("<br><input type=\"submit\" name=\"submit\" value=\"Save\">");
response.print("</form>");
response.print("</body></html>");
response.print("</body>");
response.print("<script>window.onload = function() { var hassChk; var hassTxt; for (var el of document.getElementsByClassName('chkHass')) { if (el.constructor.name === 'HTMLInputElement' && el.type === 'checkbox') { hassChk = el; el.addEventListener('change', hassChkChange); } else if (el.constructor.name==='HTMLInputElement' && el.type==='text') { hassTxt=el; el.addEventListener('keyup', hassTxtChange); } } function hassChkChange() { if(hassChk.checked == true) { if(hassTxt.value.length == 0) { hassTxt.value = 'homeassistant'; } } else { hassTxt.value = ''; } } function hassTxtChange() { if(hassTxt.value.length == 0) { hassChk.checked = false; } else { hassChk.checked = true; } } };</script>");
response.print("</html>");
return response.endSend();
}