1#include "core/aqm_db.h"
2#include "core/globals.h"
6static int ensure_sensor(sqlite3 *db,
int sensor_id) {
7 sqlite3_stmt *st = NULL;
8 const char *sql =
"INSERT OR IGNORE INTO sensors (id, name) VALUES (?, ?);";
9 if (sqlite3_prepare_v2(db, sql, -1, &st, NULL) != SQLITE_OK) {
10 fprintf(stderr,
"SQLite prepare error: %s\n", sqlite3_errmsg(db));
15 const char *forced_name = NULL;
18 forced_name =
"DHT22";
21 forced_name =
"BME680";
24 forced_name =
"PMS5003";
27 forced_name =
"MH-Z19";
34 int n = forced_name ? snprintf(name,
sizeof(name),
"%s", forced_name)
35 : snprintf(name, sizeof(name),
"Sensor %d", sensor_id);
36 if (n < 0 || (
size_t)n >=
sizeof(name)) {
41 sqlite3_bind_int(st, 1, sensor_id);
42 sqlite3_bind_text(st, 2, name, -1, SQLITE_TRANSIENT);
48static const char *default_model_name(
int sensor_id) {
63static int insert_data_db(sqlite3 *db,
const AirQualityData *data) {
67 if (ensure_sensor(db, data->
sensor_id) != 0)
70 sqlite3_stmt *st = NULL;
71 const char *sql =
"INSERT INTO readings (sensor_id, measured_at, model, pm25, pm10, co, no2, o3, so2) "
72 "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);";
73 if (sqlite3_prepare_v2(db, sql, -1, &st, NULL) != SQLITE_OK) {
74 fprintf(stderr,
"SQLite prepare error: %s\n", sqlite3_errmsg(db));
79 sqlite3_bind_text(st, 2, data->
timestamp, -1, SQLITE_STATIC);
81 sqlite3_bind_text(st, 3, model, -1, SQLITE_TRANSIENT);
82 sqlite3_bind_double(st, 4, (
double)data->pm25);
83 sqlite3_bind_double(st, 5, (
double)data->pm10);
84 sqlite3_bind_double(st, 6, (
double)data->co);
85 sqlite3_bind_double(st, 7, (
double)data->no2);
86 sqlite3_bind_double(st, 8, (
double)data->o3);
87 sqlite3_bind_double(st, 9, (
double)data->so2);
89 int rc = sqlite3_step(st);
92 if (rc != SQLITE_DONE) {
93 fprintf(stderr,
"Insert failed: %s\n", sqlite3_errmsg(db));
97 const char *model_name = data->
model[0] ? data->
model : default_model_name(data->
sensor_id);
98 printf(
"Data from %s (ID: %d) inserted successfully.\n", model_name, data->
sensor_id);
103 return insert_data_db(db, data);
One air quality reading: pollutant values plus sensor/timestamp metadata.
char timestamp[32]
Reading timestamp, formatted "%Y-%m-%d %H:%M:%S".
char model[64]
Sensor model name, e.g.
int sensor_id
Numeric sensor identifier, matches SensorPlugin::sensor_id.