From 2f3362b76c032681060830c7c71091c7077f1b3b Mon Sep 17 00:00:00 2001 From: technyon Date: Thu, 31 Mar 2022 20:54:23 +0200 Subject: [PATCH] publish information from critical battery state --- MqttTopics.h | 3 +++ Network.cpp | 14 ++++++++++++++ Network.h | 2 ++ Nuki.cpp | 8 ++++++++ 4 files changed, 27 insertions(+) diff --git a/MqttTopics.h b/MqttTopics.h index 1e86c96..d6290d5 100644 --- a/MqttTopics.h +++ b/MqttTopics.h @@ -1,5 +1,8 @@ #pragma once +#define mqtt_topic_battery_level "nuki/battery/level" +#define mqtt_topic_battery_critical "nuki/battery/critical" +#define mqtt_topic_battery_charging "nuki/battery/charging" #define mqtt_topic_battery_voltage "nuki/battery/voltage" #define mqtt_topic_battery_drain "nuki/battery/drain" #define mqtt_topic_battery_max_turn_current "nuki/battery/maxTurnCurrent" diff --git a/Network.cpp b/Network.cpp index 7eafc19..39eb38b 100644 --- a/Network.cpp +++ b/Network.cpp @@ -161,6 +161,13 @@ void Network::publishBatteryReport(const BatteryReport& batteryReport) publishFloat(mqtt_topic_battery_max_turn_current, (float)batteryReport.maxTurnCurrent / 1000.0); } +void Network::publishCriticalBattery(uint8_t level, bool isCritical, bool isCharging) +{ + publishInt(mqtt_topic_battery_level, level); // milliwatt seconds + publishBool(mqtt_topic_battery_critical, isCritical); + publishBool(mqtt_topic_battery_charging, isCharging); +} + void Network::publishFloat(const char* topic, const float value, const uint8_t precision) { char str[30]; @@ -175,6 +182,13 @@ void Network::publishInt(const char *topic, const int value) _mqttClient.publish(topic, str); } +void Network::publishBool(const char *topic, const bool value) +{ + char str[2] = {0}; + str[0] = value ? '1' : '0'; + _mqttClient.publish(topic, str); +} + bool Network::isMqttConnected() { return _mqttConnected; diff --git a/Network.h b/Network.h index eeb5072..aa1802a 100644 --- a/Network.h +++ b/Network.h @@ -19,6 +19,7 @@ public: void publishKeyTurnerState(const char* state, const char* trigger, const char* completionStatus); void publishDoorSensorState(const char* state); void publishBatteryReport(const BatteryReport& batteryReport); + void publishCriticalBattery(uint8_t level, bool isCritical, bool isCharging); void setLockActionReceived(void (*lockActionReceivedCallback)(const char* value)); @@ -28,6 +29,7 @@ private: void publishFloat(const char* topic, const float value, const uint8_t precision = 2); void publishInt(const char* topic, const int value); + void publishBool(const char* topic, const bool value); bool reconnect(); diff --git a/Nuki.cpp b/Nuki.cpp index 099216b..d81f7ae 100644 --- a/Nuki.cpp +++ b/Nuki.cpp @@ -109,6 +109,14 @@ void Nuki::updateKeyTurnerState() _network->publishDoorSensorState(doorSensorStateStr); } + if(_keyTurnerState.criticalBatteryState != _lastKeyTurnerState.criticalBatteryState) + { + uint8_t level = (_keyTurnerState.criticalBatteryState & 0b11111100) >> 1; + bool critical = (_keyTurnerState.criticalBatteryState & 0b00000001) > 0; + bool charging = (_keyTurnerState.criticalBatteryState & 0b00000010) > 0; + _network->publishCriticalBattery(level, critical, charging); + } + memcpy(&_lastKeyTurnerState, &_keyTurnerState, sizeof(KeyTurnerState)); }