Fix Ring detection
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#define NUKI_HUB_VERSION "9.02"
|
#define NUKI_HUB_VERSION "9.02"
|
||||||
#define NUKI_HUB_BUILD "unknownbuildnr"
|
#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_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"
|
#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 = 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"][0] = "ring";
|
||||||
json["event_types"][1] = "ringlocked";
|
json["event_types"][1] = "ringlocked";
|
||||||
|
json["event_types"][2] = "standby";
|
||||||
serializeJson(json, _buffer, _bufferSize);
|
serializeJson(json, _buffer, _bufferSize);
|
||||||
String path = createHassTopicPath("event", "ring", uidString);
|
String path = createHassTopicPath("event", "ring", uidString);
|
||||||
_device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, _buffer);
|
_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_lockstate, "0");
|
||||||
_network->initTopic(_mqttPath, mqtt_topic_query_battery, "0");
|
_network->initTopic(_mqttPath, mqtt_topic_query_battery, "0");
|
||||||
_network->initTopic(_mqttPath, mqtt_topic_lock_binary_ring, "standby");
|
_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_config);
|
||||||
_network->subscribe(_mqttPath, mqtt_topic_query_lockstate);
|
_network->subscribe(_mqttPath, mqtt_topic_query_lockstate);
|
||||||
_network->subscribe(_mqttPath, mqtt_topic_query_battery);
|
_network->subscribe(_mqttPath, mqtt_topic_query_battery);
|
||||||
@@ -128,6 +129,7 @@ void NukiNetworkOpener::update()
|
|||||||
{
|
{
|
||||||
_resetRingStateTs = 0;
|
_resetRingStateTs = 0;
|
||||||
publishString(mqtt_topic_lock_binary_ring, "standby", true);
|
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)
|
if(log.index > _lastRollingLog)
|
||||||
{
|
{
|
||||||
_lastRollingLog = log.index;
|
|
||||||
serializeJson(entry, _buffer, _bufferSize);
|
serializeJson(entry, _buffer, _bufferSize);
|
||||||
publishString(mqtt_topic_lock_log_rolling, _buffer, true);
|
publishString(mqtt_topic_lock_log_rolling, _buffer, true);
|
||||||
publishInt(mqtt_topic_lock_log_rolling_last, log.index, 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)
|
if(latest)
|
||||||
{
|
{
|
||||||
publishString(mqtt_topic_lock_log_latest, _buffer, true);
|
publishString(mqtt_topic_lock_log_latest, _buffer, true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -272,9 +272,9 @@ void NukiOpenerWrapper::update()
|
|||||||
}
|
}
|
||||||
if(_statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0)
|
if(_statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0)
|
||||||
{
|
{
|
||||||
_statusUpdated = false;
|
|
||||||
_nextLockStateUpdateTs = ts + _intervalLockstate * 1000;
|
|
||||||
updateKeyTurnerState();
|
updateKeyTurnerState();
|
||||||
|
_nextLockStateUpdateTs = ts + _intervalLockstate * 1000;
|
||||||
|
_statusUpdated = false;
|
||||||
_network->publishStatusUpdated(_statusUpdated);
|
_network->publishStatusUpdated(_statusUpdated);
|
||||||
}
|
}
|
||||||
if(_network->mqttConnectionState() == 2)
|
if(_network->mqttConnectionState() == 2)
|
||||||
@@ -448,7 +448,8 @@ void NukiOpenerWrapper::updateKeyTurnerState()
|
|||||||
}
|
}
|
||||||
_retryLockstateCount = 0;
|
_retryLockstateCount = 0;
|
||||||
|
|
||||||
if(_statusUpdated &&
|
if((!isPinValid() || !_publishAuthData) &&
|
||||||
|
_statusUpdated &&
|
||||||
_keyTurnerState.lockState == NukiOpener::LockState::Locked &&
|
_keyTurnerState.lockState == NukiOpener::LockState::Locked &&
|
||||||
_lastKeyTurnerState.lockState == NukiOpener::LockState::Locked &&
|
_lastKeyTurnerState.lockState == NukiOpener::LockState::Locked &&
|
||||||
_lastKeyTurnerState.nukiState == _keyTurnerState.nukiState)
|
_lastKeyTurnerState.nukiState == _keyTurnerState.nukiState)
|
||||||
@@ -458,7 +459,8 @@ void NukiOpenerWrapper::updateKeyTurnerState()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(_keyTurnerState.lockState != _lastKeyTurnerState.lockState &&
|
if((!isPinValid() || !_publishAuthData) &&
|
||||||
|
_keyTurnerState.lockState != _lastKeyTurnerState.lockState &&
|
||||||
_keyTurnerState.lockState == NukiOpener::LockState::Open &&
|
_keyTurnerState.lockState == NukiOpener::LockState::Open &&
|
||||||
_keyTurnerState.trigger == NukiOpener::Trigger::Manual)
|
_keyTurnerState.trigger == NukiOpener::Trigger::Manual)
|
||||||
{
|
{
|
||||||
@@ -3882,14 +3884,14 @@ void NukiOpenerWrapper::notify(Nuki::EventType eventType)
|
|||||||
{
|
{
|
||||||
if(eventType == Nuki::EventType::KeyTurnerStatusReset)
|
if(eventType == Nuki::EventType::KeyTurnerStatusReset)
|
||||||
{
|
{
|
||||||
_newSignal = false;
|
_newSignal = 0;
|
||||||
Log->println("KeyTurnerStatusReset");
|
Log->println("KeyTurnerStatusReset");
|
||||||
}
|
}
|
||||||
else if(eventType == Nuki::EventType::KeyTurnerStatusUpdated)
|
else if(eventType == Nuki::EventType::KeyTurnerStatusUpdated)
|
||||||
{
|
{
|
||||||
if(!_statusUpdated && !_newSignal)
|
if(!_statusUpdated && _newSignal < 5)
|
||||||
{
|
{
|
||||||
_newSignal = true;
|
_newSignal++;
|
||||||
Log->println("KeyTurnerStatusUpdated");
|
Log->println("KeyTurnerStatusUpdated");
|
||||||
_statusUpdated = true;
|
_statusUpdated = true;
|
||||||
_statusUpdatedTs = espMillis();
|
_statusUpdatedTs = espMillis();
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ private:
|
|||||||
|
|
||||||
bool _paired = false;
|
bool _paired = false;
|
||||||
bool _statusUpdated = false;
|
bool _statusUpdated = false;
|
||||||
bool _newSignal = false;
|
int _newSignal = 0;
|
||||||
bool _hasKeypad = false;
|
bool _hasKeypad = false;
|
||||||
bool _keypadEnabled = false;
|
bool _keypadEnabled = false;
|
||||||
uint _maxKeypadCodeCount = 0;
|
uint _maxKeypadCodeCount = 0;
|
||||||
|
|||||||
@@ -362,9 +362,9 @@ void NukiWrapper::update()
|
|||||||
if(_nukiOfficial->getStatusUpdated() || _statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0)
|
if(_nukiOfficial->getStatusUpdated() || _statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0)
|
||||||
{
|
{
|
||||||
Log->println("Updating Lock state based on status, timer or query");
|
Log->println("Updating Lock state based on status, timer or query");
|
||||||
|
updateKeyTurnerState();
|
||||||
_statusUpdated = false;
|
_statusUpdated = false;
|
||||||
_nextLockStateUpdateTs = ts + _intervalLockstate * 1000;
|
_nextLockStateUpdateTs = ts + _intervalLockstate * 1000;
|
||||||
updateKeyTurnerState();
|
|
||||||
_network->publishStatusUpdated(_statusUpdated);
|
_network->publishStatusUpdated(_statusUpdated);
|
||||||
}
|
}
|
||||||
if(_network->mqttConnectionState() == 2)
|
if(_network->mqttConnectionState() == 2)
|
||||||
@@ -4000,14 +4000,14 @@ void NukiWrapper::notify(Nuki::EventType eventType)
|
|||||||
{
|
{
|
||||||
if(eventType == Nuki::EventType::KeyTurnerStatusReset)
|
if(eventType == Nuki::EventType::KeyTurnerStatusReset)
|
||||||
{
|
{
|
||||||
_newSignal = false;
|
_newSignal = 0;
|
||||||
Log->println("KeyTurnerStatusReset");
|
Log->println("KeyTurnerStatusReset");
|
||||||
}
|
}
|
||||||
else if(eventType == Nuki::EventType::KeyTurnerStatusUpdated)
|
else if(eventType == Nuki::EventType::KeyTurnerStatusUpdated)
|
||||||
{
|
{
|
||||||
if(!_statusUpdated && !_newSignal)
|
if(!_statusUpdated && _newSignal < 5)
|
||||||
{
|
{
|
||||||
_newSignal = true;
|
_newSignal++;
|
||||||
Log->println("KeyTurnerStatusUpdated");
|
Log->println("KeyTurnerStatusUpdated");
|
||||||
_statusUpdated = true;
|
_statusUpdated = true;
|
||||||
_statusUpdatedTs = espMillis();
|
_statusUpdatedTs = espMillis();
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ private:
|
|||||||
bool _pairedAsApp = false;
|
bool _pairedAsApp = false;
|
||||||
bool _paired = false;
|
bool _paired = false;
|
||||||
bool _statusUpdated = false;
|
bool _statusUpdated = false;
|
||||||
bool _newSignal = false;
|
int _newSignal = 0;
|
||||||
bool _hasKeypad = false;
|
bool _hasKeypad = false;
|
||||||
bool _keypadEnabled = false;
|
bool _keypadEnabled = false;
|
||||||
uint _maxKeypadCodeCount = 0;
|
uint _maxKeypadCodeCount = 0;
|
||||||
|
|||||||
@@ -1737,12 +1737,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, String& message)
|
|||||||
{
|
{
|
||||||
_nukiOpener->disableHASS();
|
_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"));
|
_preferences->putBool(preference_mqtt_hass_enabled, (value == "1"));
|
||||||
Log->print(F("Setting changed: "));
|
Log->print(F("Setting changed: "));
|
||||||
@@ -1763,16 +1757,6 @@ bool WebCfgServer::processArgs(PsychicRequest *request, String& message)
|
|||||||
_nukiOpener->disableHASS();
|
_nukiOpener->disableHASS();
|
||||||
}
|
}
|
||||||
_preferences->putString(preference_mqtt_hass_discovery, value);
|
_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->print(F("Setting changed: "));
|
||||||
Log->println(key);
|
Log->println(key);
|
||||||
configChanged = true;
|
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, "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, "MQTTPASS", "MQTT Password", "*", 30, "", true, true);
|
||||||
printInputField(&response, "MQTTPATH", "MQTT NukiHub Path", _preferences->getString(preference_mqtt_lock_path).c_str(), 180, "");
|
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("</table><br>");
|
||||||
|
|
||||||
response.print("<h3>Advanced MQTT Configuration</h3>");
|
response.print("<h3>Advanced MQTT Configuration</h3>");
|
||||||
response.print("<table>");
|
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))
|
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), "");
|
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("* 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("<br><input type=\"submit\" name=\"submit\" value=\"Save\">");
|
||||||
response.print("</form>");
|
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();
|
return response.endSend();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user