powermeter refactor: publish values to MQTT in base class

"powertotal" is always published and it is published by the base class
directly. other values are still published by the derived classes, but
use a base class method, which takes care that a common base topic is
used in particular.
This commit is contained in:
Bernhard Kirchen 2024-05-08 13:50:58 +02:00
parent 9eb4f1714c
commit d99cfd5b31
8 changed files with 28 additions and 46 deletions

View File

@ -37,6 +37,8 @@ protected:
void gotUpdate() { _lastUpdate = millis(); }
void mqttPublish(String const& topic, float const& value) const;
bool _verboseLogging;
private:

View File

@ -2,7 +2,6 @@
#include "Configuration.h"
#include "PowerMeterHttpJson.h"
#include "MessageOutput.h"
#include "MqttSettings.h"
#include <WiFiClientSecure.h>
#include <ArduinoJson.h>
#include "mbedtls/sha256.h"
@ -57,13 +56,9 @@ float PowerMeterHttpJson::getPowerTotal() const
void PowerMeterHttpJson::doMqttPublish() const
{
String topic = "powermeter";
auto power = getPowerTotal();
MqttSettings.publish(topic + "/power1", String(_powerValues[0]));
MqttSettings.publish(topic + "/power2", String(_powerValues[1]));
MqttSettings.publish(topic + "/power3", String(_powerValues[2]));
MqttSettings.publish(topic + "/powertotal", String(power));
mqttPublish("power1", _powerValues[0]);
mqttPublish("power2", _powerValues[1]);
mqttPublish("power3", _powerValues[2]);
}
bool PowerMeterHttpJson::queryPhase(int phase, PowerMeterHttpConfig const& config)

View File

@ -2,7 +2,6 @@
#include "Configuration.h"
#include "PowerMeterHttpSml.h"
#include "MessageOutput.h"
#include "MqttSettings.h"
#include <WiFiClientSecure.h>
#include <base64.h>
#include <ESPmDNS.h>
@ -15,10 +14,6 @@ float PowerMeterHttpSml::getPowerTotal() const
void PowerMeterHttpSml::doMqttPublish() const
{
String topic = "powermeter";
std::lock_guard<std::mutex> l(_mutex);
MqttSettings.publish(topic + "/powertotal", String(_activePower));
}
void PowerMeterHttpSml::loop()

View File

@ -63,12 +63,8 @@ float PowerMeterMqtt::getPowerTotal() const
void PowerMeterMqtt::doMqttPublish() const
{
String topic = "powermeter";
auto totalPower = getPowerTotal();
std::lock_guard<std::mutex> l(_mutex);
MqttSettings.publish(topic + "/power1", String(_powerValueOne));
MqttSettings.publish(topic + "/power2", String(_powerValueTwo));
MqttSettings.publish(topic + "/power3", String(_powerValueThree));
MqttSettings.publish(topic + "/powertotal", String(totalPower));
mqttPublish("power1", _powerValueOne);
mqttPublish("power2", _powerValueTwo);
mqttPublish("power3", _powerValueThree);
}

View File

@ -7,6 +7,11 @@ bool PowerMeterProvider::isDataValid() const
return _lastUpdate > 0 && ((millis() - _lastUpdate) < (30 * 1000));
}
void PowerMeterProvider::mqttPublish(String const& topic, float const& value) const
{
MqttSettings.publish("powermeter/" + topic, String(value));
}
void PowerMeterProvider::mqttLoop() const
{
if (!MqttSettings.getConnected()) { return; }
@ -16,6 +21,8 @@ void PowerMeterProvider::mqttLoop() const
auto constexpr halfOfAllMillis = std::numeric_limits<uint32_t>::max() / 2;
if ((_lastUpdate - _lastMqttPublish) > halfOfAllMillis) { return; }
mqttPublish("powertotal", getPowerTotal());
doMqttPublish();
_lastMqttPublish = millis();

View File

@ -3,7 +3,6 @@
#include "Configuration.h"
#include "PinMapping.h"
#include "MessageOutput.h"
#include "MqttSettings.h"
#include "SerialPortManager.h"
void PowerMeterSerialSdm::deinit()
@ -47,19 +46,15 @@ float PowerMeterSerialSdm::getPowerTotal() const
void PowerMeterSerialSdm::doMqttPublish() const
{
String topic = "powermeter";
auto power = getPowerTotal();
std::lock_guard<std::mutex> l(_mutex);
MqttSettings.publish(topic + "/power1", String(_phase1Power));
MqttSettings.publish(topic + "/power2", String(_phase2Power));
MqttSettings.publish(topic + "/power3", String(_phase3Power));
MqttSettings.publish(topic + "/powertotal", String(power));
MqttSettings.publish(topic + "/voltage1", String(_phase1Voltage));
MqttSettings.publish(topic + "/voltage2", String(_phase2Voltage));
MqttSettings.publish(topic + "/voltage3", String(_phase3Voltage));
MqttSettings.publish(topic + "/import", String(_energyImport));
MqttSettings.publish(topic + "/export", String(_energyExport));
mqttPublish("power1", _phase1Power);
mqttPublish("power2", _phase2Power);
mqttPublish("power3", _phase3Power);
mqttPublish("voltage1", _phase1Voltage);
mqttPublish("voltage2", _phase2Voltage);
mqttPublish("voltage3", _phase3Voltage);
mqttPublish("import", _energyImport);
mqttPublish("export", _energyExport);
}
void PowerMeterSerialSdm::loop()

View File

@ -3,7 +3,6 @@
#include "Configuration.h"
#include "PinMapping.h"
#include "MessageOutput.h"
#include "MqttSettings.h"
bool PowerMeterSerialSml::init()
{
@ -35,12 +34,9 @@ void PowerMeterSerialSml::deinit()
void PowerMeterSerialSml::doMqttPublish() const
{
String topic = "powermeter";
std::lock_guard<std::mutex> l(_mutex);
MqttSettings.publish(topic + "/powertotal", String(_activePower));
MqttSettings.publish(topic + "/import", String(_energyImport));
MqttSettings.publish(topic + "/export", String(_energyExport));
mqttPublish("import", _energyImport);
mqttPublish("export", _energyExport);
}
void PowerMeterSerialSml::loop()

View File

@ -4,7 +4,6 @@
*/
#include "PowerMeterUdpSmaHomeManager.h"
#include <Arduino.h>
#include "MqttSettings.h"
#include <WiFiUdp.h>
#include "MessageOutput.h"
@ -37,12 +36,9 @@ void PowerMeterUdpSmaHomeManager::deinit()
void PowerMeterUdpSmaHomeManager::doMqttPublish() const
{
String topic = "powermeter";
MqttSettings.publish(topic + "/powertotal", String(_powerMeterPower));
MqttSettings.publish(topic + "/power1", String(_powerMeterL1));
MqttSettings.publish(topic + "/power2", String(_powerMeterL2));
MqttSettings.publish(topic + "/power3", String(_powerMeterL3));
mqttPublish("power1", _powerMeterL1);
mqttPublish("power2", _powerMeterL2);
mqttPublish("power3", _powerMeterL3);
}
uint8_t* PowerMeterUdpSmaHomeManager::decodeGroup(uint8_t* offset, uint16_t grouplen)