add sensors loop

This commit is contained in:
Romulus21
2024-08-19 16:57:44 +02:00
parent 1be9158c43
commit 0513e1031e

View File

@@ -19,6 +19,16 @@ struct Sensor {
type_donnee: String,
}
impl Sensor {
fn new(service: String, capteur: String, type_donnee: String) -> Sensor {
Sensor {
service,
capteur,
type_donnee
}
}
}
#[derive(Debug, Deserialize)]
struct Donnee {
id: i32,
@@ -55,66 +65,68 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
let pool = Pool::new(url.as_str())?;
let mut conn = pool.get_conn()?;
let mut date = (Utc::now() - Duration::days(7)).naive_utc().date();
let args: Vec<String> = env::args().collect();
if args.len() >= 2 {
date = NaiveDate::parse_from_str(&args[1], "%Y-%m-%d").unwrap();
if args.len() == 1 {
let date = (Utc::now() - Duration::days(7)).naive_utc().date();
let _ = aggregate_values(&mut conn, date);
} else if args.len() == 2 {
let date = NaiveDate::parse_from_str(&args[1], "%Y-%m-%d").unwrap();
let _ = aggregate_values(&mut conn, date);
}
dbg!(args);
let _ = aggregate_values(&mut conn, date);
Ok(())
}
fn aggregate_values(conn: &mut PooledConn, date: NaiveDate) -> Result<(), Box<dyn std::error::Error>> {
let start_time = Utc.with_ymd_and_hms(date.year(), date.month(), date.day(), 00, 00, 00).unwrap() - Duration::minutes(15);
dbg!(date, start_time);
let end_time = start_time + Duration::days(1);
let mut current_time = start_time;
let sensor = Sensor {
service: "maison".to_string(),
capteur: "bureau".to_string(),
type_donnee: "co2".to_string(),
};
let sensors = [
Sensor::new("maison".to_string(), "bureau".to_string(), "co2".to_string()),
Sensor::new("maison".to_string(), "bureau".to_string(), "tvoc".to_string())
];
while current_time <= end_time {
let start_time_loop = current_time.to_string();
let end_time_loop = (current_time + Duration::minutes(29) + Duration::seconds(59)).to_string();
let query = format!("SELECT * FROM donnees WHERE capteur = '{}' AND type = '{}' AND (date_donnee BETWEEN '{}' AND '{}');", sensor.capteur, sensor.type_donnee, start_time_loop, end_time_loop);
let selected_rows: Vec<Row> = conn.query(query)?;
for sensor in &sensors {
let query = format!("SELECT * FROM donnees WHERE capteur = '{}' AND type = '{}' AND (date_donnee BETWEEN '{}' AND '{}');", sensor.capteur, sensor.type_donnee, start_time_loop, end_time_loop);
let selected_rows: Vec<Row> = conn.query(query)?;
let donnees: Vec<Donnee> = selected_rows.into_iter().map(Donnee::from).collect();
let donnees: Vec<Donnee> = selected_rows.into_iter().map(Donnee::from).collect();
let mut value: i32 = 0;
let mut count = 0;
let mut ids: Vec<String> = Vec::new();
for donnee in donnees {
value = value + donnee.donnee.parse::<i32>().unwrap();
count = count + 1;
ids.push(donnee.id.to_string());
let mut value: i32 = 0;
let mut count = 0;
let mut ids: Vec<String> = Vec::new();
for donnee in donnees {
value = value + donnee.donnee.parse::<i32>().unwrap();
count = count + 1;
ids.push(donnee.id.to_string());
}
if count > 1 {
let average = value / count;
let entry_date = current_time + Duration::minutes(15);
let donnee = Donnee {
id: 0,
service: sensor.service.to_string(),
capteur: sensor.capteur.to_string(),
type_donnee: sensor.type_donnee.to_string(),
donnee: average.to_string(),
date_donnee: entry_date.format("%Y-%m-%d %H:%M:%S").to_string(),
};
let _ = insert_value(conn, donnee);
let query = "DELETE FROM donnees WHERE id IN (".to_owned() + &*ids.join(", ") + ");";
let _: Vec<Row> = conn.query(query)?;
}
current_time = current_time + Duration::minutes(30);
}
if count > 1 {
let average = value / count;
let entry_date = current_time + Duration::minutes(15);
let donnee = Donnee {
id: 0,
service: sensor.service.to_string(),
capteur: sensor.capteur.to_string(),
type_donnee: sensor.type_donnee.to_string(),
donnee: average.to_string(),
date_donnee: entry_date.format("%Y-%m-%d %H:%M:%S").to_string(),
};
let _ = insert_value(conn, donnee);
let query = "DELETE FROM donnees WHERE id IN (".to_owned() + &*ids.join(", ") + ");";
let _: Vec<Row> = conn.query(query)?;
}
current_time = current_time + Duration::minutes(30);
}
Ok(())