diff -r b88c60e8369e -r d1c52fb43e30 thermferm/server.c --- a/thermferm/server.c Tue Nov 11 16:19:07 2014 +0100 +++ b/thermferm/server.c Sat Nov 15 20:35:32 2014 +0100 @@ -631,8 +631,10 @@ */ int cmd_list(char *buf) { - char *opt, *param, *filename, q[5], buffer[256], *copy = NULL; - char *mode_o = NULL, *mode_n, *heater_o = NULL, *heater_n, *cooler_o = NULL, *cooler_n; + char *opt, *param, *filename, q[5], buffer[256], outbuf[256]; + char *date_n, *mode_n, *air_n, *beer_n, *target_n, *heater_n, *cooler_n; + char *heater_u, *cooler_u; + int heater_l = 0, cooler_l = 0, h = 0, c = 0, heat_used = 0, cool_used = 0; units_list *unit; FILE *fp; @@ -675,54 +677,55 @@ filename = xstrcat(filename, (char *)".log"); if ((fp = fopen(filename, "r"))) { 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 + */ buffer[strlen(buffer) -1] = '\0'; - copy = xstrcpy(buffer); - mode_n = strtok(buffer, ",\0"); - mode_n = strtok(NULL, ",\0"); - heater_n = strtok(NULL, ",\0"); /* skip air_temp */ - heater_n = strtok(NULL, ",\0"); /* skip beer temp */ - heater_n = strtok(NULL, ",\0"); /* skip target temp */ - heater_n = strtok(NULL, ",\0"); - cooler_n = strtok(NULL, ",\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 */ if (strncmp(mode_n, (char *)"Mode", 4)) { /* - * Output a line each 10 minutes or if something changes. + * Output a line each 30 minutes. */ if ((q[0] != buffer[11]) || (q[1] != buffer[12]) || (q[3] != buffer[14])) { q[0] = buffer[11]; q[1] = buffer[12]; q[2] = buffer[13]; q[3] = buffer[14]; - if ((q[3] == '0') || (q[3] == '3')) - srv_send(copy); - } else if ((mode_o && strcmp(mode_o, mode_n)) || - (heater_o && strcmp(heater_o, heater_n)) || (cooler_o && strcmp(cooler_o, cooler_n))) { - srv_send(copy); + if ((q[3] == '0') || (q[3] == '3')) { + heat_used = cool_used = 0; + if (strcmp(heater_u, "NA") && (sscanf(heater_u, "%d", &h) == 1)) { + if (h && heater_l) { + heat_used = ((h - heater_l) * 100) / 1800; + } + } + if (strcmp(cooler_u, "NA") && (sscanf(cooler_u, "%d", &c) == 1)) { + if (c && cooler_l) { + cool_used = ((c - cooler_l) * 100) / 1800; + } + } + snprintf(outbuf, 255, "%s,%s,%s,%s,%s,%s,%s,%d,%d", + date_n, mode_n, air_n, beer_n, target_n, heater_n, cooler_n, heat_used, cool_used); + srv_send(outbuf); + if (h && strcmp(heater_u, "NA")) + heater_l = h; + if (c & strcmp(cooler_u, "NA")) + cooler_l = c; + } } } - free(copy); - copy = NULL; - if (mode_o) - free(mode_o); - mode_o = xstrcpy(mode_n); - if (heater_o) - free(heater_o); - heater_o = xstrcpy(heater_n); - if (cooler_o) - free(cooler_o); - cooler_o = xstrcpy(cooler_n); } } - if (mode_o) - free(mode_o); - mode_o = NULL; - if (heater_o) - free(heater_o); - heater_o = NULL; - if (cooler_o) - free(cooler_o); - cooler_o = NULL; free(filename); filename = NULL; srv_send((char *)".");