diff --git a/mbus/mbus-protocol-aux.h b/mbus/mbus-protocol-aux.h
index f29065d..86e1564 100644
--- a/mbus/mbus-protocol-aux.h
+++ b/mbus/mbus-protocol-aux.h
@@ -128,6 +128,18 @@ typedef struct _mbus_record {
} mbus_record;
+/**
+ * Event callback functions
+ */
+extern void (*_mbus_scan_progress)(mbus_handle * handle, const char *mask);
+extern void (*_mbus_found_event)(mbus_handle * handle, mbus_frame *frame);
+
+/**
+ * Event register functions
+ */
+void mbus_register_scan_progress(void (*event)(mbus_handle * handle, const char *mask));
+void mbus_register_found_event(void (*event)(mbus_handle * handle, mbus_frame *frame));
+
/**
* Connects to serial gateway and initializes MBus handle
*
diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c
index 475a203..f7fff71 100644
--- a/mbus/mbus-protocol.c
+++ b/mbus/mbus-protocol.c
@@ -748,6 +748,173 @@ mbus_decode_manufacturer(u_char byte1, u_char byte2)
return m_str;
}
+const char *
+mbus_data_product_name(mbus_data_variable_header *header)
+{
+ static char buff[128];
+ unsigned int manufacturer;
+
+ if (header)
+ {
+ manufacturer = (header->manufacturer[1] << 8) + header->manufacturer[0];
+
+ if (manufacturer == MBUS_VARIABLE_DATA_MAN_ACW)
+ {
+ switch (header->version)
+ {
+ case 0x09:
+ strcpy(buff,"Itron CF Echo 2");
+ break;
+ case 0x0A:
+ strcpy(buff,"Itron CF 51");
+ break;
+ case 0x0B:
+ strcpy(buff,"Itron CF 55");
+ break;
+ case 0x0E:
+ strcpy(buff,"Itron BM +m");
+ break;
+ case 0x0F:
+ strcpy(buff,"Itron CF 800");
+ break;
+ case 0x14:
+ strcpy(buff,"Itron CYBLE M-Bus 1.4");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SLB)
+ {
+ switch (header->version)
+ {
+ case 0x02:
+ strcpy(buff,"Allmess Megacontrol CF-50");
+ break;
+ case 0x06:
+ strcpy(buff,"CF Compact / Integral MK MaXX");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_HYD)
+ {
+ switch (header->version)
+ {
+ case 0x02:
+ strcpy(buff,"ABB F95 Typ US770");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_LUG)
+ {
+ switch (header->version)
+ {
+ case 0x02:
+ strcpy(buff,"Landis & Gyr Ultraheat 2WR5");
+ break;
+ case 0x03:
+ strcpy(buff,"Landis & Gyr Ultraheat 2WR6");
+ break;
+ case 0x04:
+ strcpy(buff,"Landis & Gyr Ultraheat UH50");
+ break;
+ case 0x07:
+ strcpy(buff,"Landis & Gyr Ultraheat T230");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_ZRM)
+ {
+ switch (header->version)
+ {
+ case 0x81:
+ strcpy(buff,"Minol Minocal C2");
+ break;
+ case 0x82:
+ strcpy(buff,"Minol Minocal WR3");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SVM)
+ {
+ switch (header->version)
+ {
+ case 0x08:
+ strcpy(buff,"Elster F2");
+ break;
+ case 0x09:
+ strcpy(buff,"Kamstrup SVM F22");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SON)
+ {
+ switch (header->version)
+ {
+ case 0x0D:
+ strcpy(buff,"Sontex Supercal 531");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_LSE)
+ {
+ switch (header->version)
+ {
+ case 0x99:
+ strcpy(buff,"Siemens WFH21");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SPX)
+ {
+ switch (header->version)
+ {
+ case 0x31:
+ strcpy(buff,"Sensus PolluTherm");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_ELS)
+ {
+ switch (header->version)
+ {
+ case 0x02:
+ strcpy(buff,"Elster TMP-A");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_NZR)
+ {
+ switch (header->version)
+ {
+ case 0x01:
+ strcpy(buff,"NZR DHZ 5/63");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_KAM)
+ {
+ switch (header->version)
+ {
+ case 0x08:
+ strcpy(buff,"Kamstrup Multical 601");
+ break;
+ }
+ }
+ else if (manufacturer == MBUS_VARIABLE_DATA_MAN_EMH)
+ {
+ switch (header->version)
+ {
+ case 0x00:
+ strcpy(buff,"EMH DIZ");
+ break;
+ }
+ }
+
+ return buff;
+ }
+
+ return "";
+}
+
//------------------------------------------------------------------------------
//
// FIXED-LENGTH DATA RECORD FUNCTIONS
@@ -2172,6 +2339,7 @@ mbus_data_record_function(mbus_data_record *record)
return NULL;
}
+
///
/// For fixed-length frames, return a string describing the type of value (stored or actual)
///
@@ -3079,6 +3247,10 @@ mbus_data_variable_header_xml(mbus_data_variable_header *header)
mbus_decode_manufacturer(header->manufacturer[0], header->manufacturer[1]));
len += snprintf(&buff[len], sizeof(buff) - len, " %d\n", header->version);
+ mbus_str_xml_encode(str_encoded, mbus_data_product_name(header), sizeof(str_encoded));
+
+ len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
+
mbus_str_xml_encode(str_encoded, mbus_data_variable_medium_lookup(header->medium), sizeof(str_encoded));
len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
diff --git a/mbus/mbus-protocol.h b/mbus/mbus-protocol.h
index d21adc9..70b6847 100644
--- a/mbus/mbus-protocol.h
+++ b/mbus/mbus-protocol.h
@@ -459,6 +459,25 @@ typedef struct _mbus_data_secondary_address {
#define MBUS_VARIABLE_DATA_MEDIUM_PRESSURE 0x18
#define MBUS_VARIABLE_DATA_MEDIUM_ADC 0x19
+#define MBUS_VARIABLE_DATA_MAN_ACW 0x0477
+#define MBUS_VARIABLE_DATA_MAN_ABB 0x0442
+#define MBUS_VARIABLE_DATA_MAN_AMT 0x05B4
+#define MBUS_VARIABLE_DATA_MAN_ELS 0x1593
+#define MBUS_VARIABLE_DATA_MAN_EMH 0x15A8
+#define MBUS_VARIABLE_DATA_MAN_HYD 0x2324
+#define MBUS_VARIABLE_DATA_MAN_KAM 0x2C2D
+#define MBUS_VARIABLE_DATA_MAN_LSE 0x3265
+#define MBUS_VARIABLE_DATA_MAN_LUG 0x32A7
+#define MBUS_VARIABLE_DATA_MAN_NZR 0x3B52
+#define MBUS_VARIABLE_DATA_MAN_PAD 0x4024
+#define MBUS_VARIABLE_DATA_MAN_QDS 0x4493
+#define MBUS_VARIABLE_DATA_MAN_SLB 0x4D82
+#define MBUS_VARIABLE_DATA_MAN_SON 0x4DEE
+#define MBUS_VARIABLE_DATA_MAN_SPX 0x4E18
+#define MBUS_VARIABLE_DATA_MAN_SVM 0x4ECD
+#define MBUS_VARIABLE_DATA_MAN_TCM 0x5068
+#define MBUS_VARIABLE_DATA_MAN_ZRM 0x6A4D
+
//
// Event callback functions
//
@@ -564,6 +583,7 @@ void mbus_hex_dump(const char *label, const char *buff, size_t len);
//
int mbus_data_manufacturer_encode(u_char *m_data, u_char *m_code);
const char *mbus_decode_manufacturer(u_char byte1, u_char byte2);
+const char *mbus_data_product_name(mbus_data_variable_header *header);
int mbus_data_bcd_encode(u_char *bcd_data, size_t bcd_data_size, int value);
int mbus_data_int_encode(u_char *int_data, size_t int_data_size, int value);