Fix Ring detection
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user