thermferm/server.c

changeset 397
00ca08f5a6f8
parent 390
daa435544ab1
child 398
efdfef1677d1
--- a/thermferm/server.c	Tue Sep 15 17:29:15 2015 +0200
+++ b/thermferm/server.c	Wed Sep 16 22:05:05 2015 +0200
@@ -477,7 +477,7 @@
 
 	if ((fp = fopen(name, "r"))) {
 	    char        buffer[256], outbuf[256], q[5], hr[3];
-	    char	*date_n, *mode_n, *air_n, *beer_n, *target_n, *heater_n, *cooler_n, *room_n;
+	    char	*date_n, *mode_n, *air_n, *beer_n, *target_lo_n, *target_hi_n, *heater_n, *cooler_n, *room_n;
 	    char	*heater_u, *cooler_u;
 	    int		lines = 0, heater_l = 0, cooler_l = 0, h = 0, c = 0, heat_used = 0, cool_used = 0, graphstep = 0;
 	    float	room_t = 0.0;
@@ -504,21 +504,22 @@
 
 	    while (fgets(buffer, sizeof(buffer)-1, fp) != NULL) {
 		/*
-		 * 2014-11-15 18:39,BEER,20.312,19.750,20.0,0,NA,NA,NA,78105,NA,NA,18.000
-		 *       |           |     |      |     |   | |  |  |    |   |  |    |
-		 *  date_n           |     |      |     |   | |  |  |    |   |  |    |
-		 *  mode_n ----------+     |      |     |   | |  |  |    |   |  |    |
-		 *  air_n -----------------+      |     |   | |  |  |    |   |  |    |
-		 *  beer_n -----------------------+     |   | |  |  |    |   |  |    |
-		 *  target_n ---------------------------+   | |  |  |    |   |  |    |
-		 *  heater_n -------------------------------+ |  |  |    |   |  |    |
-		 *  cooler_n ---------------------------------+  |  |    |   |  |    |
-		 *  not used ------------------------------------+  |    |   |  |    |
-		 *  not used ---------------------------------------+    |   |  |    |
-		 *  heater_u --------------------------------------------+   |  |    |
-		 *  cooler_u ------------------------------------------------+  |    |
-		 *  not used ---------------------------------------------------+    |
-		 *  room_n ----------------------------------------------------------+
+		 * 2014-11-15 18:39,BEER,20.312,19.750,20.0,0,NA,NA,NA,78105,NA,NA,18.000,20.1
+		 *       |           |     |      |     |   | |  |  |    |   |  |    |     |
+		 *  date_n           |     |      |     |   | |  |  |    |   |  |    |     |
+		 *  mode_n ----------+     |      |     |   | |  |  |    |   |  |    |     |
+		 *  air_n -----------------+      |     |   | |  |  |    |   |  |    |     |
+		 *  beer_n -----------------------+     |   | |  |  |    |   |  |    |     |
+		 *  target_lo_n ------------------------+   | |  |  |    |   |  |    |     |
+		 *  heater_n -------------------------------+ |  |  |    |   |  |    |     |
+		 *  cooler_n ---------------------------------+  |  |    |   |  |    |     |
+		 *  not used ------------------------------------+  |    |   |  |    |     |
+		 *  not used ---------------------------------------+    |   |  |    |     |
+		 *  heater_u --------------------------------------------+   |  |    |     |
+		 *  cooler_u ------------------------------------------------+  |    |     |
+		 *  not used ---------------------------------------------------+    |     |
+		 *  room_n ----------------------------------------------------------+     |
+		 *  target_hi_n -----------------------------------------------------------+
 		 */
 		hr[0] = q[0] = buffer[11];
 		hr[1] = q[1] = buffer[12];
@@ -526,19 +527,20 @@
 		q[3] = buffer[15];
 		hr[2] = '\0';
 		buffer[strlen(buffer) -1] = '\0';
-		date_n = strtok(buffer, ",\0"); /* timestamp            */
-		mode_n = strtok(NULL, ",\0");   /* unit mode            */
-		air_n = strtok(NULL, ",\0");    /* air temp             */
-		beer_n = strtok(NULL, ",\0");   /* beer temp            */
-		target_n = strtok(NULL, ",\0"); /* target temp          */
-		heater_n = strtok(NULL, ",\0"); /* current heater state */
-		cooler_n = strtok(NULL, ",\0"); /* current cooler state */
-		heater_u = strtok(NULL, ",\0"); /* current fan state    */
-		heater_u = strtok(NULL, ",\0"); /* current door state   */
-		heater_u = strtok(NULL, ",\0"); /* heater use counter   */
-		cooler_u = strtok(NULL, ",\0"); /* cooler use counter   */
-		room_n = strtok(NULL, ",\0");	/* fan use counter	*/
-		room_n = strtok(NULL, ",\0");	/* room temperature	*/
+		date_n = strtok(buffer, ",\0"); 	/* timestamp            */
+		mode_n = strtok(NULL, ",\0");   	/* unit mode            */
+		air_n = strtok(NULL, ",\0");    	/* air temp             */
+		beer_n = strtok(NULL, ",\0");   	/* beer temp            */
+		target_lo_n = strtok(NULL, ",\0");	/* target low temp	*/
+		heater_n = strtok(NULL, ",\0"); 	/* current heater state */
+		cooler_n = strtok(NULL, ",\0"); 	/* current cooler state */
+		heater_u = strtok(NULL, ",\0"); 	/* current fan state    */
+		heater_u = strtok(NULL, ",\0"); 	/* current door state   */
+		heater_u = strtok(NULL, ",\0"); 	/* heater use counter   */
+		cooler_u = strtok(NULL, ",\0"); 	/* cooler use counter   */
+		room_n = strtok(NULL, ",\0");		/* fan use counter	*/
+		room_n = strtok(NULL, ",\0");		/* room temperature	*/
+		target_hi_n = strtok(NULL, ",\0");	/* target high temp	*/
 
 		if (strncmp(mode_n, (char *)"Mode", 4)) {
 		    /*
@@ -566,8 +568,10 @@
 			}
 			if (room_n)
 			    sscanf(room_n, "%f", &room_t);
-			snprintf(outbuf, 255, "%s,%s,%s,%s,%s,%s,%s,%d,%d,%.1f", 
-				date_n, mode_n, air_n, beer_n, target_n, heater_n, cooler_n, heat_used, cool_used, room_t);
+			if (target_hi_n == NULL)
+			    target_hi_n = target_lo_n;
+			snprintf(outbuf, 255, "%s,%s,%s,%s,%s,%s,%s,%d,%d,%.1f,%s", 
+				date_n, mode_n, air_n, beer_n, target_lo_n, heater_n, cooler_n, heat_used, cool_used, room_t,target_hi_n);
 			srv_send(outbuf);
 			if (heater_u && h && strcmp(heater_u, "NA"))
 			    heater_l = h;
@@ -1104,7 +1108,7 @@
 int cmd_list(char *buf)
 {
     char		*opt, *param, *filename, q[5], hr[3], buffer[256], outbuf[256];
-    char		*date_n, *mode_n, *air_n, *beer_n, *target_n, *heater_n, *cooler_n, *room_n;
+    char		*date_n, *mode_n, *air_n, *beer_n, *target_lo_n, *target_hi_n, *heater_n, *cooler_n, *room_n;
     char		*heater_u, *cooler_u;
     int			heater_l = 0, cooler_l = 0, h = 0, c = 0, heat_used = 0, cool_used = 0, lines = 0, graphstep = 0;
     units_list		*unit;
@@ -1191,19 +1195,20 @@
 		q[3] = buffer[15];
 		hr[2] = '\0';
 		buffer[strlen(buffer) -1] = '\0';
-		date_n = strtok(buffer, ",\0");	/* timestamp		*/
-		mode_n = strtok(NULL, ",\0");	/* unit mode		*/
-		air_n = strtok(NULL, ",\0");	/* air temp		*/
-		beer_n = strtok(NULL, ",\0");	/* beer temp		*/
-		target_n = strtok(NULL, ",\0"); /* target temp		*/
-		heater_n = strtok(NULL, ",\0");	/* current heater state	*/
-		cooler_n = strtok(NULL, ",\0");	/* current cooler state	*/
-		heater_u = strtok(NULL, ",\0");	/* current fan state	*/
-		heater_u = strtok(NULL, ",\0");	/* current door state	*/
-		heater_u = strtok(NULL, ",\0");	/* heater use counter	*/
-		cooler_u = strtok(NULL, ",\0");	/* cooler use counter	*/
-		room_n = strtok(NULL, ",\0");	/* fan use counter	*/
-		room_n = strtok(NULL, ",\0");	/* room temperature	*/
+		date_n = strtok(buffer, ",\0");		/* timestamp		*/
+		mode_n = strtok(NULL, ",\0");		/* unit mode		*/
+		air_n = strtok(NULL, ",\0");		/* air temp		*/
+		beer_n = strtok(NULL, ",\0");		/* beer temp		*/
+		target_lo_n = strtok(NULL, ",\0");	/* target low temp	*/
+		heater_n = strtok(NULL, ",\0");		/* current heater state	*/
+		cooler_n = strtok(NULL, ",\0");		/* current cooler state	*/
+		heater_u = strtok(NULL, ",\0");		/* current fan state	*/
+		heater_u = strtok(NULL, ",\0");		/* current door state	*/
+		heater_u = strtok(NULL, ",\0");		/* heater use counter	*/
+		cooler_u = strtok(NULL, ",\0");		/* cooler use counter	*/
+		room_n = strtok(NULL, ",\0");		/* fan use counter	*/
+		room_n = strtok(NULL, ",\0");		/* room temperature	*/
+		target_hi_n = strtok(NULL, ",\0");	/* target high temp	*/
 
 		if (strncmp(mode_n, (char *)"Mode", 4)) {
 		    /*
@@ -1233,8 +1238,10 @@
 			    sscanf(room_n, "%f", &room_t);
 			else
 			    room_t = 0.0;
-			snprintf(outbuf, 255, "%s,%s,%s,%s,%s,%s,%s,%d,%d,%.1f", 
-					    date_n, mode_n, air_n, beer_n, target_n, heater_n, cooler_n, heat_used, cool_used, room_t);
+			if (target_hi_n == NULL)
+			    target_hi_n = target_lo_n;
+			snprintf(outbuf, 255, "%s,%s,%s,%s,%s,%s,%s,%d,%d,%.1f,%s", 
+					    date_n, mode_n, air_n, beer_n, target_lo_n, heater_n, cooler_n, heat_used, cool_used, room_t, target_hi_n);
 		    	srv_send(outbuf);
 			if (h && strcmp(heater_u, "NA"))
 			    heater_l = h;
@@ -1267,9 +1274,9 @@
  */
 int cmd_profile(char *buf)
 {
-    char                ibuf[SS_BUFSIZE], *sstep, *rest, *targ, *param, *kwd, *val;
-    int                 j, rlen, istep, irest;
-    float		ftarg, fval;
+    char                ibuf[SS_BUFSIZE], *sstep, *rest, *tlarg, *tharg, *frarg, *param, *kwd, *val;
+    int                 j, ival, rlen, istep, irest, ifrarg;
+    float		ftlarg, ftharg, fval;
     char		*opt;
     profiles_list	*profile, *tmpp;
     prof_step		*step, *olds;
@@ -1327,8 +1334,9 @@
 	uuid_generate(uu);
 	uuid_unparse(uu, profile->uuid);
 	profile->name = xstrcpy(param);
-	profile->busy = 0;
-	profile->inittemp = 20.0;
+	profile->busy = profile->fridge_mode = 0;
+	profile->inittemp_lo = 19.8;
+	profile->inittemp_hi = 20.2;
 	profile->steps = NULL;
 	if (Config.profiles == NULL) {
 	    Config.profiles = profile;
@@ -1362,7 +1370,9 @@
 		srv_send((char *)"213 Profile record follows:");
 		srv_send((char *)"UUID,%s", profile->uuid);
 		srv_send((char *)"NAME,%s", profile->name);
-		srv_send((char *)"INITTEMP,%.1f", profile->inittemp);
+		srv_send((char *)"INITTEMP_LO,%.1f", profile->inittemp_lo);
+		srv_send((char *)"INITTEMP_HI,%.1f", profile->inittemp_hi);
+		srv_send((char *)"FRIDGE_MODE,%d", profile->fridge_mode);
 		srv_send((char *)".");
 		return 0;
 	    }
@@ -1393,11 +1403,23 @@
 				    free(profile->name);
 				}
 				profile->name = xstrcpy(val);
-			    } else if (strcmp(kwd, (char *)"INITTEMP") == 0) {
+			    } else if (strcmp(kwd, (char *)"INITTEMP_LO") == 0) {
+				if (sscanf(val, "%f", &fval) == 1) {
+				    if (profile->inittemp_lo != fval)
+					syslog(LOG_NOTICE, "Profile %s initial temperature low %.1f to %.1f", profile->uuid, profile->inittemp_lo, fval);
+				    profile->inittemp_lo = fval;
+				}
+			    } else if (strcmp(kwd, (char *)"INITTEMP_HI") == 0) {
 				if (sscanf(val, "%f", &fval) == 1) {
-				    if (profile->inittemp != fval)
-					syslog(LOG_NOTICE, "Profile %s initial temperature %.1f to %.1f", profile->uuid, profile->inittemp, fval);
-				    profile->inittemp = fval;
+				    if (profile->inittemp_hi != fval)
+					syslog(LOG_NOTICE, "Profile %s initial temperature high %.1f to %.1f", profile->uuid, profile->inittemp_hi, fval);
+				    profile->inittemp_hi = fval;
+				}
+			    } else if (strcmp(kwd, (char *)"FRIDGE_MODE") == 0) {
+				if (sscanf(val, "%d", &ival) == 1) {
+				    if (profile->fridge_mode != ival)
+					syslog(LOG_NOTICE, "Profile %s fridge mode %d to %d", profile->uuid, profile->fridge_mode, ival);
+				    profile->fridge_mode = ival;
 				}
 			    }
 			}
@@ -1414,7 +1436,7 @@
 	    if (strcmp(profile->uuid, param) == 0) {
 		srv_send((char *)"215 Profile steps follow:");
 		for (step = profile->steps; step; step = step->next) {
-		    srv_send((char *)"%d,%d,%.1f", step->steptime, step->resttime, step->target);
+		    srv_send((char *)"%d,%d,%.1f,%.1f,%d", step->steptime, step->resttime, step->target_lo, step->target_hi, step->fridge_mode);
 		}
 		srv_send((char *)".");
 		return 0;
@@ -1452,21 +1474,27 @@
 		    	    }
 			    sstep = strtok(ibuf, ",\0");
 			    rest = strtok(NULL, ",\0");
-			    targ = strtok(NULL, "\0");
+			    tlarg = strtok(NULL, ",\0");
+			    tharg = strtok(NULL, ",\0");
+			    frarg = strtok(NULL, "\0");
 
 			    if ((sscanf(sstep, "%d", &istep) == 1) &&
 				(sscanf(rest, "%d", &irest) == 1) &&
-				(sscanf(targ, "%f", &ftarg) == 1)) {
+				(sscanf(tlarg, "%f", &ftlarg) == 1) && 
+				(sscanf(tharg, "%f", &ftharg) == 1) &&
+				(sscanf(frarg, "%d", &ifrarg) == 1)) {
 
 				j++;
-				syslog(LOG_NOTICE, "PROFILE PUTS %s add step %d: steptime=%d resttime=%d target=%.1f", 
-						profile->uuid, j, istep, irest, ftarg);
+				syslog(LOG_NOTICE, "PROFILE PUTS %s add step %d: steptime=%d resttime=%d target=%.1f..%.1f fridge_mode=%d", 
+						profile->uuid, j, istep, irest, ftlarg, ftharg, ifrarg);
 				step = (prof_step *)malloc(sizeof(prof_step));
 				step->next = NULL;
 				step->version = 1;
 				step->steptime = istep;
 				step->resttime = irest;
-				step->target = ftarg;
+				step->target_lo = ftlarg;
+				step->target_hi = ftharg;
+				step->fridge_mode = ifrarg;
 
 				if (profile->steps == NULL) {
 				    profile->steps = step;
@@ -2102,7 +2130,9 @@
 		} else {
 		    srv_send((char *)"PROF_STATE,%s", PROFSTATE[unit->prof_state]);
 		}
-		srv_send((char *)"PROF_TARGET,%.3f", unit->prof_target);
+		srv_send((char *)"PROF_TARGET_LO,%.3f", unit->prof_target_lo);
+		srv_send((char *)"PROF_TARGET_HI,%.3f", unit->prof_target_hi);
+		srv_send((char *)"PROF_FRIDGE_MODE,%.3f", unit->prof_fridge_mode);
 		srv_send((char *)"PROF_PEAK_ABS,%.3f", unit->prof_peak_abs);
 		srv_send((char *)"PROF_PEAK_REL,%.3f", unit->prof_peak_rel);
 		srv_send((char *)"PROF_PRIMARY_DONE,%d", (int)unit->prof_primary_done);
@@ -2346,7 +2376,8 @@
 					     * Set a sane default until it will be overruled by the
 					     * main processing loop.
 					     */
-					    unit->prof_target = 20.0;
+					    unit->prof_target_lo = unit->prof_target_hi = 20.0;
+					    unit->prof_fridge_mode = 0;
 					}
 					break;
 				    }

mercurial