kopia lustrzana https://github.com/weetmuts/wmbusmeters
Fix for omnipower provided by janusboandersen.
rodzic
218e5e7a34
commit
2616f64cb7
3
CHANGES
3
CHANGES
|
@ -1,3 +1,6 @@
|
||||||
|
|
||||||
|
Janus Bo Andersen fixed the omnipower driver! Thanks Janus!
|
||||||
|
|
||||||
Version 1.0.4: 2020-12-05
|
Version 1.0.4: 2020-12-05
|
||||||
|
|
||||||
Nikodem added support for Multical803! Thanks Nikodem!
|
Nikodem added support for Multical803! Thanks Nikodem!
|
||||||
|
|
|
@ -316,6 +316,7 @@ eBZ wMB-E01 (ebzwmbe)
|
||||||
EMH Metering (ehzp)
|
EMH Metering (ehzp)
|
||||||
Tauron Amiplus (amiplus) (includes vendor apator and echelon)
|
Tauron Amiplus (amiplus) (includes vendor apator and echelon)
|
||||||
Gavazzi EM24 (em24)
|
Gavazzi EM24 (em24)
|
||||||
|
Kamstrup Omnipower (omnipower)
|
||||||
```
|
```
|
||||||
|
|
||||||
The wmbus dongles imst871a can listen to one type of wmbus telegrams
|
The wmbus dongles imst871a can listen to one type of wmbus telegrams
|
||||||
|
|
|
@ -56,3 +56,12 @@ telegram=|42442D2C3636363635048D20E18025B62087D078|0406A500000004FF072B01000004F
|
||||||
# Test Multical803 C1 telegram
|
# Test Multical803 C1 telegram
|
||||||
telegram=|88442D2C8180808039048D20864051322084C178|040F0000000004FF070000000004FF0800000000041400000000844014000000008480401400000000043B0000000002590000025D0000142D0000000084100F0000000084200F0000000004FF2260000100026C892B440F00000000441400000000C4401400000000C480401400000000426C812B|
|
telegram=|88442D2C8180808039048D20864051322084C178|040F0000000004FF070000000004FF0800000000041400000000844014000000008480401400000000043B0000000002590000025D0000142D0000000084100F0000000084200F0000000004FF2260000100026C892B440F00000000441400000000C4401400000000C480401400000000426C812B|
|
||||||
{"media":"heat","meter":"multical803","name":"Heater","id":"80808081","total_energy_consumption_kwh":0,"total_volume_m3":0,"volume_flow_m3h":0,"t1_temperature_c":0,"t2_temperature_c":0,"at_date":"2020-11-09 00:00","current_status":"SENSOR_T1_BELOW_MEASURING_RANGE SENSOR_T2_BELOW_MEASURING_RANGE","energy_forward_kwh":0,"energy_returned_kwh":0,"timestamp":"1111-11-11T11:11:11Z"}
|
{"media":"heat","meter":"multical803","name":"Heater","id":"80808081","total_energy_consumption_kwh":0,"total_volume_m3":0,"volume_flow_m3h":0,"t1_temperature_c":0,"t2_temperature_c":0,"at_date":"2020-11-09 00:00","current_status":"SENSOR_T1_BELOW_MEASURING_RANGE SENSOR_T2_BELOW_MEASURING_RANGE","energy_forward_kwh":0,"energy_returned_kwh":0,"timestamp":"1111-11-11T11:11:11Z"}
|
||||||
|
|
||||||
|
# Test Kamstrup OmniPower C1 tlg
|
||||||
|
# Full tlg
|
||||||
|
telegram=|2D442D2C5768663230028D20E4E2C81C20878C78|04041A03000004843C00000000042B0300000004AB3C00000000|
|
||||||
|
{"media":"electricity","meter":"omnipower","name":"myomnipower","id":"32666857","total_energy_consumption_kwh":7.94,"total_energy_production_kwh":0,"current_power_consumption_kw":0.003,"current_power_production_kw":0,"timestamp":"1111-11-11T11:11:11Z"}
|
||||||
|
|
||||||
|
# Compact tlg
|
||||||
|
telegram=|27442D2C5768663230028D20E900C91C2011BA79138CCCFB|1A030000000000000300000000000000|
|
||||||
|
{"media":"electricity","meter":"omnipower","name":"myomnipower","id":"32666857","total_energy_consumption_kwh":7.94,"total_energy_production_kwh":0,"current_power_consumption_kw":0.003,"current_power_production_kw":0,"timestamp":"1111-11-11T11:11:11Z"}
|
||||||
|
|
|
@ -15,6 +15,31 @@
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Implemented October 2020 Janus Bo Andersen:
|
||||||
|
Implements Kamstrup OmniPower, energy meter.
|
||||||
|
This C1 WM-Bus meter broadcasts:
|
||||||
|
- Accumulated energy consumption (A+, kWh)
|
||||||
|
- Accumulated energy production (A-, kWh)
|
||||||
|
- Current power consumption (P+, kW)
|
||||||
|
- Current power production (P-, kW)
|
||||||
|
|
||||||
|
According to Kamstrup doc. 58101496_C1_GB_05.2018
|
||||||
|
(Wireless M-Bus Module for OMNIPOWER), the single-phase,
|
||||||
|
three-phase and CT meters send the same datagram.
|
||||||
|
|
||||||
|
Meter version. Implementation tested against meter:
|
||||||
|
Kamstrup one-phase with firmware version 0x30.
|
||||||
|
|
||||||
|
Encryption:
|
||||||
|
Meter uses AES-128 in CTR mode, which is the only mode supported by
|
||||||
|
the extended link layer (wm-bus), see EN 13757-4:2019.
|
||||||
|
Security mode is set during instatiation as
|
||||||
|
TPLSecurityMode::AES_CBC_IV, but this is overridden anyway when
|
||||||
|
reading the 3 ENC bits using the function in the wmbus.cc file.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
#include"dvparser.h"
|
#include"dvparser.h"
|
||||||
#include"meters.h"
|
#include"meters.h"
|
||||||
#include"meters_common_implementation.h"
|
#include"meters_common_implementation.h"
|
||||||
|
@ -26,12 +51,19 @@ struct MeterOmnipower : public virtual ElectricityMeter, public virtual MeterCom
|
||||||
MeterOmnipower(MeterInfo &mi);
|
MeterOmnipower(MeterInfo &mi);
|
||||||
|
|
||||||
double totalEnergyConsumption(Unit u);
|
double totalEnergyConsumption(Unit u);
|
||||||
|
double totalEnergyBackward(Unit u);
|
||||||
|
double powerConsumption(Unit u);
|
||||||
|
double powerBackward(Unit u);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void processContent(Telegram *t);
|
void processContent(Telegram *t);
|
||||||
|
|
||||||
double total_energy_kwh_ {};
|
double total_energy_kwh_{};
|
||||||
|
double total_energy_backward_kwh_{};
|
||||||
|
double power_kw_{};
|
||||||
|
double power_backward_kw_{};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
shared_ptr<ElectricityMeter> createOmnipower(MeterInfo &mi)
|
shared_ptr<ElectricityMeter> createOmnipower(MeterInfo &mi)
|
||||||
|
@ -50,6 +82,21 @@ MeterOmnipower::MeterOmnipower(MeterInfo &mi) :
|
||||||
[&](Unit u){ return totalEnergyConsumption(u); },
|
[&](Unit u){ return totalEnergyConsumption(u); },
|
||||||
"The total energy consumption recorded by this meter.",
|
"The total energy consumption recorded by this meter.",
|
||||||
true, true);
|
true, true);
|
||||||
|
|
||||||
|
addPrint("total_energy_production", Quantity::Energy,
|
||||||
|
[&](Unit u){ return totalEnergyBackward(u); },
|
||||||
|
"The total energy backward (production) recorded by this meter.",
|
||||||
|
true, true);
|
||||||
|
|
||||||
|
addPrint("current_power_consumption", Quantity::Power,
|
||||||
|
[&](Unit u){ return powerConsumption(u); },
|
||||||
|
"The current power consumption on this meter.",
|
||||||
|
true, true);
|
||||||
|
|
||||||
|
addPrint("current_power_production", Quantity::Power,
|
||||||
|
[&](Unit u){ return powerBackward(u); },
|
||||||
|
"The current power backward on this meter.",
|
||||||
|
true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
double MeterOmnipower::totalEnergyConsumption(Unit u)
|
double MeterOmnipower::totalEnergyConsumption(Unit u)
|
||||||
|
@ -58,15 +105,60 @@ double MeterOmnipower::totalEnergyConsumption(Unit u)
|
||||||
return convert(total_energy_kwh_, Unit::KWH, u);
|
return convert(total_energy_kwh_, Unit::KWH, u);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double MeterOmnipower::totalEnergyBackward(Unit u)
|
||||||
|
{
|
||||||
|
assertQuantity(u, Quantity::Energy);
|
||||||
|
return convert(total_energy_backward_kwh_, Unit::KWH, u);
|
||||||
|
}
|
||||||
|
|
||||||
|
double MeterOmnipower::powerConsumption(Unit u)
|
||||||
|
{
|
||||||
|
assertQuantity(u, Quantity::Power);
|
||||||
|
return convert(power_kw_, Unit::KW, u);
|
||||||
|
}
|
||||||
|
|
||||||
|
double MeterOmnipower::powerBackward(Unit u)
|
||||||
|
{
|
||||||
|
assertQuantity(u, Quantity::Power);
|
||||||
|
return convert(power_backward_kw_, Unit::KW, u);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void MeterOmnipower::processContent(Telegram *t)
|
void MeterOmnipower::processContent(Telegram *t)
|
||||||
{
|
{
|
||||||
// Meter record:
|
|
||||||
// 04 dif (32 Bit Integer/Binary Instantaneous value)
|
|
||||||
// 83 vif (Energy Wh)
|
|
||||||
// 3b vife (Forward flow contribution only)
|
|
||||||
// xx xx xx xx (total energy)
|
|
||||||
|
|
||||||
|
// Data Record header established from telegram analysis
|
||||||
|
// 04 04 (32 bit uint) Energy 10^1 Wh (consumption), A+
|
||||||
|
// 04 84 3C (32 bit uint) Energy 10^1 Wh (production), A-
|
||||||
|
// 04 2B (32 bit uint) Power 10^0 W (consumption), P+
|
||||||
|
// 04 AB 3C (32 bit uint) Power 10^0 W (production), P-
|
||||||
|
/*
|
||||||
|
(omnipower) 14: 04 dif (32 Bit Integer/Binary Instantaneous value)
|
||||||
|
(omnipower) 15: 04 vif (Energy 10¹ Wh)
|
||||||
|
(omnipower) 16: * 1A030000 total energy (7.940000 kwh)
|
||||||
|
(omnipower) 1a: 04 dif (32 Bit Integer/Binary Instantaneous value)
|
||||||
|
(omnipower) 1b: 84 vif (Energy 10¹ Wh)
|
||||||
|
(omnipower) 1c: 3C vife (backward flow)
|
||||||
|
(omnipower) 1d: * 00000000 total energy backward (0.000000 kwh)
|
||||||
|
(omnipower) 21: 04 dif (32 Bit Integer/Binary Instantaneous value)
|
||||||
|
(omnipower) 22: 2B vif (Power W)
|
||||||
|
(omnipower) 23: * 03000000 current power (0.003000 kw)
|
||||||
|
(omnipower) 27: 04 dif (32 Bit Integer/Binary Instantaneous value)
|
||||||
|
(omnipower) 28: AB vif (Power W)
|
||||||
|
(omnipower) 29: 3C vife (backward flow)
|
||||||
|
(omnipower) 2a: * 00000000 current power (0.000000 kw)
|
||||||
|
*/
|
||||||
int offset;
|
int offset;
|
||||||
extractDVdouble(&t->values, "04833B", &offset, &total_energy_kwh_);
|
extractDVdouble(&t->values, "0404", &offset, &total_energy_kwh_);
|
||||||
t->addMoreExplanation(offset, " total power (%f kwh)", total_energy_kwh_);
|
t->addMoreExplanation(offset, " total energy (%f kwh)", total_energy_kwh_);
|
||||||
|
|
||||||
|
extractDVdouble(&t->values, "04843C", &offset, &total_energy_backward_kwh_);
|
||||||
|
t->addMoreExplanation(offset, " total energy backward (%f kwh)", total_energy_backward_kwh_);
|
||||||
|
|
||||||
|
extractDVdouble(&t->values, "042B", &offset, &power_kw_);
|
||||||
|
t->addMoreExplanation(offset, " current power (%f kw)", power_kw_);
|
||||||
|
|
||||||
|
extractDVdouble(&t->values, "04AB3C", &offset, &power_backward_kw_);
|
||||||
|
t->addMoreExplanation(offset, " current power (%f kw)", power_backward_kw_);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,7 +146,7 @@
|
||||||
X(MULTICAL403,MANUFACTURER_KAM, 0x0d, 0x34) \
|
X(MULTICAL403,MANUFACTURER_KAM, 0x0d, 0x34) \
|
||||||
X(MULTICAL603,MANUFACTURER_KAM, 0x04, 0x35) \
|
X(MULTICAL603,MANUFACTURER_KAM, 0x04, 0x35) \
|
||||||
X(MULTICAL803,MANUFACTURER_KAM, 0x04, 0x39) \
|
X(MULTICAL803,MANUFACTURER_KAM, 0x04, 0x39) \
|
||||||
X(OMNIPOWER, MANUFACTURER_KAM, 0x02, 0x01) \
|
X(OMNIPOWER, MANUFACTURER_KAM, 0x02, 0x30) \
|
||||||
X(RFMAMB, MANUFACTURER_BMT, 0x1b, 0x10) \
|
X(RFMAMB, MANUFACTURER_BMT, 0x1b, 0x10) \
|
||||||
X(RFMTX1, MANUFACTURER_BMT, 0x07, 0x05) \
|
X(RFMTX1, MANUFACTURER_BMT, 0x07, 0x05) \
|
||||||
X(Q400, MANUFACTURER_AXI, 0x07, 0x10) \
|
X(Q400, MANUFACTURER_AXI, 0x07, 0x10) \
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
name=myomnipower
|
||||||
|
type=omnipower
|
||||||
|
id=32666857
|
||||||
|
key=
|
|
@ -20,6 +20,7 @@ $PROG --format=json simulations/simulation_c1.txt \
|
||||||
My403Cooling multical403 78780102 "" \
|
My403Cooling multical403 78780102 "" \
|
||||||
Heat multical603 36363636 "" \
|
Heat multical603 36363636 "" \
|
||||||
Heater multical803 80808081 "" \
|
Heater multical803 80808081 "" \
|
||||||
|
myomnipower omnipower 32666857 "" \
|
||||||
> $TEST/test_output.txt 2> $TEST/test_stderr.txt
|
> $TEST/test_output.txt 2> $TEST/test_stderr.txt
|
||||||
|
|
||||||
if [ "$?" = "0" ]
|
if [ "$?" = "0" ]
|
||||||
|
|
Ładowanie…
Reference in New Issue