Skip to content

Commit b1fd6d9

Browse files
authored
Add Kaifa MA309M dump from pos-ei-don (#10)
1 parent ff0e6a2 commit b1fd6d9

6 files changed

Lines changed: 162 additions & 0 deletions

File tree

tests/dumps/mbus_kaifa_ma309m.key

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
000102030405060708090A0B0C0D0E0F

tests/dumps/mbus_kaifa_ma309m.log

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
68FAFA6853FF000167DB084B464D0000000001820155210000000147A45EAFC6CDB53B363CFA0215B50B2BB5A9A7C27A483FC72BED77CA1C52396AAACF0F1588155EB891EF23E78A6FD16375E3975685D3A26F8615A331CFBB7960B8076B1791BDC36364A34A778DD534D276124B33906310F52BACEDA7DEE39640E58E4776075C3FD04014088E9D9DE0D8E673C83EE3E8C4ABF9C18AEB8773E592349F3AB8C38336E872ADBB54FB8F29231F925421F5996A99D192853D317A33F19B479D5E5376011C199BAD48BB8F9E790B916FEFF68E9B1F24DAE6BFEEFF0E4BDC7E46D3F7820E6BCFEFA2E558CA50B01808681B322449074A6797DE9AA2698FF5FC5CFD166872726853FF114783FB32AE65176E5C868BCAB3E807790DF8C4BA06659E8C009A7C834A0EE4F48D7E6F8E6A3E6AB994D167F8C7A492BCBE876ED7A6E2D02FD9F6C3D82ED0A8C43F004ACA173979EE330F6F278C2532F5994EF630B5AEA9F7109662A2E418053D8FFDA74235548896F5E584C5CFEEC1C916
19.7 KB
Binary file not shown.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?xml version='1.0' encoding='utf-8'?>
2+
<GeneralGloCiphering SystemTitle="4B464D0000000001" FrameCounter="1">
3+
<DataNotification LongInvokeId="00337AEF">
4+
<DateTime Value="2026-06-05 12:37:45.00 -02:00" />
5+
<STRUCTURE Qty="16">
6+
<OCTETSTRING Value="0.0.1.0.0.255" Name="Clock / datetime" />
7+
<OCTETSTRING Value="2026-06-05 12:37:45.00 -02:00" />
8+
<STRUCTURE Qty="2">
9+
<OCTETSTRING Value="0.0.96.1.0.255" Name="Meter serial number" />
10+
<OCTETSTRING Value="1KFM0000000001" />
11+
</STRUCTURE>
12+
<STRUCTURE Qty="2">
13+
<OCTETSTRING Value="0.0.42.0.0.255" Name="Logical device name" />
14+
<OCTETSTRING Value="KFM1000000000001" />
15+
</STRUCTURE>
16+
<STRUCTURE Qty="3">
17+
<OCTETSTRING Value="1.0.32.7.0.255" Name="Voltage L1 (V)" />
18+
<UINT16 Value="2363" />
19+
<STRUCTURE Qty="2">
20+
<INT8 Value="-1" />
21+
<ENUM Value="35" Unit="V" />
22+
</STRUCTURE>
23+
</STRUCTURE>
24+
<STRUCTURE Qty="3">
25+
<OCTETSTRING Value="1.0.52.7.0.255" Name="Voltage L2 (V)" />
26+
<UINT16 Value="2383" />
27+
<STRUCTURE Qty="2">
28+
<INT8 Value="-1" />
29+
<ENUM Value="35" Unit="V" />
30+
</STRUCTURE>
31+
</STRUCTURE>
32+
<STRUCTURE Qty="3">
33+
<OCTETSTRING Value="1.0.72.7.0.255" Name="Voltage L3 (V)" />
34+
<UINT16 Value="2367" />
35+
<STRUCTURE Qty="2">
36+
<INT8 Value="-1" />
37+
<ENUM Value="35" Unit="V" />
38+
</STRUCTURE>
39+
</STRUCTURE>
40+
<STRUCTURE Qty="3">
41+
<OCTETSTRING Value="1.0.31.7.0.255" Name="Current L1 (A)" />
42+
<UINT16 Value="235" />
43+
<STRUCTURE Qty="2">
44+
<INT8 Value="-2" />
45+
<ENUM Value="33" Unit="A" />
46+
</STRUCTURE>
47+
</STRUCTURE>
48+
<STRUCTURE Qty="3">
49+
<OCTETSTRING Value="1.0.51.7.0.255" Name="Current L2 (A)" />
50+
<UINT16 Value="319" />
51+
<STRUCTURE Qty="2">
52+
<INT8 Value="-2" />
53+
<ENUM Value="33" Unit="A" />
54+
</STRUCTURE>
55+
</STRUCTURE>
56+
<STRUCTURE Qty="3">
57+
<OCTETSTRING Value="1.0.71.7.0.255" Name="Current L3 (A)" />
58+
<UINT16 Value="163" />
59+
<STRUCTURE Qty="2">
60+
<INT8 Value="-2" />
61+
<ENUM Value="33" Unit="A" />
62+
</STRUCTURE>
63+
</STRUCTURE>
64+
<STRUCTURE Qty="3">
65+
<OCTETSTRING Value="1.0.1.7.0.255" Name="Active power+ (W)" />
66+
<UINT32 Value="0" />
67+
<STRUCTURE Qty="2">
68+
<Unknown0xA7 />
69+
<Unknown0x9D />
70+
</STRUCTURE>
71+
</STRUCTURE>
72+
<Unknown0x40 />
73+
<Unknown0xAD />
74+
<Unknown0x70 />
75+
<Unknown0xF7 />
76+
<Unknown0x89 />
77+
</STRUCTURE>
78+
</DataNotification>
79+
</GeneralGloCiphering>

tests/expected/mbus_kaifa_ma309m.h

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#pragma once
2+
3+
#include <array>
4+
#include <cstdint>
5+
#include <cstddef>
6+
#include <map>
7+
#include <string>
8+
#include "dlms_parser/decryption/aes_128_gcm_decryptor.h"
9+
10+
namespace dlms::test_data {
11+
12+
// Kaifa MA309M (EWR, Austria) — M-Bus framed, 2 long frames.
13+
// General-Glo-Ciphering 0xDB, AES-GCM encrypted.
14+
// Source: tests/dumps/mbus_kaifa_ma309m.log
15+
// Provied by https://github.com/pos-ei-don in pr esphome#15458
16+
17+
const uint8_t mbus_kaifa_ma309m_raw_frame[] = {
18+
0x68, 0xFA, 0xFA, 0x68, 0x53, 0xFF, 0x00, 0x01, 0x67, 0xDB, 0x08, 0x4B, 0x46, 0x4D, 0x00, 0x00,
19+
0x00, 0x00, 0x01, 0x82, 0x01, 0x55, 0x21, 0x00, 0x00, 0x00, 0x01, 0x47, 0xA4, 0x5E, 0xAF, 0xC6,
20+
0xCD, 0xB5, 0x3B, 0x36, 0x3C, 0xFA, 0x02, 0x15, 0xB5, 0x0B, 0x2B, 0xB5, 0xA9, 0xA7, 0xC2, 0x7A,
21+
0x48, 0x3F, 0xC7, 0x2B, 0xED, 0x77, 0xCA, 0x1C, 0x52, 0x39, 0x6A, 0xAA, 0xCF, 0x0F, 0x15, 0x88,
22+
0x15, 0x5E, 0xB8, 0x91, 0xEF, 0x23, 0xE7, 0x8A, 0x6F, 0xD1, 0x63, 0x75, 0xE3, 0x97, 0x56, 0x85,
23+
0xD3, 0xA2, 0x6F, 0x86, 0x15, 0xA3, 0x31, 0xCF, 0xBB, 0x79, 0x60, 0xB8, 0x07, 0x6B, 0x17, 0x91,
24+
0xBD, 0xC3, 0x63, 0x64, 0xA3, 0x4A, 0x77, 0x8D, 0xD5, 0x34, 0xD2, 0x76, 0x12, 0x4B, 0x33, 0x90,
25+
0x63, 0x10, 0xF5, 0x2B, 0xAC, 0xED, 0xA7, 0xDE, 0xE3, 0x96, 0x40, 0xE5, 0x8E, 0x47, 0x76, 0x07,
26+
0x5C, 0x3F, 0xD0, 0x40, 0x14, 0x08, 0x8E, 0x9D, 0x9D, 0xE0, 0xD8, 0xE6, 0x73, 0xC8, 0x3E, 0xE3,
27+
0xE8, 0xC4, 0xAB, 0xF9, 0xC1, 0x8A, 0xEB, 0x87, 0x73, 0xE5, 0x92, 0x34, 0x9F, 0x3A, 0xB8, 0xC3,
28+
0x83, 0x36, 0xE8, 0x72, 0xAD, 0xBB, 0x54, 0xFB, 0x8F, 0x29, 0x23, 0x1F, 0x92, 0x54, 0x21, 0xF5,
29+
0x99, 0x6A, 0x99, 0xD1, 0x92, 0x85, 0x3D, 0x31, 0x7A, 0x33, 0xF1, 0x9B, 0x47, 0x9D, 0x5E, 0x53,
30+
0x76, 0x01, 0x1C, 0x19, 0x9B, 0xAD, 0x48, 0xBB, 0x8F, 0x9E, 0x79, 0x0B, 0x91, 0x6F, 0xEF, 0xF6,
31+
0x8E, 0x9B, 0x1F, 0x24, 0xDA, 0xE6, 0xBF, 0xEE, 0xFF, 0x0E, 0x4B, 0xDC, 0x7E, 0x46, 0xD3, 0xF7,
32+
0x82, 0x0E, 0x6B, 0xCF, 0xEF, 0xA2, 0xE5, 0x58, 0xCA, 0x50, 0xB0, 0x18, 0x08, 0x68, 0x1B, 0x32,
33+
0x24, 0x49, 0x07, 0x4A, 0x67, 0x97, 0xDE, 0x9A, 0xA2, 0x69, 0x8F, 0xF5, 0xFC, 0x5C, 0xFD, 0x16,
34+
0x68, 0x72, 0x72, 0x68, 0x53, 0xFF, 0x11, 0x47, 0x83, 0xFB, 0x32, 0xAE, 0x65, 0x17, 0x6E, 0x5C,
35+
0x86, 0x8B, 0xCA, 0xB3, 0xE8, 0x07, 0x79, 0x0D, 0xF8, 0xC4, 0xBA, 0x06, 0x65, 0x9E, 0x8C, 0x00,
36+
0x9A, 0x7C, 0x83, 0x4A, 0x0E, 0xE4, 0xF4, 0x8D, 0x7E, 0x6F, 0x8E, 0x6A, 0x3E, 0x6A, 0xB9, 0x94,
37+
0xD1, 0x67, 0xF8, 0xC7, 0xA4, 0x92, 0xBC, 0xBE, 0x87, 0x6E, 0xD7, 0xA6, 0xE2, 0xD0, 0x2F, 0xD9,
38+
0xF6, 0xC3, 0xD8, 0x2E, 0xD0, 0xA8, 0xC4, 0x3F, 0x00, 0x4A, 0xCA, 0x17, 0x39, 0x79, 0xEE, 0x33,
39+
0x0F, 0x6F, 0x27, 0x8C, 0x25, 0x32, 0xF5, 0x99, 0x4E, 0xF6, 0x30, 0xB5, 0xAE, 0xA9, 0xF7, 0x10,
40+
0x96, 0x62, 0xA2, 0xE4, 0x18, 0x05, 0x3D, 0x8F, 0xFD, 0xA7, 0x42, 0x35, 0x54, 0x88, 0x96, 0xF5,
41+
0xE5, 0x84, 0xC5, 0xCF, 0xEE, 0xC1, 0xC9, 0x16
42+
};
43+
44+
// AES-GCM decryption throwaway key
45+
const auto mbus_kaifa_ma309m_key = dlms_parser::Aes128GcmDecryptionKey::from_bytes(std::array<uint8_t, 16>{
46+
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
47+
}).value();
48+
49+
// 1 datetime, 2 strings (Meter ID, Logical Name), 7 numeric values (V1, V2, V3, I1, I2, I3, P+)
50+
constexpr size_t mbus_kaifa_ma309m_expected_count = 10;
51+
52+
const std::map<std::string, std::string> mbus_kaifa_ma309m_expected_strings = {
53+
{"0.0.96.1.0.255", "1KFM0000000001"},
54+
{"0.0.42.0.0.255", "KFM1000000000001"},
55+
{"0.0.1.0.0.255", "2026-06-05 12:37:45.00 -02:00"}
56+
};
57+
58+
const std::map<std::string, float> mbus_kaifa_ma309m_expected_floats = {
59+
{"1.0.32.7.0.255", 236.3f},
60+
{"1.0.52.7.0.255", 238.3f},
61+
{"1.0.72.7.0.255", 236.7f},
62+
{"1.0.31.7.0.255", 2.35f},
63+
{"1.0.51.7.0.255", 3.19f},
64+
{"1.0.71.7.0.255", 1.63f},
65+
{"1.0.1.7.0.255", 0.0f}
66+
};
67+
68+
} // namespace dlms::test_data

tests/test_meter_dumps.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "tests/expected/hdlc_kaifa_ma304h3e.h"
2727
#include "tests/expected/hdlc_kamstrup_omnipower.h"
2828
#include "tests/expected/mbus_netz_noe_p1.h"
29+
#include "tests/expected/mbus_kaifa_ma309m.h"
2930

3031
class LogCapturer : dlms_parser::NonCopyableAndNonMovable {
3132
public:
@@ -425,4 +426,16 @@ TEST_CASE("Integration: MBus") {
425426
auto [n, consumed] = parser.parse(duplicated_frame, [](auto, auto, auto, auto) {});
426427
CHECK(n == 0);
427428
}
429+
430+
SUBCASE("Kaifa MA309M (EWR, Austria)") {
431+
run_meter_test(
432+
dlms::test_data::mbus_kaifa_ma309m_raw_frame,
433+
dlms::test_data::mbus_kaifa_ma309m_expected_count,
434+
dlms::test_data::mbus_kaifa_ma309m_expected_strings,
435+
dlms::test_data::mbus_kaifa_ma309m_expected_floats,
436+
[&](dlms_parser::DlmsParser& parser) {
437+
parser.set_decryption_key(dlms::test_data::mbus_kaifa_ma309m_key);
438+
}
439+
);
440+
}
428441
}

0 commit comments

Comments
 (0)