mbusgateway3variant/cube/User/Src/mbusParserExt.c

93 lines
2.9 KiB
C
Raw Normal View History

2020-11-17 18:13:34 +01:00
#include <mbus/mbus-protocol.h>
#include <mbusParserExt.h>
2020-11-17 18:26:11 +01:00
#include <logger.h>
2020-11-17 18:13:34 +01:00
2020-11-17 18:20:09 +01:00
#include <string.h>
2020-11-17 18:44:57 +01:00
#include <stdint.h>
#include <stdbool.h>
2020-11-17 18:13:34 +01:00
2020-11-18 18:47:52 +01:00
static const char NAME_VOLTAGE[] = "Voltage";
static const char NAME_CURRENT[] = "Current";
static const char NAME_POWER[] = "Power";
static const char NAME_ENERGY[] = "Energy";
2022-10-16 19:40:34 +02:00
static const char NAME_VOLUME[] = "Volume";
2020-11-18 18:47:52 +01:00
static const char NAME_UNKNOWN[] = "unknown";
static const char UNIT_VOLT[] = "V";
static const char UNIT_AMPERE[] = "A";
static const char UNIT_WATT[] = "W";
static const char UNIT_WATTHOUR[] = "Wh";
2022-10-16 19:40:34 +02:00
static const char UNIT_QUBICMETER[] = "m3";
2020-11-18 18:47:52 +01:00
static const char UNIT_UNKNOWN[] = "?";
2020-11-17 18:13:34 +01:00
static parsedVIB_t parseVIB_FB(mbus_value_information_block vib) {
2020-11-18 18:47:52 +01:00
parsedVIB_t parsedVIB = { .name = NAME_UNKNOWN, .unit = UNIT_UNKNOWN, .exponent = 1, .found = false };
2020-11-17 18:13:34 +01:00
2020-11-17 18:34:55 +01:00
coloredMsg(LOG_RED, true, "mpe pvd_fb unknown vife 0x%02x", vib.vife[0]);
2020-11-17 18:13:34 +01:00
return parsedVIB;
}
static parsedVIB_t parseVIB_FD(mbus_value_information_block vib) {
2020-11-18 18:47:52 +01:00
parsedVIB_t parsedVIB = { .name = NAME_UNKNOWN, .unit = UNIT_UNKNOWN, .exponent = 1, .found = false };
2020-11-17 18:13:34 +01:00
2020-11-17 18:34:55 +01:00
if ((vib.vife[0] & 0b01110000) == 0b01000000) {
2020-11-18 18:47:52 +01:00
parsedVIB.name = NAME_VOLTAGE;
parsedVIB.unit = UNIT_VOLT;
2020-11-17 18:34:55 +01:00
parsedVIB.exponent = (vib.vife[0] & 0b01111) - 9;
2020-11-17 18:44:57 +01:00
parsedVIB.found = true;
2020-11-17 18:34:55 +01:00
} else if ((vib.vife[0] & 0b01110000) == 0b01010000) {
2020-11-18 18:47:52 +01:00
parsedVIB.name = NAME_CURRENT;
parsedVIB.unit = UNIT_AMPERE;
2020-11-17 18:34:55 +01:00
parsedVIB.exponent = (vib.vife[0] & 0b01111) - 12;
2020-11-17 18:44:57 +01:00
parsedVIB.found = true;
2020-11-17 18:34:55 +01:00
} else {
coloredMsg(LOG_RED, true, "mpe pvd_fd unknown vife 0x%02x", vib.vife[0]);
}
2020-11-17 18:13:34 +01:00
return parsedVIB;
}
static parsedVIB_t parseVIB_default(mbus_value_information_block vib) {
2020-11-18 18:47:52 +01:00
parsedVIB_t parsedVIB = { .name = NAME_UNKNOWN, .unit = UNIT_UNKNOWN, .exponent = 1, .found = false };
2020-11-17 18:20:09 +01:00
2020-11-17 18:28:41 +01:00
if ((vib.vif & 0b01111000) == 0b00000000) {
2020-11-18 18:47:52 +01:00
parsedVIB.name = NAME_ENERGY;
parsedVIB.unit = UNIT_WATTHOUR;
2020-11-17 18:21:49 +01:00
parsedVIB.exponent = (vib.vif & 0b0111) - 3;
2020-11-17 18:44:57 +01:00
parsedVIB.found = true;
2020-11-17 18:28:41 +01:00
} else if ((vib.vif & 0b01111000) == 0b00101000) {
2020-11-18 18:47:52 +01:00
parsedVIB.name = NAME_POWER;
parsedVIB.unit = UNIT_WATT;
2020-11-17 18:26:11 +01:00
parsedVIB.exponent = (vib.vif & 0b0111) - 3;
2020-11-17 18:44:57 +01:00
parsedVIB.found = true;
2022-10-16 19:40:34 +02:00
} else if ((vib.vif & 0b01111000) == 0b00010000) {
parsedVIB.name = NAME_VOLUME;
parsedVIB.unit = UNIT_QUBICMETER;
parsedVIB.exponent = (vib.vif & 0b0111) - 3;
parsedVIB.found = true;
2020-11-17 18:26:11 +01:00
} else {
coloredMsg(LOG_RED, true, "mpe pvd unknown vif 0x%02x", vib.vif);
2020-11-17 18:20:09 +01:00
}
2020-11-17 18:13:34 +01:00
return parsedVIB;
}
parsedVIB_t parseVIB(mbus_value_information_block vib) {
parsedVIB_t parsedVIB;
if (vib.vif == 0xfb) {
parsedVIB = parseVIB_FB(vib);
} else if (vib.vif == 0xfd) {
parsedVIB = parseVIB_FD(vib);
} else {
parsedVIB = parseVIB_default(vib);
}
return parsedVIB;
}