diff --git a/include/MqttPublishing.h b/include/MqttPublishing.h new file mode 100644 index 0000000..3c15c36 --- /dev/null +++ b/include/MqttPublishing.h @@ -0,0 +1,16 @@ +#pragma once + +#include +#include +#include + +class MqttPublishingClass { +public: + void init(); + void loop(); + +private: + void publishField(String subtopic, std::shared_ptr inv, uint8_t channel, uint8_t fieldId); +}; + +extern MqttPublishingClass MqttPublishing; \ No newline at end of file diff --git a/src/MqttPublishing.cpp b/src/MqttPublishing.cpp new file mode 100644 index 0000000..471087a --- /dev/null +++ b/src/MqttPublishing.cpp @@ -0,0 +1,65 @@ +#include "MqttPublishing.h" +#include "Configuration.h" +#include "MqttSettings.h" +#include + +MqttPublishingClass MqttPublishing; + +void MqttPublishingClass::init() +{ +} + +void MqttPublishingClass::loop() +{ + if (!MqttSettings.getConnected() && Hoymiles.getRadio()->isIdle()) { + return; + } + + CONFIG_T& config = Configuration.get(); + + EVERY_N_SECONDS(config.Dtu_PollInterval) + { + MqttSettings.publish("dtu/uptime", String(millis() / 1000)); + MqttSettings.publish("dtu/ip", WiFi.localIP().toString()); + + // Loop all inverters + for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) { + auto inv = Hoymiles.getInverterByPos(i); + + char buffer[sizeof(uint64_t) * 8 + 1]; + sprintf(buffer, "%0lx%08lx", + ((uint32_t)((config.Inverter[i].Serial >> 32) & 0xFFFFFFFF)), + ((uint32_t)(config.Inverter[i].Serial & 0xFFFFFFFF))); + String subtopic = String(buffer); + + MqttSettings.publish(subtopic + "/name", inv->name()); + + // Loop all channels + for (uint8_t c = 0; c <= inv->getChannelCount(); c++) { + publishField(subtopic, inv, c, FLD_UDC); + publishField(subtopic, inv, c, FLD_IDC); + publishField(subtopic, inv, c, FLD_PDC); + publishField(subtopic, inv, c, FLD_YD); + publishField(subtopic, inv, c, FLD_YW); + publishField(subtopic, inv, c, FLD_YT); + publishField(subtopic, inv, c, FLD_UAC); + publishField(subtopic, inv, c, FLD_IAC); + publishField(subtopic, inv, c, FLD_PAC); + publishField(subtopic, inv, c, FLD_F); + publishField(subtopic, inv, c, FLD_T); + publishField(subtopic, inv, c, FLD_PCT); + publishField(subtopic, inv, c, FLD_EFF); + publishField(subtopic, inv, c, FLD_IRR); + } + + yield(); + } + } +} + +void MqttPublishingClass::publishField(String subtopic, std::shared_ptr inv, uint8_t channel, uint8_t fieldId) +{ + if (inv->hasValue(channel, fieldId)) { + MqttSettings.publish(subtopic + "/" + String(channel) + "/" + inv->getName(channel, fieldId), String(inv->getValue(channel, fieldId))); + } +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 00ec035..75b7ecd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,6 @@ #include "Configuration.h" #include "Hoymiles.h" +#include "MqttPublishing.h" #include "MqttSettings.h" #include "NtpSettings.h" #include "WebApi.h" @@ -56,6 +57,7 @@ void setup() // Initialize MqTT Serial.print(F("Initialize MqTT... ")); MqttSettings.init(); + MqttPublishing.init(); Serial.println(F("done")); // Initialize WebApi @@ -84,6 +86,9 @@ void setup() void loop() { WiFiSettings.loop(); - + yield(); Hoymiles.loop(); + yield(); + MqttPublishing.loop(); + yield(); } \ No newline at end of file