Skip to content

Commit a8286e0

Browse files
authored
Merge pull request #25 from athombv/fix/units
fix: add support for watts and watt hours for power/energy props
2 parents 0c8e850 + cb4c7f9 commit a8286e0

File tree

3 files changed

+139
-16
lines changed

3 files changed

+139
-16
lines changed

src/parsers/cosem.ts

Lines changed: 73 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -33,36 +33,53 @@ export const COSEM_PARSERS: COSEMDecoder[] = [
3333
},
3434
},
3535
{
36-
regex: /^1-(\d):1\.8\.(\d+)\((\d+(\.\d+)?)\*kWh\)/,
36+
regex: /^1-(\d):1\.8\.(\d+)\((\d+(\.\d+)?)\*(\w+)\)/,
3737
parser: ({ regexResult, result }) => {
3838
const tariff = parseInt(regexResult[2], 10);
39+
let value = parseFloat(regexResult[3]);
40+
41+
const unit = regexResult[5];
42+
43+
if (unit === 'Wh') {
44+
// Convert to kWh
45+
value = value / 1000;
46+
}
3947

4048
if (tariff === 0) {
4149
// This is the total received electricity
4250
result.electricity.total = result.electricity.total ?? {};
43-
result.electricity.total.received = parseFloat(regexResult[3]);
51+
result.electricity.total.received = value;
4452
} else {
4553
// This is a specific tariff
4654
result.electricity.tariffs = result.electricity.tariffs ?? {};
4755
result.electricity.tariffs[tariff] = result.electricity.tariffs[tariff] ?? {};
48-
result.electricity.tariffs[tariff].received = parseFloat(regexResult[3]);
56+
result.electricity.tariffs[tariff].received = value;
4957
}
5058
},
5159
},
5260
{
53-
regex: /^1-(\d):2\.8\.(\d+)\((\d+(\.\d+)?)\*kWh\)/,
61+
regex: /^1-(\d):2\.8\.(\d+)\((\d+(\.\d+)?)\*(\w+)\)/,
5462
parser: ({ regexResult, result }) => {
5563
const tariff = parseInt(regexResult[2], 10);
5664

65+
let value = parseFloat(regexResult[3]);
66+
67+
const unit = regexResult[5];
68+
69+
if (unit === 'Wh') {
70+
// Convert to kWh
71+
value = value / 1000;
72+
}
73+
5774
if (tariff === 0) {
5875
// This is the total received electricity
5976
result.electricity.total = result.electricity.total ?? {};
60-
result.electricity.total.returned = parseFloat(regexResult[3]);
77+
result.electricity.total.returned = value;
6178
} else {
6279
// This is a specific tariff
6380
result.electricity.tariffs = result.electricity.tariffs ?? {};
6481
result.electricity.tariffs[tariff] = result.electricity.tariffs[tariff] ?? {};
65-
result.electricity.tariffs[tariff].returned = parseFloat(regexResult[3]);
82+
result.electricity.tariffs[tariff].returned = value;
6683
}
6784
},
6885
},
@@ -73,15 +90,31 @@ export const COSEM_PARSERS: COSEMDecoder[] = [
7390
},
7491
},
7592
{
76-
regex: /^1-(\d):1\.7\.0\((\d+(\.\d+)?)\*kW\)/,
93+
regex: /^1-(\d):1\.7\.0\((\d+(\.\d+)?)\*(\w+)\)/,
7794
parser: ({ regexResult, result }) => {
78-
result.electricity.powerReceivedTotal = parseFloat(regexResult[2]);
95+
let value = parseFloat(regexResult[2]);
96+
const unit = regexResult[4];
97+
98+
if (unit === 'W') {
99+
// Convert to kW
100+
value = value / 1000;
101+
}
102+
103+
result.electricity.powerReceivedTotal = value;
79104
},
80105
},
81106
{
82-
regex: /^1-(\d):2\.7\.0\((\d+(\.\d+)?)\*kW\)/,
107+
regex: /^1-(\d):2\.7\.0\((\d+(\.\d+)?)\*(\w+)\)/,
83108
parser: ({ regexResult, result }) => {
84-
result.electricity.powerReturnedTotal = parseFloat(regexResult[2]);
109+
let value = parseFloat(regexResult[2]);
110+
const unit = regexResult[4];
111+
112+
if (unit === 'W') {
113+
// Convert to kW
114+
value = value / 1000;
115+
}
116+
117+
result.electricity.powerReturnedTotal = value;
85118
},
86119
},
87120
{
@@ -203,24 +236,48 @@ export const COSEM_PARSERS: COSEMDecoder[] = [
203236
},
204237
},
205238
{
206-
regex: /^1-0:21\.7\.0\((\d+(\.\d+)?)\*kW\)/,
239+
regex: /^1-0:21\.7\.0\((\d+(\.\d+)?)\*(\w+)\)/,
207240
parser: ({ regexResult, result }) => {
241+
let value = parseFloat(regexResult[1]);
242+
const unit = regexResult[3];
243+
244+
if (unit === 'W') {
245+
// Convert to kW
246+
value = value / 1000;
247+
}
248+
208249
result.electricity.powerReceived = result.electricity.powerReceived ?? {};
209-
result.electricity.powerReceived.l1 = parseFloat(regexResult[1]);
250+
result.electricity.powerReceived.l1 = value;
210251
},
211252
},
212253
{
213-
regex: /^1-0:41\.7\.0\((\d+(\.\d+)?)\*kW\)/,
254+
regex: /^1-0:41\.7\.0\((\d+(\.\d+)?)\*(\w+)\)/,
214255
parser: ({ regexResult, result }) => {
256+
let value = parseFloat(regexResult[1]);
257+
const unit = regexResult[3];
258+
259+
if (unit === 'W') {
260+
// Convert to kW
261+
value = value / 1000;
262+
}
263+
215264
result.electricity.powerReceived = result.electricity.powerReceived ?? {};
216-
result.electricity.powerReceived.l2 = parseFloat(regexResult[1]);
265+
result.electricity.powerReceived.l2 = value;
217266
},
218267
},
219268
{
220-
regex: /^1-0:61\.7\.0\((\d+(\.\d+)?)\*kW\)/,
269+
regex: /^1-0:61\.7\.0\((\d+(\.\d+)?)\*(\w+)\)/,
221270
parser: ({ regexResult, result }) => {
271+
let value = parseFloat(regexResult[1]);
272+
const unit = regexResult[3];
273+
274+
if (unit === 'W') {
275+
// Convert to kW
276+
value = value / 1000;
277+
}
278+
222279
result.electricity.powerReceived = result.electricity.powerReceived ?? {};
223-
result.electricity.powerReceived.l3 = parseFloat(regexResult[1]);
280+
result.electricity.powerReceived.l3 = value;
224281
},
225282
},
226283
{
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"raw": "/EST5\\123456789_A\r\n\r\n1-3:0.2.8(50)\r\n0-0:1.0.0(250319102812W)\r\n1-0:1.8.0(000201282*Wh)\r\n1-0:1.8.1(000134904*Wh)\r\n1-0:1.8.2(000066378*Wh)\r\n1-0:1.7.0(000000000*W)\r\n1-0:2.8.0(000320908*Wh)\r\n1-0:2.8.1(000317131*Wh)\r\n1-0:2.8.2(000003777*Wh)\r\n1-0:2.7.0(000003996*W)\r\n1-0:3.8.0(000036520*varh)\r\n1-0:3.8.1(000032377*varh)\r\n1-0:3.8.2(000004143*varh)\r\n1-0:3.7.0(000000000*var)\r\n1-0:4.8.0(000259742*varh)\r\n1-0:4.8.1(000169558*varh)\r\n1-0:4.8.2(000090184*varh)\r\n1-0:4.7.0(000000221*var)\r\n!FFFF\r\n",
3+
"header": {
4+
"identifier": "\\123456789_A",
5+
"xxx": "EST",
6+
"z": "5"
7+
},
8+
"metadata": {
9+
"dsmrVersion": 5,
10+
"timestamp": "250319102812W",
11+
"unknownLines": [
12+
"1-0:3.8.0(000036520*varh)",
13+
"1-0:3.8.1(000032377*varh)",
14+
"1-0:3.8.2(000004143*varh)",
15+
"1-0:3.7.0(000000000*var)",
16+
"1-0:4.8.0(000259742*varh)",
17+
"1-0:4.8.1(000169558*varh)",
18+
"1-0:4.8.2(000090184*varh)",
19+
"1-0:4.7.0(000000221*var)"
20+
]
21+
},
22+
"electricity": {
23+
"total": {
24+
"received": 201.282,
25+
"returned": 320.908
26+
},
27+
"tariffs": {
28+
"1": {
29+
"received": 134.904,
30+
"returned": 317.131
31+
},
32+
"2": {
33+
"received": 66.378,
34+
"returned": 3.777
35+
}
36+
},
37+
"powerReceivedTotal": 0,
38+
"powerReturnedTotal": 3.996
39+
},
40+
"mBus": {},
41+
"crc": {
42+
"value": 65535,
43+
"valid": false
44+
}
45+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/EST5\123456789_A
2+
3+
1-3:0.2.8(50)
4+
0-0:1.0.0(250319102812W)
5+
1-0:1.8.0(000201282*Wh)
6+
1-0:1.8.1(000134904*Wh)
7+
1-0:1.8.2(000066378*Wh)
8+
1-0:1.7.0(000000000*W)
9+
1-0:2.8.0(000320908*Wh)
10+
1-0:2.8.1(000317131*Wh)
11+
1-0:2.8.2(000003777*Wh)
12+
1-0:2.7.0(000003996*W)
13+
1-0:3.8.0(000036520*varh)
14+
1-0:3.8.1(000032377*varh)
15+
1-0:3.8.2(000004143*varh)
16+
1-0:3.7.0(000000000*var)
17+
1-0:4.8.0(000259742*varh)
18+
1-0:4.8.1(000169558*varh)
19+
1-0:4.8.2(000090184*varh)
20+
1-0:4.7.0(000000221*var)
21+
!FFFF

0 commit comments

Comments
 (0)