# HG changeset patch # User Michiel Broek # Date 1417273654 -3600 # Node ID 4ce46ff3e37d9c4475b2256514b95027c160f6a5 # Parent d1c52fb43e304def06e51cf55d16dc3b4ba0a40e The LIST LOG command now automatic adjusts the number of output lines and resolution by calculating a reasonable interval between 1 and 60 minutes. Bumped to version 0.2.6 diff -r d1c52fb43e30 -r 4ce46ff3e37d configure --- a/configure Sat Nov 15 20:35:32 2014 +0100 +++ b/configure Sat Nov 29 16:07:34 2014 +0100 @@ -2034,7 +2034,7 @@ PACKAGE="mbsePi-apps" -VERSION="0.2.5" +VERSION="0.2.6" COPYRIGHT="Copyright (C) 2014 Michiel Broek, All Rights Reserved" CYEARS="2014" diff -r d1c52fb43e30 -r 4ce46ff3e37d configure.ac --- a/configure.ac Sat Nov 15 20:35:32 2014 +0100 +++ b/configure.ac Sat Nov 29 16:07:34 2014 +0100 @@ -8,7 +8,7 @@ dnl General settings dnl After changeing the version number, run autoconf! PACKAGE="mbsePi-apps" -VERSION="0.2.5" +VERSION="0.2.6" COPYRIGHT="Copyright (C) 2014 Michiel Broek, All Rights Reserved" CYEARS="2014" AC_SUBST(PACKAGE) diff -r d1c52fb43e30 -r 4ce46ff3e37d thermferm/server.c --- a/thermferm/server.c Sat Nov 15 20:35:32 2014 +0100 +++ b/thermferm/server.c Sat Nov 29 16:07:34 2014 +0100 @@ -53,7 +53,9 @@ #define SS_BUFSIZE 1024 #define SS_TIMEOUT 300 - +#define MAX_INTERVALS 6 +const int GRAPH_INTERVAL[MAX_INTERVALS] = { 0, 1, 5, 15, 30, 60, }; +const int GRAPH_DATALINES[MAX_INTERVALS] = { 0, 800, 3200, 12000, 24000, 48000, }; /* * Send message to client @@ -634,7 +636,7 @@ 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; + int heater_l = 0, cooler_l = 0, h = 0, c = 0, heat_used = 0, cool_used = 0, lines = 0, graphstep = 0; units_list *unit; FILE *fp; @@ -676,10 +678,36 @@ filename = xstrcat(filename, unit->name); filename = xstrcat(filename, (char *)".log"); if ((fp = fopen(filename, "r"))) { + + /* + * Count the lines in the logfile + */ + lines = 0; + while (fgets(buffer, sizeof(buffer)-1, fp) != NULL) { + lines++; + } + fseek(fp, 0L, SEEK_SET); + /* + * We have counted the lines in the logfile including the header lines. + * The header lines should be ignored but there are so few of them, we + * just include them in the total. + * Now find a reasonable interval of lines to sent to the client. + */ + for (graphstep = 1; graphstep <= MAX_INTERVALS; graphstep++) { + if (lines < GRAPH_DATALINES[graphstep]) { + break; + } + } + 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]; + q[2] = buffer[14]; + q[3] = buffer[15]; buffer[strlen(buffer) -1] = '\0'; date_n = strtok(buffer, ",\0"); /* timestamp */ mode_n = strtok(NULL, ",\0"); /* unit mode */ @@ -695,33 +723,31 @@ if (strncmp(mode_n, (char *)"Mode", 4)) { /* - * Output a line each 30 minutes. + * Output a line at the right intervals */ - 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')) { - 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 (((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')) ) { + 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) / (GRAPH_INTERVAL[graphstep] * 60); } - if (strcmp(cooler_u, "NA") && (sscanf(cooler_u, "%d", &c) == 1)) { - if (c && cooler_l) { - cool_used = ((c - cooler_l) * 100) / 1800; - } + } + if (strcmp(cooler_u, "NA") && (sscanf(cooler_u, "%d", &c) == 1)) { + if (c && cooler_l) { + cool_used = ((c - cooler_l) * 100) / (GRAPH_INTERVAL[graphstep] * 60); } - snprintf(outbuf, 255, "%s,%s,%s,%s,%s,%s,%s,%d,%d", + } + 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; - } + srv_send(outbuf); + if (h && strcmp(heater_u, "NA")) + heater_l = h; + if (c & strcmp(cooler_u, "NA")) + cooler_l = c; } } } diff -r d1c52fb43e30 -r 4ce46ff3e37d www-thermferm/liveview.php --- a/www-thermferm/liveview.php Sat Nov 15 20:35:32 2014 +0100 +++ b/www-thermferm/liveview.php Sat Nov 29 16:07:34 2014 +0100 @@ -147,9 +147,7 @@ $outstr .= ' colorScheme: \'scheme01\','.PHP_EOL; $outstr .= ' seriesGroups:'.PHP_EOL; $outstr .= ' [{'.PHP_EOL; - $outstr .= ' type: "spline",'.PHP_EOL; - $outstr .= ' columnsGapPercent: 30,'.PHP_EOL; - $outstr .= ' seriesGapPercent: 0,'.PHP_EOL; + $outstr .= ' type: "line",'.PHP_EOL; $outstr .= ' valueAxis:'.PHP_EOL; $outstr .= ' {'.PHP_EOL; $outstr .= ' minValue: 0,'.PHP_EOL; @@ -164,8 +162,6 @@ $outstr .= ' },'.PHP_EOL; $outstr .= ' {'.PHP_EOL; $outstr .= ' type: \'spline\','.PHP_EOL; - $outstr .= ' columnsGapPercent: 30,'.PHP_EOL; - $outstr .= ' seriesGapPercent: 0,'.PHP_EOL; $outstr .= ' valueAxis:'.PHP_EOL; $outstr .= ' {'.PHP_EOL; $outstr .= ' minValue: 0,'.PHP_EOL;