Air Quality Monitor
Portable C application for collecting, storing, and analyzing air quality sensor readings
Loading...
Searching...
No Matches
generate_statistics.c
1#include "core/aqm_db.h"
2#include <stdio.h>
3#include <sqlite3.h>
4
5void generate_statistics(void) {
6 sqlite3 *db = NULL;
7 if (aqm_db_open(&db) != 0)
8 return;
9
10 sqlite3_stmt *res = NULL;
11 const char *sql =
12 "SELECT r.sensor_id, s.name, r.model, "
13 "AVG(r.pm25), MAX(r.pm25), MIN(r.pm25), "
14 "AVG(r.pm10), MAX(r.pm10), MIN(r.pm10), "
15 "AVG(r.co), MAX(r.co), MIN(r.co), "
16 "AVG(r.no2), MAX(r.no2), MIN(r.no2), "
17 "AVG(r.o3), MAX(r.o3), MIN(r.o3), "
18 "AVG(r.so2), MAX(r.so2), MIN(r.so2), "
19 "COUNT(*) "
20 "FROM readings r JOIN sensors s ON s.id = r.sensor_id "
21 "GROUP BY r.sensor_id, s.name, r.model "
22 "ORDER BY r.sensor_id, r.model;";
23
24 if (sqlite3_prepare_v2(db, sql, -1, &res, NULL) != SQLITE_OK) {
25 fprintf(stderr, "Query failed: %s\n", sqlite3_errmsg(db));
26 aqm_db_close(db);
27 return;
28 }
29
30 printf("\n--- Aggregated statistics by sensor ---\n");
31
32 while (sqlite3_step(res) == SQLITE_ROW) {
33 int sid = sqlite3_column_int(res, 0);
34 const char *name = (const char *)sqlite3_column_text(res, 1);
35 const char *model = (const char *)sqlite3_column_text(res, 2);
36 double count = sqlite3_column_double(res, 21);
37
38 printf("\nSensor %d (%s) model=%s — samples: %.0f\n", sid, name ? name : "", model ? model : "", count);
39 printf(" PM2.5 avg %.4f max %.4f min %.4f\n", sqlite3_column_double(res, 3),
40 sqlite3_column_double(res, 4), sqlite3_column_double(res, 5));
41 printf(" PM10 avg %.4f max %.4f min %.4f\n", sqlite3_column_double(res, 6),
42 sqlite3_column_double(res, 7), sqlite3_column_double(res, 8));
43 printf(" CO avg %.4f max %.4f min %.4f\n", sqlite3_column_double(res, 9),
44 sqlite3_column_double(res, 10), sqlite3_column_double(res, 11));
45 printf(" NO2 avg %.6f max %.6f min %.6f\n", sqlite3_column_double(res, 12),
46 sqlite3_column_double(res, 13), sqlite3_column_double(res, 14));
47 printf(" O3 avg %.6f max %.6f min %.6f\n", sqlite3_column_double(res, 15),
48 sqlite3_column_double(res, 16), sqlite3_column_double(res, 17));
49 printf(" SO2 avg %.6f max %.6f min %.6f\n", sqlite3_column_double(res, 18),
50 sqlite3_column_double(res, 19), sqlite3_column_double(res, 20));
51 }
52
53 sqlite3_finalize(res);
54 aqm_db_close(db);
55}