brewco/rdconfig.c

changeset 435
4b1ed6897d80
parent 434
eb724767860d
child 438
7d1ec160d751
--- a/brewco/rdconfig.c	Wed Nov 25 22:49:35 2015 +0100
+++ b/brewco/rdconfig.c	Thu Nov 26 22:47:42 2015 +0100
@@ -31,10 +31,11 @@
 #define MY_ENCODING "utf-8"
 
 const char	TEMPSTATE[3][8] = { "OK", "MISSING", "ERROR" };
-const char	DEVTYPE[8][6] = { "NA", "W1", "GPIO", "RC433", "DHT", "I2C", "SPI", "SIM" };
+const char	DEVTYPE[6][5] = { "NA", "W1", "GPIO", "I2C", "SPI", "SIM" };
 const char	DEVPRESENT[4][6] = { "UNDEF", "NO", "YES", "ERROR" };
 const char	DEVDIR[7][11] = { "UNDEF", "IN_BIN", "OUT_BIN", "IN_ANALOG", "OUT_ANALOG", "OUT_PWM", "INTERN" };
 const char	PIDMODE[3][5] = { "NONE", "AUTO", "BOO" };
+const char	WHIRLPOOL_TYPE[3][5] = { "OFF", "COLD", "HOT" };
 
 
 void killconfig(void)
@@ -51,14 +52,9 @@
 
     Config.my_port = 6554;
     Config.tempFormat = 'C';
-    if (Config.temp_address)
-        free(Config.temp_address);
-    if (Config.hum_address)
-        free(Config.hum_address);
-    Config.temp_address = Config.hum_address = NULL;
-    Config.temp_value = 20000;
-    Config.temp_state = Config.hum_state = 1;   // missing
-    Config.hum_value = 50000;
+    if (Config.roomtemp)
+        free(Config.roomtemp);
+    Config.roomtemp = NULL;
     Config.lcd_cols = 20;
     Config.lcd_rows = 4;
 
@@ -67,16 +63,20 @@
             free(unit->uuid);
         if (unit->name)
             free(unit->name);
-        if (unit->hlt_sensor_address)
-            free(unit->hlt_sensor_address);
-        if (unit->mlt_sensor_address)
-            free(unit->mlt_sensor_address);
-        if (unit->hlt_heater_address)
-            free(unit->hlt_heater_address);
-        if (unit->mlt_heater_address)
-            free(unit->mlt_heater_address);
-        if (unit->mlt_pump_address)
-            free(unit->mlt_pump_address);
+        if (unit->hlt_sensor)
+            free(unit->hlt_sensor);
+        if (unit->mlt_sensor)
+            free(unit->mlt_sensor);
+        if (unit->hlt_heater)
+            free(unit->hlt_heater);
+        if (unit->mlt_heater)
+            free(unit->mlt_heater);
+        if (unit->mlt_pump)
+            free(unit->mlt_pump);
+	if (unit->PID_hlt)
+	    free(unit->PID_hlt);
+	if (unit->PID_mlt)
+	    free(unit->PID_mlt);
         free(unit);
     }
     Config.units = NULL;
@@ -184,29 +184,19 @@
 	syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
 	return 1;
     }
