From 8f01ae2872520364c8d1fbde2cd9e00681add897 Mon Sep 17 00:00:00 2001 From: iranl Date: Tue, 7 Jan 2025 21:02:33 +0100 Subject: [PATCH] Enhance config and keyturner states --- lib/nuki_ble | 2 +- src/Config.h | 2 +- src/NukiNetworkLock.cpp | 60 ++++++++++++++++++++++++++++++++++----- src/NukiNetworkOpener.cpp | 22 +++++++------- 4 files changed, 65 insertions(+), 21 deletions(-) diff --git a/lib/nuki_ble b/lib/nuki_ble index a7673b4..96774f5 160000 --- a/lib/nuki_ble +++ b/lib/nuki_ble @@ -1 +1 @@ -Subproject commit a7673b41f2889c673985ccd710835744f336ce5a +Subproject commit 96774f55de484a077496c3826220cd60aa4f2f44 diff --git a/src/Config.h b/src/Config.h index 222fd01..77c8192 100644 --- a/src/Config.h +++ b/src/Config.h @@ -5,7 +5,7 @@ #define NUKI_HUB_VERSION "9.07" #define NUKI_HUB_VERSION_INT (uint32_t)907 #define NUKI_HUB_BUILD "unknownbuildnr" -#define NUKI_HUB_DATE "2025-01-06" +#define NUKI_HUB_DATE "2025-01-07" #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/NukiNetworkLock.cpp b/src/NukiNetworkLock.cpp index 3e2e9ae..ba4f204 100644 --- a/src/NukiNetworkLock.cpp +++ b/src/NukiNetworkLock.cpp @@ -160,7 +160,7 @@ void NukiNetworkLock::initialize() bool NukiNetworkLock::update() { bool ret = false; - + if(_nukiOfficial->hasOffStateToPublish()) { publishState(_nukiOfficial->getOffStateToPublish()); @@ -182,7 +182,7 @@ bool NukiNetworkLock::update() _offConnected = _nukiOfficial->getOffConnected(); } - + return ret; } @@ -420,7 +420,7 @@ void NukiNetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyT json["lock_state"] = str; } - json["lockngo_state"] = (keyTurnerState.lockNgoTimer == 0 ? 0 : 1); + json["lockngo_state"] = keyTurnerState.lockNgoTimer; memset(&str, 0, sizeof(str)); @@ -492,10 +492,10 @@ void NukiNetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyT json["door_sensor_state"] = str; - bool critical = (keyTurnerState.criticalBatteryState & 0b00000001) > 0; - bool charging = (keyTurnerState.criticalBatteryState & 0b00000010) > 0; - uint8_t level = (keyTurnerState.criticalBatteryState & 0b11111100) >> 1; - bool keypadCritical = (keyTurnerState.accessoryBatteryState & (1 << 7)) != 0 ? (keyTurnerState.accessoryBatteryState & (1 << 6)) != 0 : false; + bool critical = (keyTurnerState.criticalBatteryState & 1) == 1; + bool charging = (keyTurnerState.criticalBatteryState & 2) == 2; + uint8_t level = ((keyTurnerState.criticalBatteryState & 0b11111100) >> 1); + bool keypadCritical = (keyTurnerState.accessoryBatteryState & 1) == 1 ? (keyTurnerState.accessoryBatteryState & 3) == 3 : false; jsonBattery["critical"] = critical ? "1" : "0"; jsonBattery["charging"] = charging ? "1" : "0"; @@ -514,6 +514,15 @@ void NukiNetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyT _nukiPublisher->publishBool(mqtt_topic_battery_keypad_critical, keypadCritical, true); } + bool doorSensorCritical = (keyTurnerState.accessoryBatteryState & 4) == 4 ? (keyTurnerState.accessoryBatteryState & 12) == 12 : false; + + jsonBattery["doorSensorCritical"] = doorSensorCritical ? "1" : "0"; + + if((_firstTunerStatePublish || keyTurnerState.accessoryBatteryState != lastKeyTurnerState.accessoryBatteryState) && !_disableNonJSON) + { + _nukiPublisher->publishBool(mqtt_topic_battery_doorsensor_critical, doorSensorCritical, true); + } + serializeJson(jsonBattery, _buffer, _bufferSize); _nukiPublisher->publishString(mqtt_topic_battery_basic_json, _buffer, true); } @@ -523,6 +532,43 @@ void NukiNetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyT json["door_sensor_state"] = str; } + if (keyTurnerState.network > -1) + { + json["remoteAccessEnabled"] = ((keyTurnerState.network & 1) == 1) ? 1 : 0; + json["bridgePaired"] = (((keyTurnerState.network >> 1) & 1) == 1) ? 1 : 0; + json["sseConnectedViaWifi"] = (((keyTurnerState.network >> 2) & 1) == 1) ? 1 : 0; + json["sseConnectionEstablished"] = (((keyTurnerState.network >> 3) & 1) == 1) ? 1 : 0; + json["isSseConnectedViaThread"] = (((keyTurnerState.network >> 4) & 1) == 1) ? 1 : 0; + json["threadSseUplinkEnabledByUser"] = (((keyTurnerState.network >> 5) & 1) == 1) ? 1 : 0; + json["nat64AvailableViaThread"] = (((keyTurnerState.network >> 6) & 1) == 1) ? 1 : 0; + } + if (keyTurnerState.bleConnectionStrength > -1) + { + json["bleConnectionStrength"] = keyTurnerState.bleConnectionStrength; + } + if (keyTurnerState.wifiConnectionStrength > -1) + { + json["wifiConnectionStrength"] = keyTurnerState.wifiConnectionStrength; + } + if (keyTurnerState.wifi > -1) + { + json["wifiStatus"] = (keyTurnerState.wifi & 3); + json["sseStatus"] = ((keyTurnerState.wifi >> 2) & 3); + json["wifiQuality"] = ((keyTurnerState.wifi >> 4) & 15); + } + if (keyTurnerState.mqtt > -1) + { + json["mqttStatus"] = (keyTurnerState.mqtt & 3); + json["mqttConnectionChannel"] = ((keyTurnerState.mqtt >> 2) & 1); + } + if (keyTurnerState.thread > -1) + { + json["threadConnectionStatus"] = (keyTurnerState.thread & 3); + json["threadSseStatus"] = ((keyTurnerState.thread >> 2) & 3); + json["isCommissioningModeActive"] = (keyTurnerState.thread & 16) != 0 ? 1 : 0; + json["isWifiDisabledBecauseOfThread"] = (keyTurnerState.thread & 32) != 0 ? 1 : 0; + } + json["auth_id"] = getAuthId(); json["auth_name"] = getAuthName(); diff --git a/src/NukiNetworkOpener.cpp b/src/NukiNetworkOpener.cpp index e22272b..9097f26 100644 --- a/src/NukiNetworkOpener.cpp +++ b/src/NukiNetworkOpener.cpp @@ -48,7 +48,7 @@ void NukiNetworkOpener::initialize() _network->subscribe(_mqttPath, mqtt_topic_query_config); _network->subscribe(_mqttPath, mqtt_topic_query_lockstate); _network->subscribe(_mqttPath, mqtt_topic_query_battery); - + _network->initTopic(_mqttPath, mqtt_topic_keypad_json_action, "--"); _network->initTopic(_mqttPath, mqtt_topic_timecontrol_action, "--"); _network->initTopic(_mqttPath, mqtt_topic_auth_action, "--"); @@ -400,17 +400,7 @@ void NukiNetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& key json["lock_completion_status"] = str; - memset(&str, 0, sizeof(str)); - NukiOpener::doorSensorStateToString(keyTurnerState.doorSensorState, str); - - if(_firstTunerStatePublish || keyTurnerState.doorSensorState != lastKeyTurnerState.doorSensorState) - { - _nukiPublisher->publishString(mqtt_topic_lock_door_sensor_state, str, true); - } - - json["door_sensor_state"] = str; - - bool critical = (keyTurnerState.criticalBatteryState & 0b00000001) > 0; + bool critical = (keyTurnerState.criticalBatteryState & 1); jsonBattery["critical"] = critical ? "1" : "0"; if((_firstTunerStatePublish || keyTurnerState.criticalBatteryState != lastKeyTurnerState.criticalBatteryState) && !_disableNonJSON) @@ -418,6 +408,14 @@ void NukiNetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& key _nukiPublisher->publishBool(mqtt_topic_battery_critical, critical, true); } + bool keypadCritical = (keyTurnerState.accessoryBatteryState & 1) == 1 ? (keyTurnerState.accessoryBatteryState & 3) == 3 : false; + jsonBattery["keypadCritical"] = keypadCritical ? "1" : "0"; + + if((_firstTunerStatePublish || keyTurnerState.accessoryBatteryState != lastKeyTurnerState.accessoryBatteryState) && !_disableNonJSON) + { + _nukiPublisher->publishBool(mqtt_topic_battery_keypad_critical, keypadCritical, true); + } + json["auth_id"] = _authId; json["auth_name"] = _authName;