diff --git a/NetworkLock.cpp b/NetworkLock.cpp index 549afc5..59c74d2 100644 --- a/NetworkLock.cpp +++ b/NetworkLock.cpp @@ -209,11 +209,15 @@ void NetworkLock::onMqttDataReceived(const char* topic, byte* payload, const uns void NetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurnerState, const NukiLock::KeyTurnerState& lastKeyTurnerState) { char str[50]; + memset(&str, 0, sizeof(str)); + + DynamicJsonDocument json(_bufferSize); + + lockstateToString(keyTurnerState.lockState, str); if((_firstTunerStatePublish || keyTurnerState.lockState != lastKeyTurnerState.lockState) && keyTurnerState.lockState != NukiLock::LockState::Undefined) { - memset(&str, 0, sizeof(str)); - lockstateToString(keyTurnerState.lockState, str); + publishString(mqtt_topic_lock_state, str); if(_haEnabled) @@ -222,57 +226,80 @@ void NetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurne } } + json["lock_state"] = str; + + 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)); + lockactionToString(keyTurnerState.lastLockAction, str); + if(_firstTunerStatePublish || keyTurnerState.lastLockAction != lastKeyTurnerState.lastLockAction) { - memset(&str, 0, sizeof(str)); - lockactionToString(keyTurnerState.lastLockAction, str); publishString(mqtt_topic_lock_last_lock_action, str); } + json["last_lock_action"] = str; + + memset(&str, 0, sizeof(str)); + NukiLock::completionStatusToString(keyTurnerState.lastLockActionCompletionStatus, str); + if(_firstTunerStatePublish || keyTurnerState.lastLockActionCompletionStatus != lastKeyTurnerState.lastLockActionCompletionStatus) { - memset(&str, 0, sizeof(str)); - NukiLock::completionStatusToString(keyTurnerState.lastLockActionCompletionStatus, str); publishString(mqtt_topic_lock_completionStatus, str); } + json["lock_completion_status"] = str; + + memset(&str, 0, sizeof(str)); + NukiLock::doorSensorStateToString(keyTurnerState.doorSensorState, str); + if(_firstTunerStatePublish || keyTurnerState.doorSensorState != lastKeyTurnerState.doorSensorState) { - memset(&str, 0, sizeof(str)); - NukiLock::doorSensorStateToString(keyTurnerState.doorSensorState, str); publishString(mqtt_topic_lock_door_sensor_state, str); } + json["door_sensor_state"] = str; + + bool critical = (keyTurnerState.criticalBatteryState & 0b00000001) > 0; + bool charging = (keyTurnerState.criticalBatteryState & 0b00000010) > 0; + uint8_t level = (keyTurnerState.criticalBatteryState & 0b11111100) >> 1; + if(_firstTunerStatePublish || keyTurnerState.criticalBatteryState != lastKeyTurnerState.criticalBatteryState) { - bool critical = (keyTurnerState.criticalBatteryState & 0b00000001) > 0; publishBool(mqtt_topic_battery_critical, critical); - - bool charging = (keyTurnerState.criticalBatteryState & 0b00000010) > 0; publishBool(mqtt_topic_battery_charging, charging); - - uint8_t level = (keyTurnerState.criticalBatteryState & 0b11111100) >> 1; publishInt(mqtt_topic_battery_level, level); } + json["battery_critical"] = critical; + json["battery_charging"] = charging; + json["battery_level"] = level; + + bool keypadBatteryCritical; + + if ((keyTurnerState.accessoryBatteryState & (1 << 7)) != 0) { + keypadBatteryCritical = (keyTurnerState.accessoryBatteryState & (1 << 6)) != 0); + } + else + { + keypadBatteryCritical = false; + } + if(_firstTunerStatePublish || keyTurnerState.accessoryBatteryState != lastKeyTurnerState.accessoryBatteryState) { - if ((keyTurnerState.accessoryBatteryState & (1 << 7)) != 0) { - publishBool(mqtt_topic_battery_keypad_critical, (keyTurnerState.accessoryBatteryState & (1 << 6)) != 0); - } - else - { - publishBool(mqtt_topic_battery_keypad_critical, false); - } + publishBool(mqtt_topic_battery_keypad_critical, keypadBatteryCritical); } + json["keypad_battery_critical"] = keypadBatteryCritical; + _firstTunerStatePublish = false; } diff --git a/NetworkOpener.cpp b/NetworkOpener.cpp index 38dc947..71c6788 100644 --- a/NetworkOpener.cpp +++ b/NetworkOpener.cpp @@ -271,7 +271,7 @@ void NetworkOpener::publishKeyTurnerState(const NukiOpener::OpenerState& keyTurn publishBool(mqtt_topic_battery_critical, critical); } - json["battery_critical"] = critical; + json["battery_critical"] = critical; serializeJson(json, _buffer, _bufferSize); publishString(mqtt_topic_lock_json, _buffer);