use inverter::foxess::{registers, FoxEss, RegisterMap};
use inverter::{Inverter, InverterExt};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut args = std::env::args().skip(1);
let (transport, target) = match (args.next(), args.next()) {
(Some(transport), Some(target)) => (transport, target),
_ => usage(),
};
let map: &'static RegisterMap = match args.next().as_deref() {
Some("g1") => ®isters::H1_G1,
Some("g2") | None => ®isters::H1_G2,
Some(_) => usage(),
};
let mut inverter: Box<dyn Inverter> = match transport.as_str() {
"serial" => Box::new(FoxEss::open_serial(&target, 9600, 247, map)?),
"tcp" => Box::new(FoxEss::open_tcp(&target, 247, map)?),
_ => usage(),
};
println!("reading {} ...", inverter.capabilities().model);
let t = inverter.read_telemetry()?;
println!("battery: {:>6.1} %", t.soc_pct);
println!("battery: {:>+6.2} kW (positive = charging)", t.battery_kw);
println!("grid: {:>+6.2} kW (positive = importing)", t.grid_kw);
println!("load: {:>6.2} kW", t.load_kw);
println!("solar: {:>6.2} kW", t.solar_kw);
println!("export: {:>6.2} kW", inverter.get_export_kw()?);
Ok(())
}
fn usage() -> ! {
eprintln!("usage: foxess_read <serial PORT | tcp HOST:502> [g1|g2]");
std::process::exit(2);
}