diff --git a/include/MqttHandleInverterTotal.h b/include/MqttHandleInverterTotal.h index fa4ce4b6..1ff9567d 100644 --- a/include/MqttHandleInverterTotal.h +++ b/include/MqttHandleInverterTotal.h @@ -1,15 +1,16 @@ // SPDX-License-Identifier: GPL-2.0-or-later #pragma once -#include +#include class MqttHandleInverterTotalClass { public: - void init(); - void loop(); + void init(Scheduler* scheduler); private: - TimeoutHelper _lastPublish; + void loop(); + + Task _loopTask; }; extern MqttHandleInverterTotalClass MqttHandleInverterTotal; \ No newline at end of file diff --git a/src/MqttHandleInverterTotal.cpp b/src/MqttHandleInverterTotal.cpp index 5e18acd4..45b2c9bb 100644 --- a/src/MqttHandleInverterTotal.cpp +++ b/src/MqttHandleInverterTotal.cpp @@ -10,26 +10,30 @@ MqttHandleInverterTotalClass MqttHandleInverterTotal; -void MqttHandleInverterTotalClass::init() +void MqttHandleInverterTotalClass::init(Scheduler* scheduler) { - _lastPublish.set(Configuration.get().Mqtt.PublishInterval * 1000); + scheduler->addTask(_loopTask); + _loopTask.setCallback(std::bind(&MqttHandleInverterTotalClass::loop, this)); + _loopTask.setIterations(TASK_FOREVER); + _loopTask.setInterval(Configuration.get().Mqtt.PublishInterval * TASK_SECOND); + _loopTask.enable(); } void MqttHandleInverterTotalClass::loop() { + // Update interval from config + _loopTask.setInterval(Configuration.get().Mqtt.PublishInterval * TASK_SECOND); + if (!MqttSettings.getConnected() || !Hoymiles.isAllRadioIdle()) { + _loopTask.forceNextIteration(); return; } - if (_lastPublish.occured()) { - MqttSettings.publish("ac/power", String(Datastore.getTotalAcPowerEnabled(), Datastore.getTotalAcPowerDigits())); - MqttSettings.publish("ac/yieldtotal", String(Datastore.getTotalAcYieldTotalEnabled(), Datastore.getTotalAcYieldTotalDigits())); - MqttSettings.publish("ac/yieldday", String(Datastore.getTotalAcYieldDayEnabled(), Datastore.getTotalAcYieldDayDigits())); - MqttSettings.publish("ac/is_valid", String(Datastore.getIsAllEnabledReachable())); - MqttSettings.publish("dc/power", String(Datastore.getTotalDcPowerEnabled(), Datastore.getTotalDcPowerDigits())); - MqttSettings.publish("dc/irradiation", String(Datastore.getTotalDcIrradiation(), 3)); - MqttSettings.publish("dc/is_valid", String(Datastore.getIsAllEnabledReachable())); - - _lastPublish.set(Configuration.get().Mqtt.PublishInterval * 1000); - } + MqttSettings.publish("ac/power", String(Datastore.getTotalAcPowerEnabled(), Datastore.getTotalAcPowerDigits())); + MqttSettings.publish("ac/yieldtotal", String(Datastore.getTotalAcYieldTotalEnabled(), Datastore.getTotalAcYieldTotalDigits())); + MqttSettings.publish("ac/yieldday", String(Datastore.getTotalAcYieldDayEnabled(), Datastore.getTotalAcYieldDayDigits())); + MqttSettings.publish("ac/is_valid", String(Datastore.getIsAllEnabledReachable())); + MqttSettings.publish("dc/power", String(Datastore.getTotalDcPowerEnabled(), Datastore.getTotalDcPowerDigits())); + MqttSettings.publish("dc/irradiation", String(Datastore.getTotalDcIrradiation(), 3)); + MqttSettings.publish("dc/is_valid", String(Datastore.getIsAllEnabledReachable())); } diff --git a/src/main.cpp b/src/main.cpp index a7b1fbf4..b2072eec 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -101,7 +101,7 @@ void setup() MqttSettings.init(); MqttHandleDtu.init(); MqttHandleInverter.init(); - MqttHandleInverterTotal.init(); + MqttHandleInverterTotal.init(&scheduler); MqttHandleHass.init(); MessageOutput.println("done"); @@ -161,8 +161,6 @@ void loop() yield(); MqttHandleInverter.loop(); yield(); - MqttHandleInverterTotal.loop(); - yield(); MqttHandleHass.loop(); yield(); WebApi.loop();