thermferm/server.c

changeset 506
cdcd07bbee30
parent 504
862de87f9f89
child 510
2da3d3340403
--- a/thermferm/server.c	Sat Apr 29 17:07:36 2017 +0200
+++ b/thermferm/server.c	Mon May 08 16:26:02 2017 +0200
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * Copyright (C) 2008-2015
+ * Copyright (C) 2008-2017
  *   
  * Michiel Broek <mbroek at mbse dot eu>
  *
@@ -2166,6 +2166,7 @@
 	for (unit = Config.units ; unit; unit = unit->next) {
 	     if (strcmp(unit->uuid, param) == 0) {
 		while (1) {
+		    unit->mqtt_flag = 0;
 		    rlen = srv_recv(ibuf);
 		    if (rlen == -1) {
 			run_pause = FALSE;
@@ -2180,6 +2181,7 @@
 			kwd = strtok(ibuf, ",\0");
 			val = strtok(NULL, "\0");
 			if (kwd) {
+			    unit->mqtt_flag = 0;
 			    /*
 			     * Accept writable data. The client can sent just one line,
 			     * but may also sent everything. Simply ignore things we
@@ -2189,11 +2191,11 @@
 				if (unit->name) {
 				    if (strcmp(unit->name, val)) {
 					syslog(LOG_NOTICE, "Fermenter unit %s name `%s' to `%s'", unit->uuid, unit->name, val);
-					mqtt_publish_str(unit->alias, (char *)"name", val);
 				    }
 				    free(unit->name);
 				}
 				unit->name = xstrcpy(val);
+				unit->mqtt_flag |= (MQTT_FLAG_MODE);
 
 			    } else if (val && (strcmp(kwd, (char *)"VOLUME") == 0)) {
 				if (sscanf(val, "%f", &fval) == 1) {
@@ -2214,6 +2216,7 @@
 				    device_count(TRUE, unit->air_address);
 				} else
 				    unit->air_address  = NULL;
+				unit->mqtt_flag |= MQTT_FLAG_AIR;
 
 			    } else if (strcmp(kwd, (char *)"BEER_ADDRESS") == 0) {
 				if (val && unit->beer_address && (strcmp(val, unit->beer_address)))
@@ -2227,6 +2230,7 @@
 				    device_count(TRUE, unit->beer_address);
 				} else
 				    unit->beer_address = NULL;
+				unit->mqtt_flag |= MQTT_FLAG_BEER;
 
 			    } else if (strcmp(kwd, (char *)"HEATER_ADDRESS") == 0) {
 				if (val && unit->heater_address && (strcmp(val, unit->heater_address)))
@@ -2240,12 +2244,14 @@
 				    device_count(TRUE, unit->heater_address);
 				} else
 				    unit->heater_address = NULL;
+				unit->mqtt_flag |= MQTT_FLAG_HEATER;
 
 			    } else if (val && (strcmp(kwd, (char *)"HEATER_STATE") == 0)) {
 				if ((sscanf(val, "%d", &ival) == 1) && ((ival == 0) || (ival == 100))) {
 				    if (unit->heater_state != ival)
 					syslog(LOG_NOTICE, "Fermenter unit %s heater state %d to %d", unit->uuid, unit->heater_state, ival);
 				    unit->heater_state = ival;
+				    unit->mqtt_flag |= MQTT_FLAG_HEATER;
 				}
 
 			    } else if (val && (strcmp(kwd, (char *)"HEATER_DELAY") == 0)) {
@@ -2267,12 +2273,14 @@
 				    device_count(TRUE, unit->cooler_address);
 				} else
 				    unit->cooler_address = NULL;
+				unit->mqtt_flag |= MQTT_FLAG_COOLER;
 
 			    } else if (val && (strcmp(kwd, (char *)"COOLER_STATE") == 0)) {
 				if ((sscanf(val, "%d", &ival) == 1) && ((ival == 0) || (ival == 100))) {
 				    if (unit->cooler_state != ival)
 					syslog(LOG_NOTICE, "Fermenter unit %s cooler state %d to %d", unit->uuid, unit->cooler_state, ival);
 				    unit->cooler_state = ival;
+				    unit->mqtt_flag |= MQTT_FLAG_COOLER;
 				}
 
 			    } else if (val && (strcmp(kwd, (char *)"COOLER_DELAY") == 0)) {
@@ -2294,12 +2302,14 @@
 				    device_count(TRUE, unit->fan_address);
 				} else
 				    unit->fan_address = NULL;
+				unit->mqtt_flag |= MQTT_FLAG_FAN;
 			   
 			    } else if (val && (strcmp(kwd, (char *)"FAN_STATE") == 0)) {
 				if ((sscanf(val, "%d", &ival) == 1) && ((ival == 0) || (ival == 100))) {
 				    if (unit->fan_state != ival)
 					syslog(LOG_NOTICE, "Fermenter unit %s fan state %d to %d", unit->uuid, unit->fan_state, ival);    
 				    unit->fan_state = ival;
+				    unit->mqtt_flag |= MQTT_FLAG_FAN;
 				}
 			    
 			    } else if (val && (strcmp(kwd, (char *)"FAN_DELAY") == 0)) {
@@ -2321,12 +2331,14 @@
 				    device_count(TRUE, unit->light_address);
 				} else
 				    unit->light_address = NULL;
+				unit->mqtt_flag |= MQTT_FLAG_LIGHT;
 
 			    } else if (val && (strcmp(kwd, (char *)"LIGHT_STATE") == 0)) {
 				if ((sscanf(val, "%d", &ival) == 1) && ((ival == 0) || (ival == 100))) {
 				    if (unit->light_state != ival)
 					syslog(LOG_NOTICE, "Fermenter unit %s light state %d to %d", unit->uuid, unit->light_state, ival);
 				    unit->light_state = ival;
+				    unit->mqtt_flag |= MQTT_FLAG_LIGHT;
 				}
 
 			    } else if (val && (strcmp(kwd, (char *)"LIGHT_DELAY") == 0)) {
@@ -2361,6 +2373,7 @@
 				    device_count(TRUE, unit->psu_address);
 				} else
 				    unit->psu_address = NULL;
+				unit->mqtt_flag |= MQTT_FLAG_PSU;
 
 			    } else if (val && (strcmp(kwd, (char *)"MODE") == 0)) {
 				for (i = 0; i < 5; i++) {
@@ -2392,18 +2405,6 @@
 						unit->mqtt_flag |= MQTT_FLAG_SP;
 					    }
 					}
-					if (unit->heater_address)
-					    mqtt_publish_int(unit->alias, (char *)"heater", 0);
-					else
-					    mqtt_publish_clear(unit->alias, (char *)"heater");
-					if (unit->cooler_address)
-					    mqtt_publish_int(unit->alias, (char *)"cooler", 0);
-					else
-					    mqtt_publish_clear(unit->alias, (char *)"cooler");
-					if (unit->fan_address)
-					    mqtt_publish_int(unit->alias, (char *)"fan", 0);
-					else
-					    mqtt_publish_clear(unit->alias, (char *)"fan");
 					break;
 				    }
 				}
@@ -2519,19 +2520,7 @@
 				    device_out(unit->cooler_address, unit->cooler_state);
 				    device_out(unit->fan_address, unit->fan_state);
 				    device_out(unit->light_address, unit->light_state);
-				    if (unit->heater_address)
-					mqtt_publish_int(unit->alias, (char *)"heater", 0);
-				    else
-					mqtt_publish_clear(unit->alias, (char *)"heater");
-				    if (unit->cooler_address)
-					mqtt_publish_int(unit->alias, (char *)"cooler", 0);
-				    else
-					mqtt_publish_clear(unit->alias, (char *)"cooler");
-				    if (unit->fan_address)
-					mqtt_publish_int(unit->alias, (char *)"fan", 0);
-				    else
-					mqtt_publish_clear(unit->alias, (char *)"fan");
-				    unit->mqtt_flag |= (MQTT_FLAG_PROFILE | MQTT_FLAG_SP);
+				    unit->mqtt_flag |= (MQTT_FLAG_PROFILE | MQTT_FLAG_SP | MQTT_FLAG_HEATER | MQTT_FLAG_COOLER | MQTT_FLAG_FAN);
 				}
 
 			    } else if (val && (strcmp(kwd, (char *)"PROF_STATE") == 0)) {
@@ -2541,17 +2530,14 @@
 						case PROFILE_OFF:	if (unit->prof_state == PROFILE_DONE) {
 									    unit->prof_state = PROFILE_OFF;
 									    syslog(LOG_NOTICE, "Fermenter unit %s profile to OFF", unit->uuid);
-									    mqtt_publish_str(unit->alias, (char *)"profile/state", (char *)PROFSTATE[i]);
 									}
 									break;
 						case PROFILE_PAUSE:	if (unit->prof_state == PROFILE_RUN) {
 									    unit->prof_state = PROFILE_PAUSE;
 									    syslog(LOG_NOTICE, "Fermenter unit %s profile PAUSE", unit->uuid);
-									    mqtt_publish_str(unit->alias, (char *)"profile/state", (char *)PROFSTATE[i]);
 									} else if (unit->prof_state == PROFILE_PAUSE) {
 									    unit->prof_state = PROFILE_RUN;
 									    syslog(LOG_NOTICE, "Fermenter unit %s profile RESUME", unit->uuid);
-									    mqtt_publish_str(unit->alias, (char *)"profile/state", (char *)PROFSTATE[PROFILE_RUN]);
 									}
 									break;
 						case PROFILE_RUN:	if (unit->prof_state == PROFILE_OFF) {
@@ -2560,7 +2546,6 @@
 									    unit->prof_paused = unit->prof_primary_done = 0;
 									    unit->prof_peak_abs = unit->prof_peak_rel = 0.0;
 									    syslog(LOG_NOTICE, "Fermenter unit %s profile to RUN", unit->uuid);
-									    mqtt_publish_str(unit->alias, (char *)"profile/state", (char *)PROFSTATE[i]);
 									}
 									break;
 						case PROFILE_DONE:	break;	/* Command is illegal */
@@ -2568,7 +2553,6 @@
 									    unit->prof_state = PROFILE_OFF;
 									    unit->prof_started = 0;
 									    syslog(LOG_NOTICE, "Fermenter unit %s profile ABORT", unit->uuid);
-									    mqtt_publish_str(unit->alias, (char *)"profile/state", (char *)PROFSTATE[i]);
 									}
 									break;
 					}
@@ -2592,6 +2576,8 @@
 				}
 
 			    }
+			    if (unit->mqtt_flag)
+				publishDData(unit);
 			}
 		    }
 		}

mercurial