diff -r 66d4e137b99d -r 00ca08f5a6f8 thermferm/server.c --- 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; }