53 lines
1.8 KiB
Rust
53 lines
1.8 KiB
Rust
use digitemp_rrdgraph_core::config::Config;
|
|
use digitemp_rrdgraph_core::digitemp::DigiTemp;
|
|
use digitemp_rrdgraph_core::rrd::RrdTemperature;
|
|
use digitemp_rrdgraph_core::template::{TemplateContext, TemplateEngine};
|
|
use std::error::Error;
|
|
use std::fs;
|
|
use std::path::Path;
|
|
use std::time::{SystemTime, UNIX_EPOCH};
|
|
|
|
pub fn run(config: &Config) -> Result<(), Box<dyn Error>> {
|
|
let room_name = config.room_name()?;
|
|
let digitemp = DigiTemp::new(config.digitemp.clone(), config.digitemp_config.clone())?;
|
|
let mut rrdtemp = RrdTemperature::new(&config.database_dir);
|
|
let num = digitemp.get_num_sensors();
|
|
for i in 0..num {
|
|
let id = digitemp.get_sensor_id(i).unwrap();
|
|
let value = digitemp.read_sensor(i)?;
|
|
rrdtemp.add_sensor(id)?;
|
|
let now = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs();
|
|
rrdtemp.update(id, now, value)?;
|
|
}
|
|
let types = vec![
|
|
("hour", vec![1, 3, 6, 12]),
|
|
("day", vec![1, 3]),
|
|
("week", vec![1, 2]),
|
|
("month", vec![1, 3, 6]),
|
|
("year", vec![1, 3, 5, 10]),
|
|
];
|
|
for (typ, nums) in types {
|
|
for num in nums {
|
|
let num_str = if num == 1 {
|
|
"".to_string()
|
|
} else {
|
|
num.to_string()
|
|
};
|
|
let fpath = format!("{}/graph-{}{}.png", config.images_dir, num_str, typ);
|
|
rrdtemp.output_graph(room_name, typ, num, &fpath)?;
|
|
}
|
|
}
|
|
|
|
let engine = TemplateEngine::new(&config.templates_dir)?;
|
|
let mut ctx = TemplateContext::new();
|
|
ctx.insert("room_name", &room_name);
|
|
let html = engine.render("index.tera", &ctx)?;
|
|
let index_path = Path::new(&config.images_dir)
|
|
.parent()
|
|
.unwrap_or_else(|| Path::new("html"))
|
|
.join("index.html");
|
|
fs::write(index_path, html)?;
|
|
|
|
Ok(())
|
|
}
|