Skip to content

Commit 3aca595

Browse files
committed
Fix json keys for wmbus to be unique
* Key inst_volume_0 is now unique
1 parent 7d51297 commit 3aca595

File tree

1 file changed

+41
-33
lines changed

1 file changed

+41
-33
lines changed

src/devices/m_bus.c

Lines changed: 41 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -280,26 +280,33 @@ static char *unit_names[][3] = {
280280
static double pow10_table[8] = { 0.001, 0.01, 0.1, 1, 10, 100, 1000, 10000 };
281281

282282

283-
static data_t *append_str(data_t *data, enum UnitType unit_type, uint8_t value_type, uint8_t sn, char const *extra, char const *value)
283+
static data_t *append_str(data_t *data, enum UnitType unit_type, uint8_t value_type, uint8_t sn,
284+
char const *key_extra, char const *pretty_extra, char const *value)
284285
{
285286
char key[100] = {0};
286287
char pretty[100] = {0};
287288

288289
value_type &= 0x3;
289290

290-
snprintf(key, sizeof(key), "%s_%s_%d", value_types_tab[value_type][0], unit_names[unit_type][0], sn);
291-
if (extra[0] == '\0') {
291+
if (key_extra[0] == '\0') {
292+
snprintf(key, sizeof(key), "%s_%s_%d", value_types_tab[value_type][0], unit_names[unit_type][0], sn);
293+
} else {
294+
snprintf(key, sizeof(key), "%s_%s_%s_%d", value_types_tab[value_type][0], unit_names[unit_type][0], key_extra, sn);
295+
}
296+
297+
if (pretty_extra[0] == '\0') {
292298
snprintf(pretty, sizeof(pretty), "%s %s[%d]", value_types_tab[value_type][1], unit_names[unit_type][1], sn);
293299
} else {
294-
snprintf(pretty, sizeof(pretty), "%s %s %s", value_types_tab[value_type][1], unit_names[unit_type][1], extra);
300+
snprintf(pretty, sizeof(pretty), "%s %s %s", value_types_tab[value_type][1], unit_names[unit_type][1], pretty_extra);
295301
}
296302

297303
return data_append(data,
298304
key, pretty, DATA_STRING, value, NULL);
299305

300306
}
301307

302-
static data_t *append_val(data_t *data, enum UnitType unit_type, uint8_t value_type, uint8_t sn, char const *extra, int64_t val, int exp)
308+
static data_t *append_val(data_t *data, enum UnitType unit_type, uint8_t value_type, uint8_t sn,
309+
char const *key_extra, char const *pretty_extra, int64_t val, int exp)
303310
{
304311
char const *prefix = "";
305312
char buffer_val[256] = {0};
@@ -332,7 +339,7 @@ static data_t *append_val(data_t *data, enum UnitType unit_type, uint8_t value_t
332339

333340
snprintf(buffer_val, sizeof(buffer_val), "%.03f %s%s", fvalue, prefix, unit_names[unit_type][2]);
334341

335-
return append_str(data, unit_type, value_type, sn, extra, buffer_val);
342+
return append_str(data, unit_type, value_type, sn, key_extra, pretty_extra, buffer_val);
336343
}
337344

338345
static size_t m_bus_tm_decode(const uint8_t *data, size_t data_size, char *output, size_t output_size)
@@ -516,96 +523,97 @@ static int m_bus_decode_records(data_t *data, const uint8_t *b, uint8_t dif_codi
516523
case 0:
517524
if ((vif_uam&0xF8) == 0) {
518525
// E000 0nnn Energy 10nnn-3 Wh 0.001Wh to 10000Wh
519-
data = append_val(data, kEnergy_Wh, dif_ff, dif_sn, "", val, -3 + (vif_uam&0x7));
526+
data = append_val(data, kEnergy_Wh, dif_ff, dif_sn, "", "", val, -3 + (vif_uam&0x7));
520527
} else if ((vif_uam&0xF8) == 0x08) {
521528
// E000 1nnn Energy 10nnn J 0.001kJ to 10000kJ
522-
data = append_val(data, kEnergy_J, dif_ff, dif_sn, "", val, vif_uam&0x7);
529+
data = append_val(data, kEnergy_J, dif_ff, dif_sn, "", "", val, vif_uam&0x7);
523530
} else if ((vif_uam&0xF8) == 0x10) {
524531
// E001 0nnn Volume 10nnn-6 m3 0.001l to 10000l
525532

526533
if (dif_sn == 0) {
527-
data = append_val(data, kVolume, dif_ff, dif_sn, "", val, -6 + (vif_uam&0x7));
534+
data = append_val(data, kVolume, dif_ff, dif_sn, "", "", val, -6 + (vif_uam&0x7));
528535
} else
529536
if (dif_sn >= 8 && dif_sn <= 19) {
530537
dif_sn -= 8;
531-
data = append_val(data, kVolume, dif_ff, dif_sn, history_months[dif_sn][1], val, -6 + (vif_uam&0x7));
538+
data = append_val(data, kVolume, dif_ff, dif_sn,
539+
history_months[dif_sn][0], history_months[dif_sn][1], val, -6 + (vif_uam&0x7));
532540
}
533541

534542
} else if ((vif_uam&0xF8) == 0x18) {
535543
// E001 1nnn Mass 10nnn-3 kg 0.001kg to 10000kg
536-
data = append_val(data, kEnergy_J, dif_ff, dif_sn, "", val, -3 + (vif_uam&0x7));
544+
data = append_val(data, kEnergy_J, dif_ff, dif_sn, "", "", val, -3 + (vif_uam&0x7));
537545
} else if ((vif_uam&0xFC) == 0x20) {
538546
/* E010 00nn On Time nn = 00 seconds
539547
nn = 01 minutes
540548
nn = 10 hours
541549
nn = 11 days */
542550
switch (vif_uam&3) {
543-
case 0: data = append_val(data, kOnTimeSec, dif_ff, dif_sn, "", val, 0); break;
544-
case 1: data = append_val(data, kOnTimeMin, dif_ff, dif_sn, "", val, 0); break;
545-
case 2: data = append_val(data, kOnTimeHours, dif_ff, dif_sn, "", val, 0); break;
546-
case 3: data = append_val(data, kOnTimeDays, dif_ff, dif_sn, "", val, 0); break;
551+
case 0: data = append_val(data, kOnTimeSec, dif_ff, dif_sn, "", "", val, 0); break;
552+
case 1: data = append_val(data, kOnTimeMin, dif_ff, dif_sn, "", "", val, 0); break;
553+
case 2: data = append_val(data, kOnTimeHours, dif_ff, dif_sn, "", "", val, 0); break;
554+
case 3: data = append_val(data, kOnTimeDays, dif_ff, dif_sn, "", "", val, 0); break;
547555
default: break;
548556
}
549557
} else if ((vif_uam&0xFC) == 0x24) {
550558
// E010 01nn Operating Time coded like OnTime
551559
switch (vif_uam&3) {
552-
case 0: data = append_val(data, kOperTimeSec, dif_ff, dif_sn, "", val, 0); break;
553-
case 1: data = append_val(data, kOperTimeMin, dif_ff, dif_sn, "", val, 0); break;
554-
case 2: data = append_val(data, kOperTimeHours, dif_ff, dif_sn, "", val, 0); break;
555-
case 3: data = append_val(data, kOperTimeDays, dif_ff, dif_sn, "", val, 0); break;
560+
case 0: data = append_val(data, kOperTimeSec, dif_ff, dif_sn, "", "", val, 0); break;
561+
case 1: data = append_val(data, kOperTimeMin, dif_ff, dif_sn, "", "", val, 0); break;
562+
case 2: data = append_val(data, kOperTimeHours, dif_ff, dif_sn, "", "", val, 0); break;
563+
case 3: data = append_val(data, kOperTimeDays, dif_ff, dif_sn, "", "", val, 0); break;
556564
default: break;
557565
}
558566
} else if ((vif_uam&0xF8) == 0x28) {
559567
// E010 1nnn Power 10nnn-3 W 0.001W to 10000W
560-
data = append_val(data, kPower_W, dif_ff, dif_sn, "", val, -3 + (vif_uam&0x7));
568+
data = append_val(data, kPower_W, dif_ff, dif_sn, "", "", val, -3 + (vif_uam&0x7));
561569
} else if ((vif_uam&0xF8) == 0x30) {
562570
// E011 0nnn Power 10nnn J/h 0.001kJ/h to 10000kJ/h
563-
data = append_val(data, kPower_Jh, dif_ff, dif_sn, "", val, vif_uam&0x7);
571+
data = append_val(data, kPower_Jh, dif_ff, dif_sn, "", "", val, vif_uam&0x7);
564572
} else if ((vif_uam&0xF8) == 0x38) {
565573
// E011 1nnn Volume Flow 10nnn-6 m3/h 0.001l/h to 10000l/h
566-
data = append_val(data, kVolumeFlow_h, dif_ff, dif_sn, "", val, -6 + (vif_uam&0x7));
574+
data = append_val(data, kVolumeFlow_h, dif_ff, dif_sn, "", "", val, -6 + (vif_uam&0x7));
567575
} else if ((vif_uam&0xF8) == 0x40) {
568576
// E100 0nnn Volume Flow ext. 10nnn-7 m3/min 0.0001l/min to 1000l/min
569-
data = append_val(data, kVolumeFlow_min, dif_ff, dif_sn, "", val, -7 + (vif_uam&0x7));
577+
data = append_val(data, kVolumeFlow_min, dif_ff, dif_sn, "", "", val, -7 + (vif_uam&0x7));
570578
} else if ((vif_uam&0xF8) == 0x48) {
571579
// E100 1nnn Volume Flow ext. 10nnn-9 m³/s 0.001ml/s to 10000ml/s
572580
// in litres so exp -3
573-
data = append_val(data, kVolumeFlow_s, dif_ff, dif_sn, "", val, -3 + (vif_uam&0x7));
581+
data = append_val(data, kVolumeFlow_s, dif_ff, dif_sn, "", "", val, -3 + (vif_uam&0x7));
574582
} else if ((vif_uam&0xF8) == 0x50) {
575583
// E101 0nnn Mass flow 10nnn-3 kg/h 0.001kg/h to 10000kg/h
576-
data = append_val(data, kMassFlow, dif_ff, dif_sn, "", val, -3 + (vif_uam&0x7));
584+
data = append_val(data, kMassFlow, dif_ff, dif_sn, "", "", val, -3 + (vif_uam&0x7));
577585
} else if ((vif_uam&0xFC) == 0x58) {
578586
// E101 10nn Flow Temperature 10nn-3 °C 0.001°C to 1°C
579-
data = append_val(data, kTemperatureFlow, dif_ff, dif_sn, "", val, -3 + (vif_uam&0x3));
587+
data = append_val(data, kTemperatureFlow, dif_ff, dif_sn, "", "", val, -3 + (vif_uam&0x3));
580588
} else if ((vif_uam&0xFC) == 0x5C) {
581589
// E101 11nn Return Temperature 10nn-3 °C 0.001°C to 1°C
582-
data = append_val(data, kTemperatureReturn, dif_ff, dif_sn, "", val, -3 + (vif_uam&0x3));
590+
data = append_val(data, kTemperatureReturn, dif_ff, dif_sn, "", "", val, -3 + (vif_uam&0x3));
583591
} else if ((vif_uam&0xFC) == 0x60) {
584592
// E110 00nn Temperature Difference 10nn-3 K 1mK to 1000mK
585-
data = append_val(data, kTemperatureDiff, dif_ff, dif_sn, "", val, -3 + (vif_uam&0x3));
593+
data = append_val(data, kTemperatureDiff, dif_ff, dif_sn, "", "", val, -3 + (vif_uam&0x3));
586594
} else if ((vif_uam&0xFC) == 0x64) {
587595
// E110 01nn External temperature 10 nn-3 ° C 0.001 ° C to 1 ° C
588-
data = append_val(data, kTemperatureExtern, dif_ff, dif_sn, history_hours[dif_sn&0x3], val, -3 + (vif_uam&0x3));
596+
data = append_val(data, kTemperatureExtern, dif_ff, dif_sn, "", history_hours[dif_sn&0x3], val, -3 + (vif_uam&0x3));
589597
} else if ((vif_uam&0xFC) == 0x68) {
590598
// E110 10nn Pressure 10nn-3 bar 1mbar to 1000mbar
591-
data = append_val(data, kPressure, dif_ff, dif_sn, "", val, -3 + (vif_uam&0x3));
599+
data = append_val(data, kPressure, dif_ff, dif_sn, "", "", val, -3 + (vif_uam&0x3));
592600
} else if ((vif_uam&0xFE) == 0x6C) {
593601
// E110 110n Time Point n = 0 date, n = 1 time & date
594602
char buff_time[256] = {0};
595603

596604
if (vif_uam&1) {
597605
if (m_bus_tm_decode(b, dif_coding, buff_time, sizeof(buff_time))) {
598-
data = append_str(data, kTimeDate, dif_ff, dif_sn, "", buff_time);
606+
data = append_str(data, kTimeDate, dif_ff, dif_sn, "", "", buff_time);
599607
}
600608
} else {
601609
if (m_bus_tm_decode(b, dif_coding, buff_time, sizeof(buff_time))) {
602-
data = append_str(data, kDate, dif_ff, dif_sn, "", buff_time);
610+
data = append_str(data, kDate, dif_ff, dif_sn, "", "", buff_time);
603611
}
604612
}
605613

606614
} else if (vif_uam == 0x6E) {
607615
// E110 1110 Units for H.C.A. dimensionless
608-
data = append_val(data, kHca, dif_ff, dif_sn, "", val, 0);
616+
data = append_val(data, kHca, dif_ff, dif_sn, "", "", val, 0);
609617
} else if ((vif_uam&0xFC) == 0x70) {
610618
// E111 00nn Averaging Duration coded like OnTime
611619
} else if ((vif_uam&0xFC) == 0x74) {

0 commit comments

Comments
 (0)