Merge pull request #613 from cnrd/phase-accumlation

Added support for getting accumulated energy for phases (Kamstrup)
This commit is contained in:
Gunnar Skjold
2024-01-06 19:53:10 +01:00
committed by GitHub
5 changed files with 102 additions and 0 deletions

View File

@@ -61,6 +61,14 @@ public:
float getL2ActiveExportPower();
float getL3ActiveExportPower();
double getL1ActiveImportCounter();
double getL2ActiveImportCounter();
double getL3ActiveImportCounter();
double getL1ActiveExportCounter();
double getL2ActiveExportCounter();
double getL3ActiveExportCounter();
double getActiveImportCounter();
double getReactiveImportCounter();
double getActiveExportCounter();
@@ -84,6 +92,8 @@ protected:
float l1voltage = 0, l2voltage = 0, l3voltage = 0, l1current = 0, l2current = 0, l3current = 0;
float l1activeImportPower = 0, l2activeImportPower = 0, l3activeImportPower = 0;
float l1activeExportPower = 0, l2activeExportPower = 0, l3activeExportPower = 0;
double l1activeImportCounter = 0, l2activeImportCounter = 0, l3activeImportCounter;
double l1activeExportCounter = 0, l2activeExportCounter = 0, l3activeExportCounter;
float powerFactor = 0, l1PowerFactor = 0, l2PowerFactor = 0, l3PowerFactor = 0;
double activeImportCounter = 0, reactiveImportCounter = 0, activeExportCounter = 0, reactiveExportCounter = 0;
bool threePhase = false, twoPhase = false, counterEstimated = false, l2currentMissing = false;;

View File

