diff --git a/lib/HanReader/src/Kamstrup.h b/lib/HanReader/src/Kamstrup.h index 7cb3470e..ef7db21b 100644 --- a/lib/HanReader/src/Kamstrup.h +++ b/lib/HanReader/src/Kamstrup.h @@ -5,10 +5,12 @@ enum class Kamstrup { + List1PhaseShort = 0x11, + List1PhaseLong = 0x1B, List3PhaseShort = 0x19, List3PhaseLong = 0x23, - List1PhaseShort = 0x11, - List1PhaseLong = 0x1B + List3PhaseITShort = 0x17, + List3PhaseITLong = 0x21 }; enum class Kamstrup_List3Phase @@ -83,5 +85,43 @@ enum class Kamstrup_List1Phase CumulativeReactiveExportEnergy }; +enum class Kamstrup_List3PhaseIT +{ + ListSize, + ListVersionIdentifier, + MeterID_OBIS, + MeterID, + MeterType_OBIS, + MeterType, + ActiveImportPower_OBIS, + ActiveImportPower, + ActiveExportPower_OBIS, + ActiveExportPower, + ReactiveImportPower_OBIS, + ReactiveImportPower, + ReactiveExportPower_OBIS, + ReactiveExportPower, + CurrentL1_OBIS, + CurrentL1, + CurrentL3_OBIS, + CurrentL3, + VoltageL1_OBIS, + VoltageL1, + VoltageL2_OBIS, + VoltageL2, + VoltageL3_OBIS, + VoltageL3, + MeterClock_OBIS, + MeterClock, + CumulativeActiveImportEnergy_OBIS, + CumulativeActiveImportEnergy, + CumulativeActiveExportEnergy_OBIS, + CumulativeActiveExportEnergy, + CumulativeReactiveImportEnergy_OBIS, + CumulativeReactiveImportEnergy, + CumulativeReactiveExportEnergy_OBIS, + CumulativeReactiveExportEnergy +}; + #endif diff --git a/src/AmsData.cpp b/src/AmsData.cpp index 7d6c6d47..4e209569 100644 --- a/src/AmsData.cpp +++ b/src/AmsData.cpp @@ -18,7 +18,7 @@ AmsData::AmsData(int meterType, bool substituteMissing, HanReader& hanReader) { extractFromAidon(hanReader, listSize, substituteMissing); break; case METER_TYPE_KAMSTRUP: - extractFromKamstrup(hanReader, listSize); + extractFromKamstrup(hanReader, listSize, substituteMissing); break; } @@ -176,13 +176,15 @@ void AmsData::extractFromAidon(HanReader& hanReader, int listSize, bool substitu } } -void AmsData::extractFromKamstrup(HanReader& hanReader, int listSize) { +void AmsData::extractFromKamstrup(HanReader& hanReader, int listSize, bool substituteMissing) { switch(listSize) { + case (int)Kamstrup::List3PhaseITShort: case (int)Kamstrup::List3PhaseShort: threePhase = true; case (int)Kamstrup::List1PhaseShort: listType = 2; break; + case (int)Kamstrup::List3PhaseITLong: case (int)Kamstrup::List3PhaseLong: threePhase = true; case (int)Kamstrup::List1PhaseLong: @@ -191,6 +193,23 @@ void AmsData::extractFromKamstrup(HanReader& hanReader, int listSize) { } switch(listSize) { + case (int)Kamstrup::List1PhaseLong: + meterTimestamp = hanReader.getTime( (int)Kamstrup_List1Phase::MeterClock); + activeImportCounter = ((double) hanReader.getInt((int)Kamstrup_List1Phase::CumulativeActiveImportEnergy)) / 100; + activeExportCounter = ((double) hanReader.getInt((int)Kamstrup_List1Phase::CumulativeActiveExportEnergy)) / 100; + reactiveImportCounter = ((double) hanReader.getInt((int)Kamstrup_List1Phase::CumulativeReactiveImportEnergy)) / 100; + reactiveExportCounter = ((double) hanReader.getInt((int)Kamstrup_List1Phase::CumulativeReactiveExportEnergy)) / 100; + case (int)Kamstrup::List1PhaseShort: + listId = hanReader.getString( (int)Kamstrup_List1Phase::ListVersionIdentifier); + meterId = hanReader.getString( (int)Kamstrup_List1Phase::MeterID); + meterType = hanReader.getString( (int)Kamstrup_List1Phase::MeterType); + activeImportPower = hanReader.getInt( (int)Kamstrup_List1Phase::ActiveImportPower); + reactiveImportPower = hanReader.getInt( (int)Kamstrup_List1Phase::ReactiveImportPower); + activeExportPower = hanReader.getInt( (int)Kamstrup_List1Phase::ActiveExportPower); + reactiveExportPower = hanReader.getInt( (int)Kamstrup_List1Phase::ReactiveExportPower); + l1current = ((double) hanReader.getInt((int)Kamstrup_List1Phase::CurrentL1)) / 100; + l1voltage = hanReader.getInt( (int)Kamstrup_List1Phase::VoltageL1); + break; case (int)Kamstrup::List3PhaseLong: meterTimestamp = hanReader.getTime( (int)Kamstrup_List3Phase::MeterClock); activeImportCounter = ((double) hanReader.getInt((int)Kamstrup_List3Phase::CumulativeActiveImportEnergy)) / 100; @@ -212,22 +231,29 @@ void AmsData::extractFromKamstrup(HanReader& hanReader, int listSize) { l2voltage = hanReader.getInt( (int)Kamstrup_List3Phase::VoltageL2); l3voltage = hanReader.getInt( (int)Kamstrup_List3Phase::VoltageL3); break; - case (int)Kamstrup::List1PhaseLong: - meterTimestamp = hanReader.getTime( (int)Kamstrup_List1Phase::MeterClock); - activeImportCounter = ((double) hanReader.getInt((int)Kamstrup_List1Phase::CumulativeActiveImportEnergy)) / 100; - activeExportCounter = ((double) hanReader.getInt((int)Kamstrup_List1Phase::CumulativeActiveExportEnergy)) / 100; - reactiveImportCounter = ((double) hanReader.getInt((int)Kamstrup_List1Phase::CumulativeReactiveImportEnergy)) / 100; - reactiveExportCounter = ((double) hanReader.getInt((int)Kamstrup_List1Phase::CumulativeReactiveExportEnergy)) / 100; - case (int)Kamstrup::List1PhaseShort: - listId = hanReader.getString( (int)Kamstrup_List1Phase::ListVersionIdentifier); - meterId = hanReader.getString( (int)Kamstrup_List1Phase::MeterID); - meterType = hanReader.getString( (int)Kamstrup_List1Phase::MeterType); - activeImportPower = hanReader.getInt( (int)Kamstrup_List1Phase::ActiveImportPower); - reactiveImportPower = hanReader.getInt( (int)Kamstrup_List1Phase::ReactiveImportPower); - activeExportPower = hanReader.getInt( (int)Kamstrup_List1Phase::ActiveExportPower); - reactiveExportPower = hanReader.getInt( (int)Kamstrup_List1Phase::ReactiveExportPower); - l1current = ((double) hanReader.getInt((int)Kamstrup_List1Phase::CurrentL1)) / 100; - l1voltage = hanReader.getInt( (int)Kamstrup_List1Phase::VoltageL1); + case (int)Kamstrup::List3PhaseITLong: + meterTimestamp = hanReader.getTime( (int)Kamstrup_List3Phase::MeterClock); + activeImportCounter = ((double) hanReader.getInt((int)Kamstrup_List3Phase::CumulativeActiveImportEnergy)) / 100; + activeExportCounter = ((double) hanReader.getInt((int)Kamstrup_List3Phase::CumulativeActiveExportEnergy)) / 100; + reactiveImportCounter = ((double) hanReader.getInt((int)Kamstrup_List3Phase::CumulativeReactiveImportEnergy)) / 100; + reactiveExportCounter = ((double) hanReader.getInt((int)Kamstrup_List3Phase::CumulativeReactiveExportEnergy)) / 100; + case (int)Kamstrup::List3PhaseITShort: + listId = hanReader.getString( (int)Kamstrup_List3Phase::ListVersionIdentifier); + meterId = hanReader.getString( (int)Kamstrup_List3Phase::MeterID); + meterType = hanReader.getString( (int)Kamstrup_List3Phase::MeterType); + activeImportPower = hanReader.getInt( (int)Kamstrup_List3Phase::ActiveImportPower); + reactiveImportPower = hanReader.getInt( (int)Kamstrup_List3Phase::ReactiveImportPower); + activeExportPower = hanReader.getInt( (int)Kamstrup_List3Phase::ActiveExportPower); + reactiveExportPower = hanReader.getInt( (int)Kamstrup_List3Phase::ReactiveExportPower); + l1current = ((double) hanReader.getInt((int)Kamstrup_List3Phase::CurrentL1)) / 100; + l2current = 0; + l3current = ((double) hanReader.getInt((int)Kamstrup_List3Phase::CurrentL3)) / 100; + l1voltage = hanReader.getInt( (int)Kamstrup_List3Phase::VoltageL1); + l2voltage = hanReader.getInt( (int)Kamstrup_List3Phase::VoltageL2); + l3voltage = hanReader.getInt( (int)Kamstrup_List3Phase::VoltageL3); + if(substituteMissing) { + l2current = ((activeImportPower * sqrt(3)) - (l1voltage * l1current) - (l3voltage * l3current)) / l2voltage; + } break; } } diff --git a/src/AmsData.h b/src/AmsData.h index 1e078d8d..409cd2f2 100644 --- a/src/AmsData.h +++ b/src/AmsData.h @@ -61,7 +61,7 @@ class AmsData { void extractFromKaifa(HanReader& hanReader, int listSize); void extractFromAidon(HanReader& hanReader, int listSize, bool substituteMissing); - void extractFromKamstrup(HanReader& hanReader, int listSize); + void extractFromKamstrup(HanReader& hanReader, int listSize, bool substituteMissing); }; #endif diff --git a/web/application.js b/web/application.js index 4cbf4133..89eefe18 100644 --- a/web/application.js +++ b/web/application.js @@ -59,7 +59,7 @@ $(function() { // For config-meter $('.subtitute-dependent').on('change', function() { console.log("test"); - if($('#meterType').val() == 2 && $('#distributionSystem').val() == 1) { + if(($('#meterType').val() == 2 || $('#meterType').val() == 3) && $('#distributionSystem').val() == 1) { $('#substitute').show(); } else { $('#substitute').hide();