From 6a427b513d7a81366845a39ab0bc4ecdd37e1999 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Fri, 15 Mar 2024 18:21:17 +0100 Subject: [PATCH] Added sensors to LNG format --- src/LNG.cpp | 132 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 99 insertions(+), 33 deletions(-) diff --git a/src/LNG.cpp b/src/LNG.cpp index e7e5ee4a..564e469a 100644 --- a/src/LNG.cpp +++ b/src/LNG.cpp @@ -22,50 +22,109 @@ LNG::LNG(const char* payload, uint8_t useMeterType, MeterConfig* meterConfig, Da uint64_t o180 = 0, o280 = 0; uint64_t o181 = 0, o182 = 0; uint64_t o281 = 0, o282 = 0; + uint64_t o380 = 0, o480 = 0; + uint64_t o580 = 0, o680 = 0; + uint64_t o780 = 0, o880 = 0; LngObisDescriptor* descriptor = (LngObisDescriptor*) ptr; for(uint8_t x = 0; x < h->arrayLength-1; x++) { ptr = (uint8_t*) &descriptor[1]; descriptor = (LngObisDescriptor*) ptr; CosemData* item = (CosemData*) data; - if(descriptor->obis[2] == 1) { - if(descriptor->obis[3] == 7) { - if(descriptor->obis[4] == 0) { - o170 = getNumber(item); + if(descriptor->obis[3] == 7) { + if(descriptor->obis[4] == 0) { + if(descriptor->obis[2] > 1) { + listType = listType >= 2 ? listType : 2; + } else { listType = listType >= 1 ? listType : 1; } - } else if(descriptor->obis[3] == 8) { - if(descriptor->obis[4] == 0) { - o180 = getNumber(item); - listType = listType >= 3 ? listType : 3; - activeImportCounter = o180 / 1000.0; - } else if(descriptor->obis[4] == 1) { - o181 = getNumber(item); - listType = listType >= 3 ? listType : 3; - } else if(descriptor->obis[4] == 2) { - o182 = getNumber(item); - listType = listType >= 3 ? listType : 3; + switch(descriptor->obis[2]) { + case 1: + o170 = getNumber(item); + break; + case 2: + o270 = getNumber(item); + break; + case 3: + reactiveImportPower = getNumber(item); + break; + case 4: + reactiveExportPower = getNumber(item); + break; + case 31: + l1current = getNumber(item) / 100.0; + break; + case 51: + l2current = getNumber(item) / 100.0; + break; + case 71: + l3current = getNumber(item) / 100.0; + break; + case 32: + l1voltage = getNumber(item) / 10.0; + break; + case 52: + l2voltage = getNumber(item) / 10.0; + break; + case 72: + l3voltage = getNumber(item) / 10.0; + break; } - } - } else if(descriptor->obis[2] == 2) { - if(descriptor->obis[3] == 7) { - if(descriptor->obis[4] == 0) { - o270 = getNumber(item); - listType = listType >= 2 ? listType : 2; + } + } else if(descriptor->obis[3] == 8) { + listType = listType >= 3 ? listType : 3; + if(descriptor->obis[4] == 0) { + switch(descriptor->obis[2]) { + case 1: + o180 = getNumber(item); + activeImportCounter = o180 / 1000.0; + break; + case 2: + o280 = getNumber(item); + activeExportCounter = o280 / 1000.0; + break; + case 3: + o380 = getNumber(item); + reactiveImportCounter = o380 / 1000.0; + break; + case 4: + o480 = getNumber(item); + reactiveExportCounter = o480 / 1000.0; + break; + case 5: + o580 = getNumber(item); + break; + case 6: + o680 = getNumber(item); + break; + case 7: + o780 = getNumber(item); + break; + case 8: + o880 = getNumber(item); + break; } - } else if(descriptor->obis[3] == 8) { - if(descriptor->obis[4] == 0) { - o280 = getNumber(item); - listType = listType >= 3 ? listType : 3; - activeExportCounter = o280 / 1000.0; - } else if(descriptor->obis[4] == 1) { - o281 = getNumber(item); - listType = listType >= 3 ? listType : 3; - } else if(descriptor->obis[4] == 2) { - o282 = getNumber(item); - listType = listType >= 3 ? listType : 3; + } else if(descriptor->obis[4] == 1) { + listType = listType >= 3 ? listType : 3; + switch(descriptor->obis[2]) { + case 1: + o181 = getNumber(item); + break; + case 2: + o281 = getNumber(item); + break; } - } + } else if(descriptor->obis[4] == 2) { + listType = listType >= 3 ? listType : 3; + switch(descriptor->obis[2]) { + case 1: + o182 = getNumber(item); + break; + case 2: + o282 = getNumber(item); + break; + } + } } else if(descriptor->obis[2] == 96) { if(descriptor->obis[3] == 1) { if(descriptor->obis[4] == 0) { @@ -101,6 +160,13 @@ LNG::LNG(const char* payload, uint8_t useMeterType, MeterConfig* meterConfig, Da activeExportCounter = (o281 + o282) / 1000.0; } + if(o580 > 0 || o680 > 0) { + reactiveImportCounter = (o580 + o680) / 1000.0; + } + if(o780 > 0 || o880 > 0) { + reactiveExportCounter = (o780 + o880) / 1000.0; + } + if((*data) == 0x09) { data += (*(data+1))+2; } else if((*data) == 0x15) {