@@ -51,6 +51,12 @@ void AmsData::apply(AmsData& other) {
this->l1activeExportPower = other.getL1ActiveExportPower();
this->l2activeExportPower = other.getL2ActiveExportPower();
this->l3activeExportPower = other.getL3ActiveExportPower();
this->l1activeImportCounter = other.getL1ActiveImportCounter();
this->l2activeImportCounter = other.getL2ActiveImportCounter();
this->l3activeImportCounter = other.getL3ActiveImportCounter();
this->l1activeExportCounter = other.getL1ActiveExportCounter();
this->l2activeExportCounter = other.getL2ActiveExportCounter();
this->l3activeExportCounter = other.getL3ActiveExportCounter();
case 3:
this->meterTimestamp = other.getMeterTimestamp();
this->activeImportCounter = other.getActiveImportCounter();
@@ -195,6 +201,30 @@ float AmsData::getL3ActiveExportPower() {
return this->l3activeExportPower;
}
double AmsData::getL1ActiveImportCounter() {
return this->l1activeImportCounter;
}
double AmsData::getL2ActiveImportCounter() {
return this->l2activeImportCounter;
}
double AmsData::getL3ActiveImportCounter() {
return this->l3activeImportCounter;
}
double AmsData::getL1ActiveExportCounter() {
return this->l1activeExportCounter;
}
double AmsData::getL2ActiveExportCounter() {
return this->l2activeExportCounter;
}
double AmsData::getL3ActiveExportCounter() {
return this->l3activeExportCounter;
}
double AmsData::getActiveImportCounter() {
return this->activeImportCounter;
}

View File

@@ -106,6 +106,24 @@ bool RawMqttHandler::publishList4(AmsData* data, AmsData* meterState) {
if(full || meterState->getL3ActiveExportPower() != data->getL3ActiveExportPower()) {
mqtt.publish(topic + "/meter/export/l3", String(data->getL3ActiveExportPower(), 2));
}
if(full || meterState->getL1ActiveImportCounter() != data->getL1ActiveImportCounter()) {
mqtt->publish(topic + "/meter/import/l1/accumulated", String(data->getL1ActiveImportCounter(), 2));
}
if(full || meterState->getL2ActiveImportCounter() != data->getL2ActiveImportCounter()) {
mqtt->publish(topic + "/meter/import/l2/accumulated", String(data->getL2ActiveImportCounter(), 2));
}
if(full || meterState->getL3ActiveImportCounter() != data->getL3ActiveImportCounter()) {
mqtt->publish(topic + "/meter/import/l3/accumulated", String(data->getL3ActiveImportCounter(), 2));
}
if(full || meterState->getL1ActiveExportCounter() != data->getL1ActiveExportCounter()) {
mqtt->publish(topic + "/meter/export/l1/accumulated", String(data->getL1ActiveExportCounter(), 2));
}
if(full || meterState->getL2ActiveExportCounter() != data->getL2ActiveExportCounter()) {
mqtt->publish(topic + "/meter/export/l2/accumulated", String(data->getL2ActiveExportCounter(), 2));
}
if(full || meterState->getL3ActiveExportCounter() != data->getL3ActiveExportCounter()) {
mqtt->publish(topic + "/meter/export/l3/accumulated", String(data->getL3ActiveExportCounter(), 2));
}
if(full || meterState->getPowerFactor() != data->getPowerFactor()) {
mqtt.publish(topic + "/meter/powerfactor", String(data->getPowerFactor(), 2));
}

View File

@@ -407,6 +407,38 @@ IEC6205675::IEC6205675(const char* d, uint8_t useMeterType, MeterConfig* meterCo
listType = 4;
l3activeExportPower = val;
}
val = getNumber(AMS_OBIS_ACTIVE_IMPORT_L1_COUNT, sizeof(AMS_OBIS_ACTIVE_IMPORT_L1_COUNT), ((char *) (d)));
if (val != NOVALUE) {
listType = 4;
l1activeImportCounter = val/1000;
}
val = getNumber(AMS_OBIS_ACTIVE_IMPORT_L2_COUNT, sizeof(AMS_OBIS_ACTIVE_IMPORT_L2_COUNT), ((char *) (d)));
if (val != NOVALUE) {
listType = 4;
l2activeImportCounter = val/1000;
}
val = getNumber(AMS_OBIS_ACTIVE_IMPORT_L3_COUNT, sizeof(AMS_OBIS_ACTIVE_IMPORT_L3_COUNT), ((char *) (d)));
if (val != NOVALUE) {
listType = 4;
l3activeImportCounter = val/1000;
}
val = getNumber(AMS_OBIS_ACTIVE_EXPORT_L1_COUNT, sizeof(AMS_OBIS_ACTIVE_EXPORT_L1_COUNT), ((char *) (d)));
if (val != NOVALUE) {
listType = 4;
l1activeExportCounter = val/1000;
}
val = getNumber(AMS_OBIS_ACTIVE_EXPORT_L2_COUNT, sizeof(AMS_OBIS_ACTIVE_EXPORT_L2_COUNT), ((char *) (d)));
if (val != NOVALUE) {
listType = 4;
l2activeExportCounter = val/1000;
}
val = getNumber(AMS_OBIS_ACTIVE_EXPORT_L2_COUNT, sizeof(AMS_OBIS_ACTIVE_EXPORT_L2_COUNT), ((char *) (d)));
if (val != NOVALUE) {
listType = 4;
l3activeExportCounter = val/1000;
}
if(meterType == AmsTypeKamstrup) {
if(listType >= 3) {
@@ -414,6 +446,12 @@ IEC6205675::IEC6205675(const char* d, uint8_t useMeterType, MeterConfig* meterCo
activeExportCounter *= 10;
reactiveImportCounter *= 10;
reactiveExportCounter *= 10;
l1activeImportCounter *= 10;
l2activeImportCounter *= 10;
l3activeImportCounter *= 10;
l1activeExportCounter *= 10;
l2activeExportCounter *= 10;
l3activeExportCounter *= 10;
}
if(l1current != 0)
l1current /= 100;

View File

@@ -55,6 +55,12 @@ private:
uint8_t AMS_OBIS_ACTIVE_EXPORT_L1[4] = { 22, 7, 0, 255 };
uint8_t AMS_OBIS_ACTIVE_EXPORT_L2[4] = { 42, 7, 0, 255 };
uint8_t AMS_OBIS_ACTIVE_EXPORT_L3[4] = { 62, 7, 0, 255 };
uint8_t AMS_OBIS_ACTIVE_IMPORT_L1_COUNT[4] = { 21, 8, 0, 255 };
uint8_t AMS_OBIS_ACTIVE_IMPORT_L2_COUNT[4] = { 41, 8, 0, 255 };
uint8_t AMS_OBIS_ACTIVE_IMPORT_L3_COUNT[4] = { 61, 8, 0, 255 };
uint8_t AMS_OBIS_ACTIVE_EXPORT_L1_COUNT[4] = { 22, 8, 0, 255 };
uint8_t AMS_OBIS_ACTIVE_EXPORT_L2_COUNT[4] = { 42, 8, 0, 255 };
uint8_t AMS_OBIS_ACTIVE_EXPORT_L3_COUNT[4] = { 62, 8, 0, 255 };
};
#endif