Files
digitemp-rrdgraph/src/commands/update.rs
T
2026-03-24 19:59:02 +09:00

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(())
}