* add support for energy & power readings on SML based power meters, taking OBIS 16.7.1 for power (using mod. SML Parser lib. by olliiiver) * switched SML read to use software serial * made total power meter response controled by meter source to obtain either the sum of phase powers or explicit total power provided by meter * made mqtt subscriptions to power meter topics meter source dependend * simplified SML read loop and OBIS handler registration, + minor refactoring * minor cleanup/style changes and optim. PowerMeter * fixed build, add SOURCE_SML == 4 * removed optional usage of HW serial for SML power meter * switched to usage of _powerMeter1Power for SML power reading to allign better with existing code --------- Co-authored-by: helgeerbe <helge@erbehome.de>
72 lines
1.7 KiB
C++
72 lines
1.7 KiB
C++
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
#pragma once
|
|
|
|
#include "Configuration.h"
|
|
#include <espMqttClient.h>
|
|
#include <Arduino.h>
|
|
#include <Hoymiles.h>
|
|
#include <memory>
|
|
#include "SDM.h"
|
|
#include "sml.h"
|
|
|
|
#ifndef SDM_RX_PIN
|
|
#define SDM_RX_PIN 13
|
|
#endif
|
|
|
|
#ifndef SDM_TX_PIN
|
|
#define SDM_TX_PIN 32
|
|
#endif
|
|
|
|
#ifndef SML_RX_PIN
|
|
#define SML_RX_PIN 35
|
|
#endif
|
|
|
|
typedef struct {
|
|
const unsigned char OBIS[6];
|
|
void (*Fn)(double&);
|
|
float* Arg;
|
|
} OBISHandler;
|
|
|
|
class PowerMeterClass {
|
|
public:
|
|
enum SOURCE {
|
|
SOURCE_MQTT = 0,
|
|
SOURCE_SDM1PH = 1,
|
|
SOURCE_SDM3PH = 2,
|
|
SOURCE_HTTP = 3,
|
|
SOURCE_SML = 4
|
|
};
|
|
void init();
|
|
void mqtt();
|
|
void loop();
|
|
void onMqttMessage(const espMqttClientTypes::MessageProperties& properties, const char* topic, const uint8_t* payload, size_t len, size_t index, size_t total);
|
|
float getPowerTotal();
|
|
uint32_t getLastPowerMeterUpdate();
|
|
|
|
private:
|
|
uint32_t _interval;
|
|
uint32_t _lastPowerMeterCheck;
|
|
// Used in Power limiter for safety check
|
|
uint32_t _lastPowerMeterUpdate;
|
|
|
|
float _powerMeter1Power = 0.0;
|
|
float _powerMeter2Power = 0.0;
|
|
float _powerMeter3Power = 0.0;
|
|
float _powerMeter1Voltage = 0.0;
|
|
float _powerMeter2Voltage = 0.0;
|
|
float _powerMeter3Voltage = 0.0;
|
|
float _powerMeterImport = 0.0;
|
|
float _powerMeterExport = 0.0;
|
|
|
|
bool mqttInitDone = false;
|
|
|
|
bool smlReadLoop();
|
|
const std::list<OBISHandler> smlHandlerList{
|
|
{{0x01, 0x00, 0x10, 0x07, 0x00, 0xff}, &smlOBISW, &_powerMeter1Power},
|
|
{{0x01, 0x00, 0x01, 0x08, 0x00, 0xff}, &smlOBISWh, &_powerMeterImport},
|
|
{{0x01, 0x00, 0x02, 0x08, 0x00, 0xff}, &smlOBISWh, &_powerMeterExport}
|
|
};
|
|
};
|
|
|
|
extern PowerMeterClass PowerMeter;
|