summaryrefslogtreecommitdiff
path: root/include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module
diff options
context:
space:
mode:
Diffstat (limited to 'include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module')
-rw-r--r--include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module/diagnostics.cpp56
-rw-r--r--include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module/diagnostics.h49
2 files changed, 105 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));
+ }
+}
+
+}
diff --git a/include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module/diagnostics.h b/include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module/diagnostics.h
new file mode 100644
index 0000000..bb7a81a
--- /dev/null
+++ b/include/pio/libs/mqtt_module_diagnostics/homekit/mqtt/module/diagnostics.h
@@ -0,0 +1,49 @@
+#ifndef HOMEKIT_LIB_MQTT_MODULE_DIAGNOSTICS_H
+#define HOMEKIT_LIB_MQTT_MODULE_DIAGNOSTICS_H
+
+#include <stdint.h>
+#include <homekit/mqtt/module.h>
+
+namespace homekit::mqtt {
+
+struct DiagnosticsFlags {
+ uint8_t state: 1;
+ uint8_t config_changed_value_present: 1;
+ uint8_t config_changed: 1;
+ uint8_t reserved: 5;
+} __attribute__((packed));
+
+struct MqttInitialDiagnosticsPayload {
+ uint32_t ip;
+ uint8_t fw_version;
+ int8_t rssi;
+ uint32_t free_heap;
+ DiagnosticsFlags flags;
+} __attribute__((packed));
+
+struct MqttDiagnosticsPayload {
+ int8_t rssi;
+ uint32_t free_heap;
+ DiagnosticsFlags flags;
+} __attribute__((packed));
+
+
+class MqttDiagnosticsModule: public MqttModule {
+private:
+ bool initialSent;
+
+ void sendDiagnostics(Mqtt& mqtt);
+
+public:
+ MqttDiagnosticsModule()
+ : MqttModule(30)
+ , initialSent(false) {}
+
+ void onConnect(Mqtt& mqtt) override;
+ void onDisconnect(Mqtt& mqtt, espMqttClientTypes::DisconnectReason reason) override;
+ void tick(Mqtt& mqtt) override;
+};
+
+}
+
+#endif //HOMEKIT_LIB_MQTT_MODULE_DIAGNOSTICS_H