From 0513e1031e01b54334a9f002399e762231766b03 Mon Sep 17 00:00:00 2001 From: Romulus21 Date: Mon, 19 Aug 2024 16:57:44 +0200 Subject: [PATCH] add sensors loop --- src/main.rs | 92 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 40 deletions(-) diff --git a/src/main.rs b/src/main.rs index cdf8190..29ef5b5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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> { 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 = 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> { 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 = 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 = conn.query(query)?; - let donnees: Vec = selected_rows.into_iter().map(Donnee::from).collect(); + let donnees: Vec = selected_rows.into_iter().map(Donnee::from).collect(); - let mut value: i32 = 0; - let mut count = 0; - let mut ids: Vec = Vec::new(); - for donnee in donnees { - value = value + donnee.donnee.parse::().unwrap(); - count = count + 1; - ids.push(donnee.id.to_string()); + let mut value: i32 = 0; + let mut count = 0; + let mut ids: Vec = Vec::new(); + for donnee in donnees { + value = value + donnee.donnee.parse::().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 = 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 = conn.query(query)?; - } - current_time = current_time + Duration::minutes(30); } Ok(())