diff -r 584d40bb4b09 -r daa435544ab1 thermferm/server.c --- a/thermferm/server.c Thu Aug 20 14:32:56 2015 +0200 +++ b/thermferm/server.c Thu Aug 20 15:58:32 2015 +0200 @@ -476,7 +476,7 @@ name = xstrcat(name, param); if ((fp = fopen(name, "r"))) { - char buffer[256], outbuf[256], q[5]; + 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 *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; @@ -520,10 +520,11 @@ * not used ---------------------------------------------------+ | * room_n ----------------------------------------------------------+ */ - q[0] = buffer[11]; - q[1] = buffer[12]; + hr[0] = q[0] = buffer[11]; + hr[1] = q[1] = buffer[12]; q[2] = buffer[14]; 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 */ @@ -543,11 +544,15 @@ /* * Output a line at the right intervals */ + int hour = atoi(hr); if (((graphstep == 1)) || ((graphstep == 2) && (q[3] == '0' || q[3] == '5')) || ((graphstep == 3) && ((q[2] == '0' && q[3] == '0') || (q[2] == '1' && q[3] == '5') || (q[2] == '3' && q[3] == '0') || (q[2] == '4' && q[3] == '5'))) || ((graphstep == 4) && ((q[2] == '0' && q[3] == '0') || (q[2] == '3' && q[3] == '0'))) || - ((graphstep == 5) && (q[2] == '0' && q[3] == '0')) ) { + ((graphstep == 5) && (q[2] == '0' && q[3] == '0')) || + ((graphstep == 6) && (hour % 2 == 0) && (q[2] == '0' && q[3] == '0')) || /* 120 minutes */ + ((graphstep == 7) && (hour % 4 == 0) && (q[2] == '0' && q[3] == '0')) || /* 240 minutes */ + ((graphstep >= 8) && (hour % 8 == 0) && (q[2] == '0' && q[3] == '0')) ) { /* 480 minutes */ heat_used = cool_used = 0; if (heater_u && strcmp(heater_u, "NA") && (sscanf(heater_u, "%d", &h) == 1)) { if (h && heater_l) { @@ -1098,7 +1103,7 @@ */ int cmd_list(char *buf) { - char *opt, *param, *filename, q[5], buffer[256], outbuf[256]; + 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 *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; @@ -1172,16 +1177,19 @@ break; } } + if (graphstep > MAX_INTERVALS) + graphstep = MAX_INTERVALS; syslog(LOG_NOTICE, "LIST LOG %s: lines=%d, interval=%d, graphstep=%d", unit->name, lines, GRAPH_INTERVAL[graphstep], graphstep); 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 */ - q[0] = buffer[11]; - q[1] = buffer[12]; + hr[0] = q[0] = buffer[11]; + hr[1] = q[1] = buffer[12]; q[2] = buffer[14]; 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 */ @@ -1201,11 +1209,15 @@ /* * Output a line at the right intervals */ + int hour = atoi(hr); if (((graphstep == 1)) || ((graphstep == 2) && (q[3] == '0' || q[3] == '5')) || ((graphstep == 3) && ((q[2] == '0' && q[3] == '0') || (q[2] == '1' && q[3] == '5') || (q[2] == '3' && q[3] == '0') || (q[2] == '4' && q[3] == '5'))) || ((graphstep == 4) && ((q[2] == '0' && q[3] == '0') || (q[2] == '3' && q[3] == '0'))) || - ((graphstep == 5) && (q[2] == '0' && q[3] == '0')) ) { + ((graphstep == 5) && (q[2] == '0' && q[3] == '0')) || + ((graphstep == 6) && (hour % 2 == 0) && (q[2] == '0' && q[3] == '0')) || /* 120 minutes */ + ((graphstep == 7) && (hour % 4 == 0) && (q[2] == '0' && q[3] == '0')) || /* 240 minutes */ + ((graphstep >= 8) && (hour % 8 == 0) && (q[2] == '0' && q[3] == '0')) ) { /* 480 minutes */ heat_used = cool_used = 0; if (strcmp(heater_u, "NA") && (sscanf(heater_u, "%d", &h) == 1)) { if (h && heater_l) {