-    if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "TEMP_ADDRESS", "%s", Config.temp_address)) < 0) {
-        syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-        return 1;
-    }
-    if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "TEMP_STATE", "%d", Config.temp_state)) < 0) {
-        syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-        return 1;                           
-    }
-    if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "TEMP_VALUE", "%d", Config.temp_value)) < 0) {
-        syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-        return 1;
-    }
-    if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HUM_ADDRESS", "%s", Config.hum_address)) < 0) {
-        syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-        return 1;
-    }   
-    if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HUM_STATE", "%d", Config.hum_state)) < 0) {
-        syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-        return 1;    
-    }   
-    if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HUM_VALUE", "%d", Config.hum_value)) < 0) {
-        syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-        return 1;
+    if (Config.roomtemp) {
+    	if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ROOMTEMP_UUID", "%s", Config.roomtemp->uuid)) < 0) {
+            syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+            return 1;
+    	}
+    	if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ROOMTEMP_STATE", "%d", Config.roomtemp->state)) < 0) {
+            syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+            return 1;                           
+    	}
+    	if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "ROOMTEMP_VALUE", "%d", Config.roomtemp->value)) < 0) {
+            syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+            return 1;
+    	}
     }
 
     /* 
@@ -285,80 +275,134 @@
                 return 1;
             }
 
-            if (unit->hlt_sensor_address) {
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_SENSOR_ADDRESS", "%s", unit->hlt_sensor_address)) < 0)) {
+            if (unit->hlt_sensor) {
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_SENSOR_UUID", "%s", unit->hlt_sensor->uuid)) < 0)) {
                     syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
                     return 1;
                 }
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_SENSOR_STATE", "%d", unit->hlt_sensor_state)) < 0)) {
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_SENSOR_STATE", "%d", unit->hlt_sensor->state)) < 0)) {
                     syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
                     return 1;
                 }
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_SENSOR_VALUE", "%d", unit->hlt_sensor_value)) < 0)) {
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_SENSOR_VALUE", "%d", unit->hlt_sensor->value)) < 0)) {
                     syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
                     return 1;
                 }
             }
 
-            if (unit->hlt_heater_address) {
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_HEATER_ADDRESS", "%s", unit->hlt_heater_address)) < 0)) {
+            if (unit->hlt_heater) {
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_HEATER_UUID", "%s", unit->hlt_heater->uuid)) < 0)) {
+                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+                    return 1;
+                }
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_HEATER_VALUE", "%d", unit->hlt_heater->value)) < 0)) {
+                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+                    return 1;
+                }
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_HEATER_DELAY", "%d", unit->hlt_heater->delay)) < 0)) {
                     syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
                     return 1;
                 }
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_HEATER_STATE", "%d", unit->hlt_heater_state)) < 0)) {
+            }
+
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_HEATER_MLTFIRST", "%d", unit->hlt_heater_mltfirst)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+
+            if (unit->mlt_sensor) {
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_SENSOR_UUID", "%s", unit->mlt_sensor->uuid)) < 0)) {
                     syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
                     return 1;
                 }
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "HLT_HEATER_DELAY", "%d", unit->hlt_heater_delay)) < 0)) {
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_SENSOR_STATE", "%d", unit->mlt_sensor->state)) < 0)) {
+                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+                    return 1;
+                }
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_SENSOR_VALUE", "%d", unit->mlt_sensor->value)) < 0)) {
                     syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
                     return 1;
                 }
             }
 
-            if (unit->mlt_sensor_address) {
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_SENSOR_ADDRESS", "%s", unit->mlt_sensor_address)) < 0)) {
+            if (unit->mlt_heater) {
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_HEATER_UUID", "%s", unit->mlt_heater->uuid)) < 0)) {
+                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+                    return 1;
+                }
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_HEATER_VALUE", "%d", unit->mlt_heater->value)) < 0)) {
+                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+                    return 1;
+                }
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_HEATER_DELAY", "%d", unit->mlt_heater->delay)) < 0)) {
                     syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
                     return 1;
                 }
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_SENSOR_STATE", "%d", unit->mlt_sensor_state)) < 0)) {
+            }
+
+            if (unit->mlt_pump) {
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_PUMP_UUID", "%s", unit->mlt_pump->uuid)) < 0)) {
                     syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
                     return 1;
                 }
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_SENSOR_VALUE", "%d", unit->mlt_sensor_value)) < 0)) {
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_PUMP_VALUE", "%d", unit->mlt_pump->value)) < 0)) {
+                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+                    return 1;
+                }
+                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_PUMP_DELAY", "%d", unit->mlt_pump->delay)) < 0)) {
                     syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
                     return 1;
                 }
             }
 
-            if (unit->mlt_heater_address) {
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_HEATER_ADDRESS", "%s", unit->mlt_heater_address)) < 0)) {
-                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-                    return 1;
-                }
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_HEATER_STATE", "%d", unit->mlt_heater_state)) < 0)) {
-                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-                    return 1;
-                }
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_HEATER_DELAY", "%d", unit->mlt_heater_delay)) < 0)) {
-                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-                    return 1;
-                }
-            }
-
-            if (unit->mlt_pump_address) {
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_PUMP_ADDRESS", "%s", unit->mlt_pump_address)) < 0)) {
-                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-                    return 1;
-                }
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_PUMP_STATE", "%d", unit->mlt_pump_state)) < 0)) {
-                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-                    return 1;
-                }
-                if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "MLT_PUMP_DELAY", "%d", unit->mlt_pump_delay)) < 0)) {
-                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-                    return 1;
-                }
-            }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PUMP_CYCLE", "%d", unit->pump_cycle)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PUMP_REST", "%d", unit->pump_rest)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PUMP_PREMASH", "%d", unit->pump_premash)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PUMP_ONMASH", "%d", unit->pump_onmash)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PUMP_MASHOUT", "%d", unit->pump_mashout)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PUMP_ONBOIL", "%d", unit->pump_onboil)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PUMP_STOP", "%d", unit->pump_stop)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "SKIP_ADD", "%d", unit->skip_add)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "SKIP_REMOVE", "%d", unit->skip_remove)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "SKIP_IODINE", "%d", unit->skip_iodine)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "IODINE_TIME", "%d", unit->iodine_time)) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
+	    if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "WHIRLPOOL", "%s", WHIRLPOOL_TYPE[unit->whirlpool])) < 0)) {
+		syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		return 1;
+	    }
 
             if (unit->PID_hlt) {
                 if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PID_HLT_IMAX", "%.2f", unit->PID_hlt->iMax)) < 0) {
@@ -405,10 +449,10 @@
                     syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
                     return 1;
                 }
-                if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PID_HLT_TYPE", "HEAT")) < 0) {
-                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-                    return 1;
-                }
+		if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PID_HLT_TIMES", "%d", unit->PID_hlt->Times)) < 0)) {
+		    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		    return 1;
+		}
             }
 
             if (unit->PID_mlt) {
@@ -456,10 +500,10 @@
                     syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
                     return 1;
                 }
-                if ((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PID_MLT_TYPE", "HEAT")) < 0) {
-                    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
-                    return 1;
-                }
+		if (((rc = xmlTextWriterWriteFormatElement(writer, BAD_CAST "PID_MLT_TIMES", "%d", unit->PID_mlt->Times)) < 0)) {
+		    syslog(LOG_NOTICE, "wrconfig: error at xmlTextWriterWriteFormatElement");
+		    return 1;
+		}
             }
 
             if ((rc = xmlTextWriterEndElement(writer)) < 0) {
@@ -707,11 +751,22 @@
     unit = (units_list *)malloc(sizeof(units_list));
     unit->next = NULL;
     unit->version = 1;
-    unit->uuid = unit->name = unit->hlt_sensor_address = unit->hlt_heater_address = unit->mlt_sensor_address = \
-                 unit->mlt_heater_address = unit->mlt_pump_address = NULL;
-    unit->hlt_sensor_state = unit->mlt_sensor_state = 1; // missing
-    unit->hlt_heater_state = unit->mlt_heater_state = unit->mlt_pump_state = 0;
-    unit->hlt_heater_delay = unit->mlt_heater_delay = unit->mlt_pump_delay = 20;     /* 5 minutes delay */
+    unit->uuid = unit->name = NULL;
+    unit->hlt_sensor = unit->mlt_sensor = NULL;
+    unit->hlt_heater = unit->mlt_heater = unit->mlt_pump = NULL;
+    unit->hlt_heater_mltfirst = 0;
+    unit->pump_cycle = 7;
+    unit->pump_rest = 2;
+    unit->pump_premash = 1;
+    unit->pump_onmash = 1;
+    unit->pump_mashout = 0;
+    unit->pump_onboil = 0;
+    unit->pump_stop = 90;
+    unit->skip_add = 0;
+    unit->skip_remove = 0;
+    unit->skip_iodine = 0;
+    unit->iodine_time = 90;
+    unit->whirlpool = 0;
     unit->PID_hlt = (pid_var *)malloc(sizeof(pid_var));
     unit->PID_mlt = (pid_var *)malloc(sizeof(pid_var));
     InitPID(unit->PID_hlt);
