1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
#[macro_use]
extern crate diesel;
use chrono::{DateTime, Duration, Utc};
use diesel::prelude::*;
use diesel::sqlite::SqliteConnection;
use diesel::Connection;
use std::io;
mod maxmin;
mod models;
mod schema;
mod device;
use self::maxmin::*;
use self::models::*;
use self::device::DeviceResponse;
fn open_database(db_filename: &str) -> io::Result<SqliteConnection> {
SqliteConnection::establish(db_filename).map_err(|e| io::Error::new(io::ErrorKind::Other, e))
}
fn main() -> io::Result<()> {
use self::schema::data::dsl::*;
use self::schema::devices::dsl::*;
dotenv::dotenv().ok();
env_logger::init();
let db_path = std::env::var("DATABASE_URL").expect("Missing DATABASE env variable");
let given_device_id = std::env::var("DEVICE_ID").expect("Missing DEVICE_ID env variable");
let mut db = open_database(&db_path)?;
let start_time = Utc::now() - Duration::days(90);
let data_records = data
.filter(timestamp.ge(start_time.naive_utc()).and(self::schema::data::dsl::device_id.eq(&given_device_id)))
.load::<Datapoint>(&mut db)
.expect("Error loading data");
let mut resp = DeviceResponse::new(given_device_id);
println!(
"{:<40}\t{:>8}\t{:<20?}\t{:<40}",
"timestamp",
"value",
"water_level",
"last_watered");
for (i, record) in data_records.iter().enumerate() {
let previous_last_watered = resp.last_watered();
resp.calculate_status(&data_records[0..i]);
let flag = if resp.last_watered() != previous_last_watered {
"******"
} else if record.value < 12000.0 {
"^^^^^"
} else {
""
};
println!(
"{:<40}\t{:>8}\t{:<20?}\t{:<40?} {}",
record.timestamp,
record.value,
resp.water_level(),
resp.last_watered(),
flag,
);
}
Ok(())
}
|