Initial commit
This commit is contained in:
commit
14164037d3
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/target
|
1168
Cargo.lock
generated
Normal file
1168
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
19
Cargo.toml
Normal file
19
Cargo.toml
Normal file
@ -0,0 +1,19 @@
|
||||
[package]
|
||||
name = "easee-controller"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
description = "Software load-balancer and control endpoint for Easee chargers"
|
||||
authors = ["Maxime Augier <max@xolus.net>"]
|
||||
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
anyhow = "1.0.86"
|
||||
clap = { version = "4.5.11", features = ["derive", "env"] }
|
||||
easee = { path = "../easee", features = ["tungstenite"] }
|
||||
humantime = "2.1.0"
|
||||
serde_json = "1.0.121"
|
||||
tracing = "0.1.40"
|
||||
tracing-subscriber = "0.3.18"
|
||||
tungstenite = { version = "0.23.0", optional = true, features = ["rustls-tls-native-roots"] }
|
106
src/main.rs
Normal file
106
src/main.rs
Normal file
@ -0,0 +1,106 @@
|
||||
use clap::ValueEnum;
|
||||
use clap::{Parser, Subcommand};
|
||||
use anyhow::Result;
|
||||
use easee::api;
|
||||
use easee::stream;
|
||||
|
||||
use tracing::info;
|
||||
|
||||
#[derive(Debug,Clone,ValueEnum)]
|
||||
enum Command {
|
||||
Start,
|
||||
Stop,
|
||||
Pause,
|
||||
Resume,
|
||||
}
|
||||
|
||||
#[derive(Debug,Clone,Subcommand)]
|
||||
enum Mode {
|
||||
Status { id: Option<String> },
|
||||
Ongoing,
|
||||
Latest,
|
||||
Stream,
|
||||
Command { id: String, command: Command }
|
||||
}
|
||||
|
||||
#[derive(Debug,Parser)]
|
||||
struct CLI {
|
||||
#[arg(short,long,env)]
|
||||
username: String,
|
||||
#[arg(short,long,env)]
|
||||
password: String,
|
||||
#[command(subcommand)]
|
||||
mode: Mode,
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
|
||||
tracing::subscriber::set_global_default(tracing_subscriber::FmtSubscriber::new())
|
||||
.expect("Tracing subscriber failed");
|
||||
|
||||
let args = CLI::parse();
|
||||
let mut ctx = api::Context::from_login(&args.username, &args.password)?;
|
||||
|
||||
info!("Logged in");
|
||||
|
||||
let sites = ctx.sites()?;
|
||||
let chargers = ctx.chargers()?;
|
||||
info!("{} sites and {} chargers available", sites.len(), chargers.len());
|
||||
|
||||
match args.mode {
|
||||
Mode::Status { id } => {
|
||||
for c in &chargers {
|
||||
if id.as_deref().map(|id| id == &c.id).unwrap_or(true) {
|
||||
println!("{}: {:?}", c.id, c.state(&mut ctx));
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
},
|
||||
Mode::Ongoing => {
|
||||
for c in &chargers {
|
||||
println!("{}: {:?}", c.id, c.ongoing_session(&mut ctx));
|
||||
}
|
||||
Ok(())
|
||||
},
|
||||
Mode::Latest => {
|
||||
for c in &chargers {
|
||||
println!("{:?}", c.latest_session(&mut ctx));
|
||||
}
|
||||
Ok(())
|
||||
},
|
||||
Mode::Stream => {
|
||||
let mut stream = stream::Stream::open(&mut ctx)?;
|
||||
for c in &chargers {
|
||||
stream.subscribe(&c.id)?;
|
||||
}
|
||||
|
||||
let mut stream = easee::signalr::Stream::from_ws(stream);
|
||||
loop {
|
||||
println!("{:?}", stream.recv()?);
|
||||
}
|
||||
},
|
||||
Mode::Command { id, command } => {
|
||||
|
||||
for c in &chargers {
|
||||
if c.id == id {
|
||||
match command {
|
||||
Command::Start => c.start(&mut ctx)?,
|
||||
Command::Stop => c.stop(&mut ctx)?,
|
||||
Command::Pause => c.pause(&mut ctx)?,
|
||||
Command::Resume => c.resume(&mut ctx)?,
|
||||
}
|
||||
return Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
eprintln!("Charger not found.");
|
||||
Ok(())
|
||||
|
||||
},
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user