@@ -735,65 +790,200 @@
             unit->name = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
         }
 
-        if ((!xmlStrcmp(cur->name, (const xmlChar *)"HLT_SENSOR_ADDRESS"))) {
-            unit->hlt_sensor_address = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+        if ((!xmlStrcmp(cur->name, (const xmlChar *)"HLT_SENSOR_UUID"))) {
+	    if (unit->hlt_sensor == NULL) {
+		unit->hlt_sensor = (sensor_var *)malloc(sizeof(sensor_var));
+    		unit->hlt_sensor->uuid[0] = '\0';
+        	unit->hlt_sensor->state = 1;        // missing
+	    	unit->hlt_sensor->value = 0;
+	    }
+            snprintf(unit->hlt_sensor->uuid, 36, "%s", xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
         }
         if ((!xmlStrcmp(cur->name, (const xmlChar *)"HLT_SENSOR_STATE"))) {
             key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
             if (sscanf((const char *)key, "%d", &ival) == 1)
-                unit->hlt_sensor_state = ival;
+                unit->hlt_sensor->state = ival;
             xmlFree(key);
         }
         if ((!xmlStrcmp(cur->name, (const xmlChar *)"HLT_SENSOR_VALUE"))) {
             key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
             if (sscanf((const char *)key, "%d", &ival) == 1)
-                unit->hlt_sensor_value = ival;
+                unit->hlt_sensor->value = ival;
             xmlFree(key);                           
         }
-        if ((!xmlStrcmp(cur->name, (const xmlChar *)"HLT_HEATER_ADDRESS"))) {
-            unit->hlt_heater_address = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+
+        if ((!xmlStrcmp(cur->name, (const xmlChar *)"HLT_HEATER_UUID"))) {
+	    if (unit->hlt_heater == NULL) {
+		unit->hlt_heater = (switch_var *)malloc(sizeof(switch_var));
+		unit->hlt_heater->uuid[0] = '\0';
+		unit->hlt_heater->value = 0;
+		unit->hlt_heater->delay = 1;	// 15 seconds
+	    }
+            snprintf(unit->hlt_heater->uuid, 36, "%s", xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
         }
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"HLT_HEATER_VALUE"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->hlt_heater->value = ival;
+	    xmlFree(key);
+	}
         if ((!xmlStrcmp(cur->name, (const xmlChar *)"HLT_HEATER_DELAY"))) {
             key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
             if (sscanf((const char *)key, "%d", &ival) == 1)
-                unit->hlt_heater_delay = ival;
+                unit->hlt_heater->delay = ival;
             xmlFree(key);
         }
 
-        if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_SENSOR_ADDRESS"))) {
-            unit->mlt_sensor_address = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"HLT_HEATER_MLTFIRST"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->hlt_heater_mltfirst = ival;
+	    xmlFree(key);
+	}
+
+        if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_SENSOR_UUID"))) {
+	    if (unit->mlt_sensor == NULL) {
+		unit->mlt_sensor = (sensor_var *)malloc(sizeof(sensor_var));
+		unit->mlt_sensor->uuid[0] = '\0';
+		unit->mlt_sensor->state = 1;        // missing
+		unit->mlt_sensor->value = 0;
+	    }
+            snprintf(unit->mlt_sensor->uuid, 36, "%s", xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
         }
         if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_SENSOR_STATE"))) {
             key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
             if (sscanf((const char *)key, "%d", &ival) == 1)
-                unit->mlt_sensor_state = ival;
+                unit->mlt_sensor->state = ival;
             xmlFree(key);
         }
         if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_SENSOR_VALUE"))) {
             key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
             if (sscanf((const char *)key, "%d", &ival) == 1)
-                unit->mlt_sensor_value = ival;
+                unit->mlt_sensor->value = ival;
             xmlFree(key);
         }
