From 0b05f374f54c79aae5e3bc727a1775bdc5a3bd61 Mon Sep 17 00:00:00 2001 From: iranl Date: Fri, 16 Feb 2024 21:30:03 +0100 Subject: [PATCH] MQTT JSON NukiOpener --- MqttTopics.h | 1 + NetworkOpener.cpp | 47 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/MqttTopics.h b/MqttTopics.h index 78fc7a0..eaa1bcd 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -10,6 +10,7 @@ #define mqtt_topic_battery_keypad_critical "/battery/keypadCritical" #define mqtt_topic_lock_state "/lock/state" +#define mqtt_topic_lock_json "/lock/json" #define mqtt_topic_query_config "/lock/query/config" #define mqtt_topic_query_lockstate "/lock/query/lockstate" #define mqtt_topic_query_keypad "/lock/query/keypad" diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 89e5a4f..38dc947 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -202,18 +202,20 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn _currentLockState = keyTurnerState.lockState; char str[50]; + memset(&str, 0, sizeof(str)); + + DynamicJsonDocument json(_bufferSize); + + lockstateToString(keyTurnerState.lockState, str); if((_firstTunerStatePublish || keyTurnerState.lockState != lastKeyTurnerState.lockState || keyTurnerState.nukiState != lastKeyTurnerState.nukiState) && keyTurnerState.lockState != NukiOpener::LockState::Undefined) - { - memset(&str, 0, sizeof(str)); - + { if(keyTurnerState.nukiState == NukiOpener::State::ContinuousMode) { publishString(mqtt_topic_lock_state, "ContinuousMode"); } else { - lockstateToString(keyTurnerState.lockState, str); publishString(mqtt_topic_lock_state, str); } @@ -222,35 +224,58 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn publishBinaryState(keyTurnerState); } } + + json["lock_state"] = str; + + if(keyTurnerState.nukiState == NukiOpener::State::ContinuousMode) + { + json["continuous_mode"] = true; + } else { + json["continuous_mode"] = false; + } + + memset(&str, 0, sizeof(str)); + triggerToString(keyTurnerState.trigger, str); if(_firstTunerStatePublish || keyTurnerState.trigger != lastKeyTurnerState.trigger) { - memset(&str, 0, sizeof(str)); - triggerToString(keyTurnerState.trigger, str); publishString(mqtt_topic_lock_trigger, str); } + + json["trigger"] = str; + memset(&str, 0, sizeof(str)); + completionStatusToString(keyTurnerState.lastLockActionCompletionStatus, str); if(_firstTunerStatePublish || keyTurnerState.lastLockActionCompletionStatus != lastKeyTurnerState.lastLockActionCompletionStatus) { - memset(&str, 0, sizeof(str)); - completionStatusToString(keyTurnerState.lastLockActionCompletionStatus, str); publishString(mqtt_topic_lock_completionStatus, str); } + + json["lock_completion_status"] = str; + + memset(&str, 0, sizeof(str)); + NukiOpener::doorSensorStateToString(keyTurnerState.doorSensorState, str); if(_firstTunerStatePublish || keyTurnerState.doorSensorState != lastKeyTurnerState.doorSensorState) { - memset(&str, 0, sizeof(str)); - NukiOpener::doorSensorStateToString(keyTurnerState.doorSensorState, str); publishString(mqtt_topic_lock_door_sensor_state, str); } + + json["door_sensor_state"] = str; + + bool critical = (keyTurnerState.criticalBatteryState & 0b00000001) > 0; if(_firstTunerStatePublish || keyTurnerState.criticalBatteryState != lastKeyTurnerState.criticalBatteryState) { - bool critical = (keyTurnerState.criticalBatteryState & 0b00000001) > 0; publishBool(mqtt_topic_battery_critical, critical); } + json["battery_critical"] = critical; + + serializeJson(json, _buffer, _bufferSize); + publishString(mqtt_topic_lock_json, _buffer); + _firstTunerStatePublish = false; }