thermferm/server.c

changeset 536
e833bbd5e733
parent 534
92b546d4a839
child 542
73b63f431da2
equal deleted inserted replaced
535:3c4c6d5e4b8d 536:e833bbd5e733
476 name = xstrcat(name, (char *)"/.thermferm/log/"); 476 name = xstrcat(name, (char *)"/.thermferm/log/");
477 name = xstrcat(name, param); 477 name = xstrcat(name, param);
478 478
479 if ((fp = fopen(name, "r"))) { 479 if ((fp = fopen(name, "r"))) {
480 char buffer[256], outbuf[256], q[5], hr[3]; 480 char buffer[256], outbuf[256], q[5], hr[3];
481 char *date_n, *mode_n, *air_n, *beer_n, *target_lo_n, *target_hi_n, *heater_n, *cooler_n, *room_n; 481 char *date_n, *mode_n, *air_n, *beer_n, *target_lo_n, *target_hi_n, *heater_n, *cooler_n, *room_n, *chiller_n;
482 char *heater_u, *cooler_u; 482 char *heater_u, *cooler_u;
483 int lines = 0, heater_l = 0, cooler_l = 0, h = 0, c = 0, heat_used = 0, cool_used = 0, graphstep = 0; 483 int lines = 0, heater_l = 0, cooler_l = 0, h = 0, c = 0, heat_used = 0, cool_used = 0, graphstep = 0;
484 float room_t = 0.0; 484 float room_t = 0.0;
485 485
486 srv_send((char *)"212 Logfile list follows:"); 486 srv_send((char *)"212 Logfile list follows:");
503 graphstep = MAX_INTERVALS; 503 graphstep = MAX_INTERVALS;
504 syslog(LOG_NOTICE, "ARCHIVE LOG %s: lines=%d, interval=%d, graphstep=%d", param, lines, GRAPH_INTERVAL[graphstep], graphstep); 504 syslog(LOG_NOTICE, "ARCHIVE LOG %s: lines=%d, interval=%d, graphstep=%d", param, lines, GRAPH_INTERVAL[graphstep], graphstep);
505 505
506 while (fgets(buffer, sizeof(buffer)-1, fp) != NULL) { 506 while (fgets(buffer, sizeof(buffer)-1, fp) != NULL) {
507 /* 507 /*
508 * 2014-11-15 18:39,BEER,20.312,19.750,20.0,0,NA,NA,NA,78105,NA,NA,18.000,20.1 508 * 2014-11-15 18:39,BEER,20.312,19.750,20.0,0,NA,NA,NA,78105,NA,NA,18.000,20.1,5.312
509 * | | | | | | | | | | | | | | 509 * | | | | | | | | | | | | | | |
510 * date_n | | | | | | | | | | | | | 510 * date_n | | | | | | | | | | | | | |
511 * mode_n ----------+ | | | | | | | | | | | | 511 * mode_n ----------+ | | | | | | | | | | | | |
512 * air_n -----------------+ | | | | | | | | | | | 512 * air_n -----------------+ | | | | | | | | | | | |
513 * beer_n -----------------------+ | | | | | | | | | | 513 * beer_n -----------------------+ | | | | | | | | | | |
514 * target_lo_n ------------------------+ | | | | | | | | | 514 * target_lo_n ------------------------+ | | | | | | | | | |
515 * heater_n -------------------------------+ | | | | | | | | 515 * heater_n -------------------------------+ | | | | | | | | |
516 * cooler_n ---------------------------------+ | | | | | | | 516 * cooler_n ---------------------------------+ | | | | | | | |
517 * not used ------------------------------------+ | | | | | | 517 * not used ------------------------------------+ | | | | | | |
518 * not used ---------------------------------------+ | | | | | 518 * not used ---------------------------------------+ | | | | | |
519 * heater_u --------------------------------------------+ | | | | 519 * heater_u --------------------------------------------+ | | | | |
520 * cooler_u ------------------------------------------------+ | | | 520 * cooler_u ------------------------------------------------+ | | | |
521 * not used ---------------------------------------------------+ | | 521 * not used ---------------------------------------------------+ | | |
522 * room_n ----------------------------------------------------------+ | 522 * room_n ----------------------------------------------------------+ | |
523 * target_hi_n -----------------------------------------------------------+ 523 * target_hi_n -----------------------------------------------------------+ |
524 * chiller_n ------------------------------------------------------------------+
524 */ 525 */
525 hr[0] = q[0] = buffer[11]; 526 hr[0] = q[0] = buffer[11];
526 hr[1] = q[1] = buffer[12]; 527 hr[1] = q[1] = buffer[12];
527 q[2] = buffer[14]; 528 q[2] = buffer[14];
528 q[3] = buffer[15]; 529 q[3] = buffer[15];
540 heater_u = strtok(NULL, ",\0"); /* heater use counter */ 541 heater_u = strtok(NULL, ",\0"); /* heater use counter */
541 cooler_u = strtok(NULL, ",\0"); /* cooler use counter */ 542 cooler_u = strtok(NULL, ",\0"); /* cooler use counter */
542 room_n = strtok(NULL, ",\0"); /* fan use counter */ 543 room_n = strtok(NULL, ",\0"); /* fan use counter */
543 room_n = strtok(NULL, ",\0"); /* room temperature */ 544 room_n = strtok(NULL, ",\0"); /* room temperature */
544 target_hi_n = strtok(NULL, ",\0"); /* target high temp */ 545 target_hi_n = strtok(NULL, ",\0"); /* target high temp */
546 chiller_n = strtok(NULL, ",\0"); /* chiller temp */
545 547
546 if (strncmp(mode_n, (char *)"Mode", 4)) { 548 if (strncmp(mode_n, (char *)"Mode", 4)) {
547 /* 549 /*
548 * Output a line at the right intervals 550 * Output a line at the right intervals
549 */ 551 */
569 } 571 }
570 if (room_n) 572 if (room_n)
571 sscanf(room_n, "%f", &room_t); 573 sscanf(room_n, "%f", &room_t);
572 if (target_hi_n == NULL) 574 if (target_hi_n == NULL)
573 target_hi_n = target_lo_n; 575 target_hi_n = target_lo_n;
574 snprintf(outbuf, 255, "%s,%s,%s,%s,%s,%s,%s,%d,%d,%.1f,%s", 576 snprintf(outbuf, 255, "%s,%s,%s,%s,%s,%s,%s,%d,%d,%.1f,%s,%s",
575 date_n, mode_n, air_n, beer_n, target_lo_n, heater_n, cooler_n, heat_used, cool_used, room_t,target_hi_n); 577 date_n, mode_n, air_n, beer_n, target_lo_n, heater_n, cooler_n, heat_used, cool_used, room_t,target_hi_n, chiller_n);
576 srv_send(outbuf); 578 srv_send(outbuf);
577 if (heater_u && h && strcmp(heater_u, "NA")) 579 if (heater_u && h && strcmp(heater_u, "NA"))
578 heater_l = h; 580 heater_l = h;
579 if (cooler_u && c & strcmp(cooler_u, "NA")) 581 if (cooler_u && c & strcmp(cooler_u, "NA"))
580 cooler_l = c; 582 cooler_l = c;
1165 * LIST 1167 * LIST
1166 * LIST LOG 1168 * LIST LOG
1167 */ 1169 */
1168 int cmd_list(char *buf) 1170 int cmd_list(char *buf)
1169 { 1171 {
1170 char *opt, *param, *filename, q[5], hr[3], buffer[256], outbuf[256]; 1172 char *opt;
1171 char *date_n, *mode_n, *air_n, *beer_n, *target_lo_n, *target_hi_n, *heater_n, *cooler_n, *room_n; 1173 // char *param, *filename, q[5], hr[3], buffer[256], outbuf[256];
1172 char *heater_u, *cooler_u; 1174 // char *date_n, *mode_n, *air_n, *beer_n, *target_lo_n, *target_hi_n, *heater_n, *cooler_n, *room_n, *chiller_n;
1173 int heater_l = 0, cooler_l = 0, h = 0, c = 0, heat_used = 0, cool_used = 0, lines = 0, graphstep = 0; 1175 // char *heater_u, *cooler_u;
1176 // int heater_l = 0, cooler_l = 0, h = 0, c = 0, heat_used = 0, cool_used = 0, lines = 0, graphstep = 0;
1174 units_list *unit; 1177 units_list *unit;
1175 FILE *fp; 1178 // FILE *fp;
1176 float room_t; 1179 // float room_t;
1177 1180
1178 opt = strtok(buf, " \0"); 1181 opt = strtok(buf, " \0");
1179 opt = strtok(NULL, " \0"); 1182 opt = strtok(NULL, " \0");
1180 1183
1181 if (opt == NULL) { 1184 if (opt == NULL) {
1191 1194
1192 } else if (strcmp(opt, (char *)"HELP") == 0) { 1195 } else if (strcmp(opt, (char *)"HELP") == 0) {
1193 srv_send((char *)"100 Help text follows:"); 1196 srv_send((char *)"100 Help text follows:");
1194 srv_send((char *)"Recognized commands:"); 1197 srv_send((char *)"Recognized commands:");
1195 srv_send((char *)"LIST List available units"); 1198 srv_send((char *)"LIST List available units");
1196 srv_send((char *)"LIST LOG uuid List logfile of unit by uuid"); 1199 // srv_send((char *)"LIST LOG uuid List logfile of unit by uuid");
1197 srv_send((char *)"."); 1200 srv_send((char *)".");
1198 return 0; 1201 return 0;
1199 1202 /*
1200 } else if (strcmp(opt, (char *)"LOG") == 0) { 1203 } else if (strcmp(opt, (char *)"LOG") == 0) {
1201 1204
1202 param = strtok(NULL, "\0"); 1205 param = strtok(NULL, "\0");
1203 if (param == NULL) { 1206 if (param == NULL) {
1204 srv_send((char *)"502 Parameter missing"); 1207 srv_send((char *)"502 Parameter missing");
1219 } 1222 }
1220 filename = xstrcat(filename, (char *)"/.thermferm/log/"); 1223 filename = xstrcat(filename, (char *)"/.thermferm/log/");
1221 filename = xstrcat(filename, unit->name); 1224 filename = xstrcat(filename, unit->name);
1222 filename = xstrcat(filename, (char *)".log"); 1225 filename = xstrcat(filename, (char *)".log");
1223 if ((fp = fopen(filename, "r"))) { 1226 if ((fp = fopen(filename, "r"))) {
1224 1227 */
1225 /* 1228 /*
1226 * Count the lines in the logfile 1229 * Count the lines in the logfile
1227 */ 1230 */
1228 lines = 0; 1231 /* lines = 0;
1229 while (fgets(buffer, sizeof(buffer)-1, fp) != NULL) { 1232 while (fgets(buffer, sizeof(buffer)-1, fp) != NULL) {
1230 lines++; 1233 lines++;
1231 } 1234 }
1232 fseek(fp, 0L, SEEK_SET); 1235 fseek(fp, 0L, SEEK_SET);
1233 /* 1236 */ /*
1234 * We have counted the lines in the logfile including the header lines. 1237 * We have counted the lines in the logfile including the header lines.
1235 * The header lines should be ignored but there are so few of them, we 1238 * The header lines should be ignored but there are so few of them, we
1236 * just include them in the total. 1239 * just include them in the total.
1237 * Now find a reasonable interval of lines to sent to the client. 1240 * Now find a reasonable interval of lines to sent to the client.
1238 */ 1241 */
1239 for (graphstep = 1; graphstep <= MAX_INTERVALS; graphstep++) { 1242 /* for (graphstep = 1; graphstep <= MAX_INTERVALS; graphstep++) {
1240 if (lines < GRAPH_DATALINES[graphstep]) { 1243 if (lines < GRAPH_DATALINES[graphstep]) {
1241 break; 1244 break;
1242 } 1245 }
1243 } 1246 }
1244 if (graphstep > MAX_INTERVALS) 1247 if (graphstep > MAX_INTERVALS)
1245 graphstep = MAX_INTERVALS; 1248 graphstep = MAX_INTERVALS;
1246 syslog(LOG_NOTICE, "LIST LOG %s: lines=%d, interval=%d, graphstep=%d", unit->name, lines, GRAPH_INTERVAL[graphstep], graphstep); 1249 syslog(LOG_NOTICE, "LIST LOG %s: lines=%d, interval=%d, graphstep=%d", unit->name, lines, GRAPH_INTERVAL[graphstep], graphstep);
1247 1250
1248 while (fgets(buffer, sizeof(buffer)-1, fp) != NULL) { 1251 while (fgets(buffer, sizeof(buffer)-1, fp) != NULL) {
1249 /* 1252 */ /*
1250 * 2014-11-15 18:39,BEER,20.312,19.750,20.0,0,NA,NA,NA,78105,NA,NA 1253 * 2014-11-15 18:39,BEER,20.312,19.750,20.0,0,NA,NA,NA,78105,NA,NA
1251 */ 1254 */
1252 hr[0] = q[0] = buffer[11]; 1255 // hr[0] = q[0] = buffer[11];
1253 hr[1] = q[1] = buffer[12]; 1256 // hr[1] = q[1] = buffer[12];
1254 q[2] = buffer[14]; 1257 // q[2] = buffer[14];
1255 q[3] = buffer[15]; 1258 // q[3] = buffer[15];
1256 hr[2] = '\0'; 1259 // hr[2] = '\0';
1257 buffer[strlen(buffer) -1] = '\0'; 1260 // buffer[strlen(buffer) -1] = '\0';
1258 date_n = strtok(buffer, ",\0"); /* timestamp */ 1261 // date_n = strtok(buffer, ",\0"); /* timestamp */
1259 mode_n = strtok(NULL, ",\0"); /* unit mode */ 1262 // mode_n = strtok(NULL, ",\0"); /* unit mode */
1260 air_n = strtok(NULL, ",\0"); /* air temp */ 1263 // air_n = strtok(NULL, ",\0"); /* air temp */
1261 beer_n = strtok(NULL, ",\0"); /* beer temp */ 1264 // beer_n = strtok(NULL, ",\0"); /* beer temp */
1262 target_lo_n = strtok(NULL, ",\0"); /* target low temp */ 1265 // target_lo_n = strtok(NULL, ",\0"); /* target low temp */
1263 heater_n = strtok(NULL, ",\0"); /* current heater state */ 1266 // heater_n = strtok(NULL, ",\0"); /* current heater state */
1264 cooler_n = strtok(NULL, ",\0"); /* current cooler state */ 1267 // cooler_n = strtok(NULL, ",\0"); /* current cooler state */
1265 heater_u = strtok(NULL, ",\0"); /* current fan state */ 1268 // heater_u = strtok(NULL, ",\0"); /* current fan state */
1266 heater_u = strtok(NULL, ",\0"); /* current door state */ 1269 // heater_u = strtok(NULL, ",\0"); /* current door state */
1267 heater_u = strtok(NULL, ",\0"); /* heater use counter */ 1270 // heater_u = strtok(NULL, ",\0"); /* heater use counter */
1268 cooler_u = strtok(NULL, ",\0"); /* cooler use counter */ 1271 // cooler_u = strtok(NULL, ",\0"); /* cooler use counter */
1269 room_n = strtok(NULL, ",\0"); /* fan use counter */ 1272 // room_n = strtok(NULL, ",\0"); /* fan use counter */
1270 room_n = strtok(NULL, ",\0"); /* room temperature */ 1273 // room_n = strtok(NULL, ",\0"); /* room temperature */
1271 target_hi_n = strtok(NULL, ",\0"); /* target high temp */ 1274 // target_hi_n = strtok(NULL, ",\0"); /* target high temp */
1272 1275 // chiller_n = strtok(NULL, ",\0"); /* chiller temp */
1273 if (strncmp(mode_n, (char *)"Mode", 4)) { 1276
1277 // if (strncmp(mode_n, (char *)"Mode", 4)) {
1274 /* 1278 /*
1275 * Output a line at the right intervals 1279 * Output a line at the right intervals
1276 */ 1280 */
1277 int hour = atoi(hr); 1281 // int hour = atoi(hr);
1278 if (((graphstep == 1)) || 1282 // if (((graphstep == 1)) ||
1279 ((graphstep == 2) && (q[3] == '0' || q[3] == '5')) || 1283 // ((graphstep == 2) && (q[3] == '0' || q[3] == '5')) ||
1280 ((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'))) || 1284 // ((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'))) ||
1281 ((graphstep == 4) && ((q[2] == '0' && q[3] == '0') || (q[2] == '3' && q[3] == '0'))) || 1285 // ((graphstep == 4) && ((q[2] == '0' && q[3] == '0') || (q[2] == '3' && q[3] == '0'))) ||
1282 ((graphstep == 5) && (q[2] == '0' && q[3] == '0')) || 1286 // ((graphstep == 5) && (q[2] == '0' && q[3] == '0')) ||
1283 ((graphstep == 6) && (hour % 2 == 0) && (q[2] == '0' && q[3] == '0')) || /* 120 minutes */ 1287 // ((graphstep == 6) && (hour % 2 == 0) && (q[2] == '0' && q[3] == '0')) || /* 120 minutes */
1284 ((graphstep == 7) && (hour % 4 == 0) && (q[2] == '0' && q[3] == '0')) || /* 240 minutes */ 1288 // ((graphstep == 7) && (hour % 4 == 0) && (q[2] == '0' && q[3] == '0')) || /* 240 minutes */
1285 ((graphstep >= 8) && (hour % 8 == 0) && (q[2] == '0' && q[3] == '0')) ) { /* 480 minutes */ 1289 // ((graphstep >= 8) && (hour % 8 == 0) && (q[2] == '0' && q[3] == '0')) ) { /* 480 minutes */
1286 heat_used = cool_used = 0; 1290 // heat_used = cool_used = 0;
1287 if (strcmp(heater_u, "NA") && (sscanf(heater_u, "%d", &h) == 1)) { 1291 // if (strcmp(heater_u, "NA") && (sscanf(heater_u, "%d", &h) == 1)) {
1288 if (h && heater_l) { 1292 // if (h && heater_l) {
1289 heat_used = ((h - heater_l) * 100) / (GRAPH_INTERVAL[graphstep] * 60); 1293 // heat_used = ((h - heater_l) * 100) / (GRAPH_INTERVAL[graphstep] * 60);
1290 } 1294 // }
1291 } 1295 // }
1292 if (strcmp(cooler_u, "NA") && (sscanf(cooler_u, "%d", &c) == 1)) { 1296 // if (strcmp(cooler_u, "NA") && (sscanf(cooler_u, "%d", &c) == 1)) {
1293 if (c && cooler_l) { 1297 // if (c && cooler_l) {
1294 cool_used = ((c - cooler_l) * 100) / (GRAPH_INTERVAL[graphstep] * 60); 1298 // cool_used = ((c - cooler_l) * 100) / (GRAPH_INTERVAL[graphstep] * 60);
1295 } 1299 // }
1296 } 1300 // }
1297 if (room_n) 1301 // if (room_n)
1298 sscanf(room_n, "%f", &room_t); 1302 // sscanf(room_n, "%f", &room_t);
1299 else 1303 // else
1300 room_t = 0.0; 1304 // room_t = 0.0;
1301 if (target_hi_n == NULL) 1305 // if (target_hi_n == NULL)
1302 target_hi_n = target_lo_n; 1306 // target_hi_n = target_lo_n;
1303 snprintf(outbuf, 255, "%s,%s,%s,%s,%s,%s,%s,%d,%d,%.1f,%s", 1307 // snprintf(outbuf, 255, "%s,%s,%s,%s,%s,%s,%s,%d,%d,%.1f,%s,%s",
1304 date_n, mode_n, air_n, beer_n, target_lo_n, heater_n, cooler_n, heat_used, cool_used, room_t, target_hi_n); 1308 // date_n, mode_n, air_n, beer_n, target_lo_n, heater_n, cooler_n,
1305 srv_send(outbuf); 1309 // heat_used, cool_used, room_t, target_hi_n, chiller_n);
1306 if (h && strcmp(heater_u, "NA")) 1310 // srv_send(outbuf);
1307 heater_l = h; 1311 // if (h && strcmp(heater_u, "NA"))
1308 if (c & strcmp(cooler_u, "NA")) 1312 // heater_l = h;
1309 cooler_l = c; 1313 // if (c & strcmp(cooler_u, "NA"))
1310 } 1314 // cooler_l = c;
1311 } 1315 // }
1312 } 1316 // }
1313 } 1317 // }
1314 free(filename); 1318 // }
1315 filename = NULL; 1319 // free(filename);
1316 srv_send((char *)"."); 1320 // filename = NULL;
1317 return 0; 1321 // srv_send((char *)".");
1322 // return 0;
1318 } 1323 }
1319 1324
1320 srv_send((char *)"504 Subcommand error"); 1325 srv_send((char *)"504 Subcommand error");
1321 return 0; 1326 return 0;
1322 } 1327 }

mercurial