-        if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_HEATER_ADDRESS"))) {
-            unit->mlt_heater_address = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+
+        if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_HEATER_UUID"))) {
+	    if (unit->mlt_heater == NULL) {
+		unit->mlt_heater = (switch_var *)malloc(sizeof(switch_var));
+		unit->mlt_heater->uuid[0] = '\0';
+		unit->mlt_heater->value = 0;
+		unit->mlt_heater->delay = 1;    // 15 seconds
+	    }
+	    snprintf(unit->mlt_heater->uuid, 36, "%s", xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
         }
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_HEATER_VALUE"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->mlt_heater->value = ival;
+	    xmlFree(key);
+	}
         if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_HEATER_DELAY"))) {
             key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
             if (sscanf((const char *)key, "%d", &ival) == 1)
-                unit->mlt_heater_delay = ival;
+                unit->mlt_heater->delay = ival;
             xmlFree(key);
         }
-        if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_PUMP_ADDRESS"))) {
-            unit->mlt_pump_address = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+
+        if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_PUMP_UUID"))) {
+	    if (unit->mlt_pump == NULL) {
+		unit->mlt_pump = (switch_var *)malloc(sizeof(switch_var));
+		unit->mlt_pump->uuid[0] = '\0';
+		unit->mlt_pump->value = 0;
+		unit->mlt_pump->delay = 1;    // 15 seconds
+	    }
+	    snprintf(unit->mlt_pump->uuid, 36, "%s", xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
         }
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_PUMP_VALUE"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->mlt_pump->value = ival;
+	    xmlFree(key);
+	}
         if ((!xmlStrcmp(cur->name, (const xmlChar *)"MLT_PUMP_DELAY"))) {
             key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
             if (sscanf((const char *)key, "%d", &ival) == 1)
-                unit->mlt_pump_delay = ival;
+                unit->mlt_pump->delay = ival;
             xmlFree(key);
         }
 
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUMP_CYCLE"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->pump_cycle = ival;
+	    xmlFree(key);
+	}
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUMP_REST"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->pump_rest = ival;
+	    xmlFree(key);
+	}
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUMP_PREMASH"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->pump_premash = ival;
+	    xmlFree(key);
+	}
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUMP_ONMASH"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->pump_onmash = ival;
+	    xmlFree(key);
+	}
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUMP_MASHOUT "))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->pump_mashout = ival;
+	    xmlFree(key);
+	}
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUMP_ONBOIL"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->pump_onboil = ival;
+	    xmlFree(key);
+	}
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"PUMP_STOP"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->pump_stop = ival;
+	    xmlFree(key);
+	}
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"SKIP_ADD"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+	    	unit->skip_add = ival;
+	    xmlFree(key);
+	}
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"SKIP_REMOVE"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->skip_remove = ival;
+	    xmlFree(key);
+	}
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"SKIP_IODINE"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->skip_iodine = ival;
+	    xmlFree(key);
+	}
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"IODINE_TIME"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    if (sscanf((const char *)key, "%d", &ival) == 1)
+		unit->iodine_time = ival;
+	    xmlFree(key);
+	}
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"WHIRLPOOL"))) {
+	    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	    for (i = 0; i < 2; i++) {
+		if (! xmlStrcmp(key, (const xmlChar *)WHIRLPOOL_TYPE[i])) {
+		    unit->whirlpool = i;
+		    break;
+		}
+	    }
+	    xmlFree(key);
+	}
+
         if ((!xmlStrcmp(cur->name, (const xmlChar *)"PID_HLT_IMAX"))) {
             key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
             if (sscanf((const char *)key, "%f", &val) == 1)
@@ -1327,11 +1517,14 @@
 	    Config.tempFormat = key[0];
 	    xmlFree(key);
 	}
-	if ((!xmlStrcmp(cur->name, (const xmlChar *)"TEMP_ADDRESS"))) {
-	    Config.temp_address = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
-	}
-	if ((!xmlStrcmp(cur->name, (const xmlChar *)"HUM_ADDRESS"))) {
-	    Config.hum_address = (char *)xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+	if ((!xmlStrcmp(cur->name, (const xmlChar *)"ROOMTEMP_UUID"))) {
+	    if (Config.roomtemp == NULL) {
+		Config.roomtemp = (sensor_var *)malloc(sizeof(sensor_var));
+		Config.roomtemp->uuid[0] = '\0';
+		Config.roomtemp->state = 1;        // missing
+		Config.roomtemp->value = 0;
+	    }
+	    snprintf(Config.roomtemp->uuid, 36, "%s", xmlNodeListGetString(doc, cur->xmlChildrenNode, 1));
 	}
 	if ((!xmlStrcmp(cur->name, (const xmlChar *)"LCDS"))) {
 	    parseLCDs(doc, cur);

mercurial