program initial commit
This commit is contained in:
+114
@@ -0,0 +1,114 @@
|
||||
use rppal::gpio::{Gpio, OutputPin};
|
||||
use serde::{Deserialize};
|
||||
use serde_json;
|
||||
use sqlite;
|
||||
use std::error::Error;
|
||||
use std::env;
|
||||
use std::fs::File;
|
||||
use std::path::Path;
|
||||
use std::thread;
|
||||
use std::time::Duration;
|
||||
|
||||
// Gpio uses BCM pin numbering. BCM GPIO 23 is tied to physical pin 16.
|
||||
const GPIO_SWITCH: u8 = 24;
|
||||
|
||||
// set duration of pin switching test
|
||||
const TEST_DURATION: u64 = 1000;
|
||||
|
||||
#[derive(Deserialize)]
|
||||
#[derive(Debug)]
|
||||
struct Config{
|
||||
database: String,
|
||||
device_name_voltage: String,
|
||||
voltage_off: f32,
|
||||
voltage_recover: f32,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
struct DbData{
|
||||
V: String,
|
||||
}
|
||||
|
||||
//fn main() {
|
||||
fn main () {
|
||||
// read and parse configuration file
|
||||
let config_file = File::open("config.json")
|
||||
.expect("file should open read only");
|
||||
let config: Config = serde_json::from_reader(config_file)
|
||||
.expect("file should be proper JSON");
|
||||
|
||||
// read and parse command line parameters
|
||||
let args: Vec<String> = env::args().collect();
|
||||
if args.len() >= 2 {
|
||||
let action: &str = args[1].as_str();
|
||||
match action {
|
||||
"on" => pin_switch_on(),
|
||||
"off" => pin_switch_off(),
|
||||
"test" => pin_test(),
|
||||
&_ => todo!("So far only the parameters 'on', 'off' and 'test' are supported.")
|
||||
}
|
||||
}
|
||||
else { // no command line parameter set; check for voltages and switch the inverter accordingly
|
||||
pin_status();
|
||||
let voltage = get_current_voltage(&config);
|
||||
|
||||
if voltage < config.voltage_off && pin_status() > 0 {
|
||||
println!("Siwtching off inverter due to low voltage!");
|
||||
pin_switch_off();
|
||||
}
|
||||
else if voltage >= config.voltage_recover && pin_status() == 0 {
|
||||
println!("Voltage recovered! Switching inverter back on.");
|
||||
pin_switch_on();
|
||||
}
|
||||
else {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//end program with OK status
|
||||
}
|
||||
|
||||
fn pin_status () -> u8 {
|
||||
let mut pin_level: u8 = Gpio::new().unwrap().get(GPIO_SWITCH).unwrap().read() as u8;
|
||||
return pin_level;
|
||||
}
|
||||
|
||||
fn pin_switch_on () {
|
||||
let mut pin: OutputPin = Gpio::new().unwrap().get(GPIO_SWITCH).unwrap().into_output();
|
||||
pin.set_reset_on_drop(false);
|
||||
pin.set_high();
|
||||
}
|
||||
|
||||
fn pin_switch_off () {
|
||||
let mut pin: OutputPin = Gpio::new().unwrap().get(GPIO_SWITCH).unwrap().into_output();
|
||||
pin.set_reset_on_drop(false);
|
||||
pin.set_low();
|
||||
}
|
||||
|
||||
fn pin_test () {
|
||||
pin_switch_on();
|
||||
thread::sleep(Duration::from_millis(TEST_DURATION));
|
||||
pin_switch_off();
|
||||
}
|
||||
|
||||
fn get_current_voltage (config: &Config) -> f32 {
|
||||
let mut voltage: f32 = 0.0;
|
||||
if !Path::new(&config.database).exists() {
|
||||
return voltage;
|
||||
}
|
||||
|
||||
let db_connection = sqlite::open(&config.database).unwrap();
|
||||
let query = format!("SELECT data FROM '{device}' ORDER BY date DESC, time DESC LIMIT 1;", device = &config.device_name_voltage);
|
||||
|
||||
let _ = db_connection.iterate(query, |pairs | {
|
||||
let data = pairs.get(0).unwrap().1.unwrap();
|
||||
let test_parse: DbData = serde_json::from_str(data).expect("no proper JSON data found on database");
|
||||
let raw_value = match test_parse.V.parse::<i32>() {
|
||||
Ok(v) => v,
|
||||
Err(_) => return true
|
||||
};
|
||||
voltage = raw_value as f32 / 1000.0;
|
||||
true
|
||||
});
|
||||
return voltage;
|
||||
}
|
||||
Reference in New Issue
Block a user