aboutsummaryrefslogtreecommitdiff
path: root/include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module/diagnostics.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module/diagnostics.cpp')
-rw-r--r--include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module/diagnostics.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module/diagnostics.cpp b/include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module/diagnostics.cpp
new file mode 100644
index 0000000..e0f797e
--- /dev/null
+++ b/include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module/diagnostics.cpp
@@ -0,0 +1,56 @@
+#include "./diagnostics.h"
+#include <homekit/wifi.h>
+#include <ESP8266WiFi.h>
+
+namespace homekit::mqtt {
+
+static const char TOPIC_DIAGNOSTICS[] = "diag";
+static const char TOPIC_INITIAL_DIAGNOSTICS[] = "d1ag";
+
+void MqttDiagnosticsModule::onConnect(Mqtt &mqtt) {
+ sendDiagnostics(mqtt);
+}
+
+void MqttDiagnosticsModule::onDisconnect(Mqtt &mqtt, espMqttClientTypes::DisconnectReason reason) {
+ initialSent = false;
+}
+
+void MqttDiagnosticsModule::tick(Mqtt& mqtt) {
+ if (!tickElapsed())
+ return;
+ sendDiagnostics(mqtt);
+}
+
+void MqttDiagnosticsModule::sendDiagnostics(Mqtt& mqtt) {
+ auto cfg = config::read();
+
+ if (!initialSent) {
+ MqttInitialDiagnosticsPayload stat{
+ .ip = wifi::getIPAsInteger(),
+ .fw_version = CONFIG_FW_VERSION,
+ .rssi = wifi::getRSSI(),
+ .free_heap = ESP.getFreeHeap(),
+ .flags = DiagnosticsFlags{
+ .state = 1,
+ .config_changed_value_present = 1,
+ .config_changed = static_cast<uint8_t>(cfg.flags.node_configured ||
+ cfg.flags.wifi_configured ? 1 : 0)
+ }
+ };
+ mqtt.publish(TOPIC_INITIAL_DIAGNOSTICS, reinterpret_cast<uint8_t*>(&stat), sizeof(stat));
+ initialSent = true;
+ } else {
+ MqttDiagnosticsPayload stat{
+ .rssi = wifi::getRSSI(),
+ .free_heap = ESP.getFreeHeap(),
+ .flags = DiagnosticsFlags{
+ .state = 1,
+ .config_changed_value_present = 0,
+ .config_changed = 0
+ }
+ };
+ mqtt.publish(TOPIC_DIAGNOSTICS, reinterpret_cast<uint8_t*>(&stat), sizeof(stat));
+ }
+}
+
+}