From 24f7ca615053d5d70e290e348e31f5612c794394 Mon Sep 17 00:00:00 2001 From: Denys Date: Wed, 1 Dec 2021 00:28:12 +0200 Subject: [PATCH 1/3] Add new fields for kamstrup multical302 in mega joule --- src/meter_multical302.cc | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/meter_multical302.cc b/src/meter_multical302.cc index 1390d2e..6c989c9 100644 --- a/src/meter_multical302.cc +++ b/src/meter_multical302.cc @@ -33,6 +33,8 @@ struct MeterMultical302 : public virtual HeatMeter, public virtual MeterCommonImplementation { MeterMultical302(MeterInfo &mi); + double totalEnergyConsumptionM(Unit u); + double targetEnergyConsumptionM(Unit u); double totalEnergyConsumption(Unit u); double targetEnergyConsumption(Unit u); double currentPowerConsumption(Unit u); @@ -46,6 +48,8 @@ private: uchar info_codes_ {}; double total_energy_kwh_ {}; double target_energy_kwh_ {}; + double total_energy_mj_ {}; + double target_energy_mj_ {}; double current_power_kw_ {}; double total_volume_m3_ {}; string target_date_ {}; @@ -58,6 +62,16 @@ MeterMultical302::MeterMultical302(MeterInfo &mi) : addLinkMode(LinkMode::C1); + addPrint("total_energy_consumption_m", Quantity::Energy, + [&](Unit u){ return totalEnergyConsumptionM(u); }, + "The total energy consumption recorded by this meter. MJ", + true, true); + + addPrint("total_energy_consumption_at_date_m", Quantity::Energy, + [&](Unit u){ return targetEnergyConsumptionM(u); }, + "The total energy consumption recorded at the target date. MJ", + false, true); + addPrint("total_energy_consumption", Quantity::Energy, [&](Unit u){ return totalEnergyConsumption(u); }, "The total energy consumption recorded by this meter.", @@ -93,6 +107,18 @@ shared_ptr createMultical302(MeterInfo &mi) { return shared_ptr(new MeterMultical302(mi)); } +double MeterMultical302::totalEnergyConsumptionM(Unit u) +{ + assertQuantity(u, Quantity::Energy); + return convert(total_energy_mj_, Unit::MJ, u); +} + +double MeterMultical302::targetEnergyConsumptionM(Unit u) +{ + assertQuantity(u, Quantity::Energy); + return convert(target_energy_mj_, Unit::MJ, u); +} + double MeterMultical302::totalEnergyConsumption(Unit u) { assertQuantity(u, Quantity::Energy); @@ -149,6 +175,16 @@ void MeterMultical302::processContent(Telegram *t) extractDVuint8(&t->values, "01FF21", &offset, &info_codes_); t->addMoreExplanation(offset, " info codes (%s)", status().c_str()); + if(findKey(MeasurementType::Instantaneous, ValueInformation::EnergyMJ, 0, 0, &key, &t->values)) { + extractDVdouble(&t->values, key, &offset, &total_energy_mj_); + t->addMoreExplanation(offset, " total energy consumption (%f Mj)", total_energy_mj_); + } + + if(findKey(MeasurementType::Instantaneous, ValueInformation::EnergyMJ, 1, 0, &key, &t->values)) { + extractDVdouble(&t->values, key, &offset, &target_energy_mj_); + t->addMoreExplanation(offset, " target energy consumption (%f Mj)", target_energy_mj_); + } + if(findKey(MeasurementType::Instantaneous, ValueInformation::EnergyWh, 0, 0, &key, &t->values)) { extractDVdouble(&t->values, key, &offset, &total_energy_kwh_); t->addMoreExplanation(offset, " total energy consumption (%f kWh)", total_energy_kwh_); From 210c0e212d9fed81ce4cd2deafdb8ac67a2f0bbb Mon Sep 17 00:00:00 2001 From: Denys Date: Mon, 6 Dec 2021 00:05:42 +0200 Subject: [PATCH 2/3] Revert "Add new fields for kamstrup multical302 in mega joule" This reverts commit 24f7ca615053d5d70e290e348e31f5612c794394. --- src/meter_multical302.cc | 36 ------------------------------------ 1 file changed, 36 deletions(-) diff --git a/src/meter_multical302.cc b/src/meter_multical302.cc index 6c989c9..1390d2e 100644 --- a/src/meter_multical302.cc +++ b/src/meter_multical302.cc @@ -33,8 +33,6 @@ struct MeterMultical302 : public virtual HeatMeter, public virtual MeterCommonImplementation { MeterMultical302(MeterInfo &mi); - double totalEnergyConsumptionM(Unit u); - double targetEnergyConsumptionM(Unit u); double totalEnergyConsumption(Unit u); double targetEnergyConsumption(Unit u); double currentPowerConsumption(Unit u); @@ -48,8 +46,6 @@ private: uchar info_codes_ {}; double total_energy_kwh_ {}; double target_energy_kwh_ {}; - double total_energy_mj_ {}; - double target_energy_mj_ {}; double current_power_kw_ {}; double total_volume_m3_ {}; string target_date_ {}; @@ -62,16 +58,6 @@ MeterMultical302::MeterMultical302(MeterInfo &mi) : addLinkMode(LinkMode::C1); - addPrint("total_energy_consumption_m", Quantity::Energy, - [&](Unit u){ return totalEnergyConsumptionM(u); }, - "The total energy consumption recorded by this meter. MJ", - true, true); - - addPrint("total_energy_consumption_at_date_m", Quantity::Energy, - [&](Unit u){ return targetEnergyConsumptionM(u); }, - "The total energy consumption recorded at the target date. MJ", - false, true); - addPrint("total_energy_consumption", Quantity::Energy, [&](Unit u){ return totalEnergyConsumption(u); }, "The total energy consumption recorded by this meter.", @@ -107,18 +93,6 @@ shared_ptr createMultical302(MeterInfo &mi) { return shared_ptr(new MeterMultical302(mi)); } -double MeterMultical302::totalEnergyConsumptionM(Unit u) -{ - assertQuantity(u, Quantity::Energy); - return convert(total_energy_mj_, Unit::MJ, u); -} - -double MeterMultical302::targetEnergyConsumptionM(Unit u) -{ - assertQuantity(u, Quantity::Energy); - return convert(target_energy_mj_, Unit::MJ, u); -} - double MeterMultical302::totalEnergyConsumption(Unit u) { assertQuantity(u, Quantity::Energy); @@ -175,16 +149,6 @@ void MeterMultical302::processContent(Telegram *t) extractDVuint8(&t->values, "01FF21", &offset, &info_codes_); t->addMoreExplanation(offset, " info codes (%s)", status().c_str()); - if(findKey(MeasurementType::Instantaneous, ValueInformation::EnergyMJ, 0, 0, &key, &t->values)) { - extractDVdouble(&t->values, key, &offset, &total_energy_mj_); - t->addMoreExplanation(offset, " total energy consumption (%f Mj)", total_energy_mj_); - } - - if(findKey(MeasurementType::Instantaneous, ValueInformation::EnergyMJ, 1, 0, &key, &t->values)) { - extractDVdouble(&t->values, key, &offset, &target_energy_mj_); - t->addMoreExplanation(offset, " target energy consumption (%f Mj)", target_energy_mj_); - } - if(findKey(MeasurementType::Instantaneous, ValueInformation::EnergyWh, 0, 0, &key, &t->values)) { extractDVdouble(&t->values, key, &offset, &total_energy_kwh_); t->addMoreExplanation(offset, " total energy consumption (%f kWh)", total_energy_kwh_); From e92ebe3d9a70ae5809d1cb5baf380d8d1f4f4c3d Mon Sep 17 00:00:00 2001 From: Denys Date: Mon, 6 Dec 2021 03:02:39 +0200 Subject: [PATCH 3/3] Add Mj unit suport to multical 302 --- simulations/simulation_c1.txt | 8 ++++++++ src/meter_multical302.cc | 10 ++++++++++ tests/config1/etc/wmbusmeters.d/MyHeaterMj | 5 +++++ tests/config4/etc/wmbusmeters.d/MyHeaterMj | 4 ++++ tests/test_c1_meters.sh | 1 + 5 files changed, 28 insertions(+) create mode 100644 tests/config1/etc/wmbusmeters.d/MyHeaterMj create mode 100644 tests/config4/etc/wmbusmeters.d/MyHeaterMj diff --git a/simulations/simulation_c1.txt b/simulations/simulation_c1.txt index ca365da..dc54d9c 100644 --- a/simulations/simulation_c1.txt +++ b/simulations/simulation_c1.txt @@ -29,6 +29,14 @@ telegram=|2E442D2C6767676730048D2039D1684020|BCDB7803062C00004306000000031463000 telegram=|25442D2C6767676730048D203AD2684020|D81579E7F1D5902C00000000006300007F2A130000| {"media":"heat","meter":"multical302","name":"MyHeater","id":"67676767","total_energy_consumption_kwh":44,"current_power_consumption_kw":1.9,"total_volume_m3":0.99,"at_date":"2019-10-31 00:00","total_energy_consumption_at_date_kwh":0,"current_status":"","timestamp":"1111-11-11T11:11:11Z"} +# Mj full telegram +telegram=|2E442D2C46464646300C8D207A70EA6021B1C178|030FC51000430F9210000314072B05426CBE2B022D0C0001FF2100| +{"media":"heat volume at inlet","meter":"multical302","name":"MyHeaterMj","id":"46464646","total_energy_consumption_kwh":11925,"current_power_consumption_kw":1.2,"total_volume_m3":3386.95,"at_date":"2021-11-30 00:00","total_energy_consumption_at_date_kwh":11783.333333,"current_status":"","timestamp":"1111-11-11T11:11:11Z"} + +# Mj compressed telegram +telegram=|25442D2C46464646300C8D20D3E2EB60212B6D79E26DCD65|C51000921000152B05BE2B0C0000| +{"media":"heat volume at inlet","meter":"multical302","name":"MyHeaterMj","id":"46464646","total_energy_consumption_kwh":11925,"current_power_consumption_kw":1.2,"total_volume_m3":3387.09,"at_date":"2021-11-30 00:00","total_energy_consumption_at_date_kwh":11783.333333,"current_status":"","timestamp":"1111-11-11T11:11:11Z"} + # Test QCaloric C1 telegrams telegram=|314493441234567835087a740000200b6e2701004b6e450100426c5f2ccb086e790000c2086c7f21326cffff046d200b7422| diff --git a/src/meter_multical302.cc b/src/meter_multical302.cc index 1390d2e..78e87b4 100644 --- a/src/meter_multical302.cc +++ b/src/meter_multical302.cc @@ -152,6 +152,11 @@ void MeterMultical302::processContent(Telegram *t) if(findKey(MeasurementType::Instantaneous, ValueInformation::EnergyWh, 0, 0, &key, &t->values)) { extractDVdouble(&t->values, key, &offset, &total_energy_kwh_); t->addMoreExplanation(offset, " total energy consumption (%f kWh)", total_energy_kwh_); + } else if (findKey(MeasurementType::Instantaneous, ValueInformation::EnergyMJ, 0, 0, &key, &t->values)) { + double mj; + extractDVdouble(&t->values, key, &offset, &mj); + total_energy_kwh_ = convert(mj, Unit::MJ, Unit::KWH); + t->addMoreExplanation(offset, " total energy consumption (%f kWh)", total_energy_kwh_); } if(findKey(MeasurementType::Instantaneous, ValueInformation::Volume, 0, 0, &key, &t->values)) { @@ -162,6 +167,11 @@ void MeterMultical302::processContent(Telegram *t) if(findKey(MeasurementType::Instantaneous, ValueInformation::EnergyWh, 1, 0, &key, &t->values)) { extractDVdouble(&t->values, key, &offset, &target_energy_kwh_); t->addMoreExplanation(offset, " target energy consumption (%f kWh)", target_energy_kwh_); + } else if(findKey(MeasurementType::Instantaneous, ValueInformation::EnergyMJ, 1, 0, &key, &t->values)){ + double mj; + extractDVdouble(&t->values, key, &offset, &mj); + target_energy_kwh_ = convert(mj, Unit::MJ, Unit::KWH); + t->addMoreExplanation(offset, " target energy consumption (%f kWh)", target_energy_kwh_); } if(findKey(MeasurementType::Instantaneous, ValueInformation::PowerW, 0, 0, &key, &t->values)) { diff --git a/tests/config1/etc/wmbusmeters.d/MyHeaterMj b/tests/config1/etc/wmbusmeters.d/MyHeaterMj new file mode 100644 index 0000000..96b55e0 --- /dev/null +++ b/tests/config1/etc/wmbusmeters.d/MyHeaterMj @@ -0,0 +1,5 @@ +name=MyHeaterMj +type=multical302 +id=46464646 +#key=testing comment +key= \ No newline at end of file diff --git a/tests/config4/etc/wmbusmeters.d/MyHeaterMj b/tests/config4/etc/wmbusmeters.d/MyHeaterMj new file mode 100644 index 0000000..bba80cf --- /dev/null +++ b/tests/config4/etc/wmbusmeters.d/MyHeaterMj @@ -0,0 +1,4 @@ +name=MyHeaterMj +type=multical302 +id=46464646 +key= \ No newline at end of file diff --git a/tests/test_c1_meters.sh b/tests/test_c1_meters.sh index 1d0da61..9fe1dda 100755 --- a/tests/test_c1_meters.sh +++ b/tests/test_c1_meters.sh @@ -12,6 +12,7 @@ TESTRESULT="ERROR" cat simulations/simulation_c1.txt | grep '^{' > $TEST/test_expected.txt $PROG --format=json simulations/simulation_c1.txt \ MyHeater multical302 67676767 NOKEY \ + MyHeaterMj multical302 46464646 NOKEY \ MyTapWater multical21 76348799 NOKEY \ MyWater flowiq2200 52525252 NOKEY \ Vadden multical21 44556677 NOKEY \