From 7f11af4bd97730fb59eecff7f201bfa5d8c0c0fe Mon Sep 17 00:00:00 2001 From: "Christian W. Zuckschwerdt" Date: Tue, 16 Jul 2024 00:02:59 +0200 Subject: [PATCH] Fix HCA output --- src/devices/m_bus.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/devices/m_bus.c b/src/devices/m_bus.c index 4ba6d636a..d09374f2d 100644 --- a/src/devices/m_bus.c +++ b/src/devices/m_bus.c @@ -773,7 +773,6 @@ static int parse_block2(const m_bus_data_t *in, m_bus_block1_t *block1) } /* Q-walk_by */ - /* based on leaked infos */ /* 000: CI:120 */ /* 000: 0x780dff5f Magic for QUNDIS walk_by */ /* 004: 0x35 L:53 Length of walk_by field (under investigation) */ @@ -781,10 +780,13 @@ static int parse_block2(const m_bus_data_t *in, m_bus_block1_t *block1) /* 006: 0x82 unknown */ /* 007: AC AccessNumber */ /* 008: 0x0000 CW:0 no encryption */ + /* 015: 0xffff V:total key */ /* 017: 0x00000000 V:total - BCD LSB first */ + /* 021: 0xff2c V:lastyear key */ /* 023: 0x00000000 V:lastyear - BCD LSB first */ + /* 027: 0x1e36 V:lastmonth key */ /* 029: 0x00000000 V:lastmonth - BCD LSB first */ - /* timestamps following */ + /* timestamps follow */ uint32_t ci_magic = ((uint32_t)b[0] << 24) | (b[1] << 16) | (b[2] << 8) | (b[3]); if (ci_magic == 0x780dff5f) { b2->AC = b[7]; @@ -798,14 +800,14 @@ static int parse_block2(const m_bus_data_t *in, m_bus_block1_t *block1) if (block1->A_DevType == 6) { /* WarmWater */ // Value factor is 0.001, e.g. 123.456 m3 - b2->q_total_m3 = b2->q_total / 1000.0f; - b2->q_lastyear_m3 = b2->q_lastyear / 1000.0f; - b2->q_lastmonth_m3 = b2->q_lastmonth / 1000.0f; + b2->q_total_m3 = b2->q_total * 0.001f; + b2->q_lastyear_m3 = b2->q_lastyear * 0.001f; + b2->q_lastmonth_m3 = b2->q_lastmonth * 0.001f; b2->q_mode = QDS_WW; } if (block1->A_DevType == 8) { /* Heat Cost Allocator */ - // Value factor is 1, e.g. 123456 m3 + // Value factor is K (from an invoice), e.g. 123456*K kW/h b2->q_mode = QDS_HCA; } } @@ -952,9 +954,9 @@ static int m_bus_output_data(r_device *decoder, bitbuffer_t *bitbuffer, const m_ "Q_total_m3", "Q_total_m3", DATA_COND, block1->block2.q_mode == QDS_WW, DATA_FORMAT, "%.3f m3", DATA_DOUBLE, block1->block2.q_total_m3, "Q_lastyear_m3", "Q_lastyear_m3", DATA_COND, block1->block2.q_mode == QDS_WW, DATA_FORMAT, "%.3f m3", DATA_DOUBLE, block1->block2.q_lastyear_m3, "Q_lastmonth_m3", "Q_lastmonth_m3", DATA_COND, block1->block2.q_mode == QDS_WW, DATA_FORMAT, "%.3f m3", DATA_DOUBLE, block1->block2.q_lastmonth_m3, - "Q_total", "Q_total", DATA_COND, block1->block2.q_mode == QDS_HCA, DATA_DOUBLE, block1->block2.q_total, - "Q_lastyear", "Q_lastyear", DATA_COND, block1->block2.q_mode == QDS_HCA, DATA_DOUBLE, block1->block2.q_lastyear, - "Q_lastmonth", "Q_lastmonth", DATA_COND, block1->block2.q_mode == QDS_HCA, DATA_DOUBLE, block1->block2.q_lastmonth, + "Q_total", "Q_total", DATA_COND, block1->block2.q_mode == QDS_HCA, DATA_INT, block1->block2.q_total, + "Q_lastyear", "Q_lastyear", DATA_COND, block1->block2.q_mode == QDS_HCA, DATA_INT, block1->block2.q_lastyear, + "Q_lastmonth", "Q_lastmonth", DATA_COND, block1->block2.q_mode == QDS_HCA, DATA_INT, block1->block2.q_lastmonth, "mic", "Integrity", DATA_STRING, "CRC", NULL); /* clang-format on */ @@ -963,7 +965,7 @@ static int m_bus_output_data(r_device *decoder, bitbuffer_t *bitbuffer, const m_ /* clang-format off */ data = data_int(data, "CI", "Control Info", "0x%02X", block1->block2.CI); data = data_int(data, "AC", "Access number", "0x%02X", block1->block2.AC); - data = data_int(data, "ST", "Device Type", "0x%02X", block1->block2.ST); + data = data_int(data, "ST", "Status", "0x%02X", block1->block2.ST); data = data_int(data, "CW", "Configuration Word", "0x%04X", block1->block2.CW); /* clang-format on */ }