Implement main functionality
This commit is contained in:
parent
09ab124103
commit
c726ddefc1
4 changed files with 75 additions and 18 deletions
55
src/db.rs
55
src/db.rs
|
@ -1,7 +1,7 @@
|
|||
use std::path::Path;
|
||||
|
||||
use anyhow::Result;
|
||||
use rusqlite::Connection;
|
||||
use rusqlite::{Connection, ToSql};
|
||||
|
||||
pub struct DataBase {
|
||||
sql: Connection,
|
||||
|
@ -19,10 +19,57 @@ impl DataBase {
|
|||
}
|
||||
|
||||
fn generate_tables(&self) -> Result<()> {
|
||||
todo!()
|
||||
self.sql.execute(
|
||||
"CREATE TABLE IF NOT EXISTS data (
|
||||
id INTEGER PRIMARY KEY,
|
||||
device TEXT NOT NULL,
|
||||
time BIGINT NOT NULL,
|
||||
watts REAL NOT NULL
|
||||
)",
|
||||
[],
|
||||
)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn write(&self, device_name: &str, time: u64, watts: f32) -> Result<()> {
|
||||
todo!()
|
||||
pub fn write(&self, device_name: &str, time: u64, watts: f32) -> Result<()> {
|
||||
let params: &[&dyn ToSql] = &[&device_name, &time, &watts];
|
||||
|
||||
self.sql.execute(
|
||||
"INSERT INTO data (device, time, watts)
|
||||
VALUES (?1, ?2, ?3)",
|
||||
params,
|
||||
)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use std::fs;
|
||||
|
||||
use anyhow::Result;
|
||||
|
||||
use super::DataBase;
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_connection() -> Result<()> {
|
||||
DataBase::new("connection_test.db").await?;
|
||||
|
||||
fs::remove_file("connection_test.db")?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_write() -> Result<()> {
|
||||
let db = DataBase::new("write_test.db").await?;
|
||||
|
||||
db.write("test", 0, 5.5)?;
|
||||
|
||||
fs::remove_file("write_test.db")?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,8 +14,9 @@ impl Devices {
|
|||
Ok(from_str(&fs::read_to_string(file)?)?)
|
||||
}
|
||||
|
||||
#[allow(unused)]
|
||||
pub fn save(&self, file: &str) -> Result<()> {
|
||||
fs::write("devices.conf", to_string_pretty(self)?)?;
|
||||
fs::write(file, to_string_pretty(self)?)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
@ -32,6 +33,6 @@ mod test {
|
|||
plugs: vec!["Dev1".to_string(), "Dev2".to_string()],
|
||||
};
|
||||
|
||||
devices.save("devices.conf")
|
||||
devices.save("test_devices.conf")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,13 +35,12 @@ async fn main() -> Result<()> {
|
|||
|
||||
loop {
|
||||
try_join_all(tasmota_plugs.iter().map(|plug| async {
|
||||
let usage = plug.read_power_usage().await?;
|
||||
|
||||
if let Ok(usage) = plug.read_power_usage().await {
|
||||
shared_db
|
||||
.lock()
|
||||
.unwrap()
|
||||
.write(plug.name(), since_epoch()?, usage)
|
||||
.await?;
|
||||
.write(plug.name(), since_epoch()?, usage)?;
|
||||
}
|
||||
|
||||
Ok::<(), anyhow::Error>(())
|
||||
}))
|
||||
|
|
|
@ -38,22 +38,32 @@ impl Tasmota {
|
|||
}
|
||||
|
||||
pub async fn turn_on_led(&self) -> Result<()> {
|
||||
todo!("LedPower=1")
|
||||
self.post("LedPower=1").await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn turn_off_led(&self) -> Result<()> {
|
||||
todo!("LedPower=2")
|
||||
self.post("LedPower=2").await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn switch_on(&self) -> Result<()> {
|
||||
todo!("Power0=1")
|
||||
self.post("Power0=1").await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn switch_off(&self) -> Result<()> {
|
||||
todo!("Power0=0")
|
||||
self.post("Power0=0").await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn read_power_usage(&self) -> Result<f32> {
|
||||
todo!("Status=8")
|
||||
let res = self.get("Status=8").await?;
|
||||
|
||||
Ok(res.parse()?)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue