Make router and raspis always on

This commit is contained in:
hodasemi 2023-09-22 07:43:56 +02:00
parent 24551e72bf
commit fa52f47d9d
8 changed files with 49 additions and 30 deletions

View file

@ -1,8 +1,8 @@
{ {
"plugs": [ "plugs": [
"Tasmota-Plug-1", ["Tasmota-Plug-1", false],
"Tasmota-Plug-2", ["Tasmota-Plug-2", false],
"Tasmota-Plug-3", ["Tasmota-Plug-3", true],
"Tasmota-Plug-4" ["Tasmota-Plug-4", true]
] ]
} }

View file

@ -1,3 +0,0 @@
import midea_ac_lan.midea.core as midea_core
midea_core

View file

@ -67,7 +67,7 @@ async function startup() {
} }
} }
let button_icon = document.createElement('i'); let button_icon = document.createElement('i');
button_icon.className = "fa fa-edit"; button_icon.className = "fa fa-pencil-square-o";
device_name_entry.appendChild(device_name); device_name_entry.appendChild(device_name);
device_name_edit.appendChild(button_icon); device_name_edit.appendChild(button_icon);
@ -106,6 +106,10 @@ async function startup() {
let device_power_state = document.createElement('label'); let device_power_state = document.createElement('label');
device_power_state.innerText = device_state["power"]; device_power_state.innerText = device_state["power"];
device_power_state.id = "power_" + device_id; device_power_state.id = "power_" + device_id;
device_power_state_entry.appendChild(device_power_state);
if (devices[i][2] == true) {
let device_power_on = document.createElement('button'); let device_power_on = document.createElement('button');
device_power_on.innerText = "On" device_power_on.innerText = "On"
device_power_on.onclick = async () => { await power_on(device_id) }; device_power_on.onclick = async () => { await power_on(device_id) };
@ -113,9 +117,10 @@ async function startup() {
device_power_off.innerText = "Off" device_power_off.innerText = "Off"
device_power_off.onclick = async () => { await power_off(device_id) }; device_power_off.onclick = async () => { await power_off(device_id) };
device_power_state_entry.appendChild(device_power_state);
device_power_state_entry.appendChild(device_power_on); device_power_state_entry.appendChild(device_power_on);
device_power_state_entry.appendChild(device_power_off); device_power_state_entry.appendChild(device_power_off);
}
row_device.appendChild(device_power_state_entry); row_device.appendChild(device_power_state_entry);
// create device power draw column // create device power draw column
@ -125,7 +130,7 @@ async function startup() {
let device_power_draw_graph_button = document.createElement('button'); let device_power_draw_graph_button = document.createElement('button');
device_power_draw_graph_button.onclick = async () => { await render_graph(device_id, device_descriptor) }; device_power_draw_graph_button.onclick = async () => { await render_graph(device_id, device_descriptor) };
let device_power_draw_graph_button_icon = document.createElement('i'); let device_power_draw_graph_button_icon = document.createElement('i');
device_power_draw_graph_button_icon.className = "fa fa-chart-bar"; device_power_draw_graph_button_icon.className = "fa fa-line-chart";
device_power_draw_graph_button.appendChild(device_power_draw_graph_button_icon); device_power_draw_graph_button.appendChild(device_power_draw_graph_button_icon);
device_power_draw_entry.appendChild(device_power_draw); device_power_draw_entry.appendChild(device_power_draw);

View file

@ -4,7 +4,8 @@
<head> <head>
<title>Smart Homeserver</title> <title>Smart Homeserver</title>
<link href="/css/index.css" rel="stylesheet"> <link href="/css/index.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/fork-awesome@1.2.0/css/fork-awesome.min.css"
integrity="sha256-XoaMnoYC5TH6/+ihMEnospgm0J1PM/nioxbOUdnM8HY=" crossorigin="anonymous">
</head> </head>
<body> <body>

View file

@ -192,7 +192,7 @@ mod test {
let db = DataBase::new("home_server.db").await?; let db = DataBase::new("home_server.db").await?;
let devices = Devices::read("devices.conf").await?; let devices = Devices::read("devices.conf").await?;
for plug in devices.plugs { for (plug, _) in devices.plugs {
println!("===== data for plug {plug} ====="); println!("===== data for plug {plug} =====");
let days: HashMap<NaiveDate, HashMap<u32, Vec<f32>>> = split_into_days( let days: HashMap<NaiveDate, HashMap<u32, Vec<f32>>> = split_into_days(

View file

@ -37,6 +37,7 @@ impl DataBase {
id INTEGER PRIMARY KEY, id INTEGER PRIMARY KEY,
device VARCHAR(60) NOT NULL, device VARCHAR(60) NOT NULL,
type VARCHAR(30) NOT NULL, type VARCHAR(30) NOT NULL,
control INTEGER NOT NULL,
name VARCHAR(80) name VARCHAR(80)
)", )",
[], [],
@ -75,7 +76,7 @@ impl DataBase {
} }
pub fn register_devices(&self, devices: &Devices) -> Result<()> { pub fn register_devices(&self, devices: &Devices) -> Result<()> {
for device in devices.plugs.iter() { for (device, control) in devices.plugs.iter() {
self.sql.execute( self.sql.execute(
&format!( &format!(
"INSERT INTO devices (device, type) "INSERT INTO devices (device, type)
@ -90,6 +91,19 @@ impl DataBase {
), ),
[], [],
)?; )?;
let ctl = if *control { 1 } else { 0 };
self.sql.execute(
&format!(
"
UPDATE devices
SET control=\"{ctl}\"
WHERE device=\"{device}\"
"
),
[],
)?;
} }
Ok(()) Ok(())
@ -116,16 +130,18 @@ impl DataBase {
.sql .sql
.prepare(&format!( .prepare(&format!(
" "
SELECT device, type, name SELECT device, type, name, control
FROM devices FROM devices
" "
))? ))?
.query_map([], |row| Ok((row.get(0)?, row.get(1)?, row.get(2)?)))? .query_map([], |row| {
Ok((row.get(0)?, row.get(1)?, row.get(2)?, row.get(3)?))
})?
{ {
let (device, dev_type, name): (String, String, Option<String>) = row?; let (device, dev_type, name, control): (String, String, Option<String>, i32) = row?;
match dev_type.as_str() { match dev_type.as_str() {
"plug" => devices.plugs.push((device, name)), "plug" => devices.plugs.push((device, name, control != 0)),
_ => panic!(), _ => panic!(),
} }
@ -195,7 +211,7 @@ mod test {
let db = DataBase::new("startup_test.db").await?; let db = DataBase::new("startup_test.db").await?;
db.register_devices(&Devices { db.register_devices(&Devices {
plugs: vec!["test".to_string()], plugs: vec![("test".to_string(), true)],
})?; })?;
fs::remove_file("startup_test.db")?; fs::remove_file("startup_test.db")?;
@ -210,7 +226,7 @@ mod test {
let device_name = "test"; let device_name = "test";
db.register_devices(&Devices { db.register_devices(&Devices {
plugs: vec![device_name.to_string()], plugs: vec![(device_name.to_string(), true)],
})?; })?;
db.write(device_name, 0, 5.5)?; db.write(device_name, 0, 5.5)?;

View file

@ -6,7 +6,7 @@ use serde_json::{from_str, to_string, to_string_pretty};
#[derive(Clone, PartialEq, Eq, Deserialize, Serialize, Debug)] #[derive(Clone, PartialEq, Eq, Deserialize, Serialize, Debug)]
pub struct Devices { pub struct Devices {
pub plugs: Vec<String>, pub plugs: Vec<(String, bool)>,
} }
impl Devices { impl Devices {
@ -24,7 +24,7 @@ impl Devices {
#[derive(Debug, Clone, Deserialize, Serialize, Default)] #[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct DevicesWithName { pub struct DevicesWithName {
pub plugs: Vec<(String, Option<String>)>, pub plugs: Vec<(String, Option<String>, bool)>,
} }
impl DevicesWithName { impl DevicesWithName {
@ -41,7 +41,7 @@ mod test {
#[test] #[test]
fn create_conf() -> Result<()> { fn create_conf() -> Result<()> {
let devices = Devices { let devices = Devices {
plugs: vec!["Dev1".to_string(), "Dev2".to_string()], plugs: vec![("Dev1".to_string(), true), ("Dev2".to_string(), false)],
}; };
devices.save("test_devices.conf") devices.save("test_devices.conf")

View file

@ -89,7 +89,7 @@ async fn main() -> Result<()> {
let tasmota_plugs: Vec<Tasmota> = devices let tasmota_plugs: Vec<Tasmota> = devices
.plugs .plugs
.iter() .iter()
.map(|plug| Tasmota::new(plug)) .map(|(plug, _)| Tasmota::new(plug))
.collect(); .collect();
try_join!( try_join!(