From 29c7dc52b34a75f220c300ec053fb275ee95cb72 Mon Sep 17 00:00:00 2001 From: Alex Janka Date: Wed, 17 Jan 2024 08:35:05 +1100 Subject: [PATCH] json config --- Cargo.lock | 3 ++- Cargo.toml | 3 ++- src/api_interface.rs | 26 ++++++++------------------ src/config.rs | 5 ++++- src/errors.rs | 12 ------------ src/main.rs | 4 ++-- 6 files changed, 18 insertions(+), 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5244310..8e20ca7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2256,7 +2256,7 @@ dependencies = [ [[package]] name = "tesla-charge-controller" -version = "1.0.0-beta-3" +version = "1.0.0-beta-4-prerelease" dependencies = [ "async-channel", "chrono", @@ -2270,6 +2270,7 @@ dependencies = [ "rocket", "ron", "serde", + "serde_json", "serialport", "termcolor", "teslatte", diff --git a/Cargo.toml b/Cargo.toml index 7ba285d..c6303e5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tesla-charge-controller" -version = "1.0.0-beta-3" +version = "1.0.0-beta-4-prerelease" edition = "2021" license = "MITNFA" description = "Controls Tesla charge rate based on solar charge data" @@ -16,6 +16,7 @@ assets = [["target/release/tesla-charge-controller", "usr/bin/", "755"]] clap = { version = "4.0", features = ["derive"] } ron = "0.8" serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" tokio = { version = "1.35.1", features = ["full"] } teslatte = { path = "./vendored/teslatte" } thiserror = "1.0" diff --git a/src/api_interface.rs b/src/api_interface.rs index 0030fab..3914543 100644 --- a/src/api_interface.rs +++ b/src/api_interface.rs @@ -7,6 +7,7 @@ use std::{ }; use teslatte::{ auth::{AccessToken, RefreshToken}, + error::TeslatteError, vehicles::{ChargingState, Endpoint, GetVehicleData, SetChargingAmps}, FleetApi, FleetVehicleApi, }; @@ -300,29 +301,18 @@ impl TeslaInterface { } Err(e) => { self.metrics.tesla_online.set(0.); - if let RequestError::Teslatte(teslatte::error::TeslatteError::DecodeJsonError { - source: _, - request: _, - body, - }) = &e - { - if body.contains("vehicle is offline or asleep") { - return; - } - } - match e { - RequestError::StdIo(e) => log::error!("Stdio error: {e:?}"), - RequestError::RonSpanned(e) => log::error!("RON parsing error: {e:?}"), - RequestError::Teslatte(teslatte::error::TeslatteError::DecodeJsonError { + teslatte::error::TeslatteError::DecodeJsonError { source, request: _, body, - }) => { + } => { + if body.contains("vehicle is offline or asleep") { + return; + } log::error!("Error {source} getting state: {body}") } - RequestError::Teslatte(e) => log::error!("Teslatte error: {e:?}"), - RequestError::Save(e) => log::error!("Save error: {e:?}"), + _ => log::error!("Teslatte error: {e:?}"), } } } @@ -347,7 +337,7 @@ impl TeslaInterface { } } - async fn get_state(&mut self) -> Result { + async fn get_state(&mut self) -> Result { // Endpoint::VehicleDataCombo or multiple Endpoints in one request // doesn't seem to reliably get them all, // so for each endpoint we do a new request diff --git a/src/config.rs b/src/config.rs index 8fdcc29..6f2f2d7 100644 --- a/src/config.rs +++ b/src/config.rs @@ -9,11 +9,12 @@ static CONFIG: OnceLock = OnceLock::new(); pub fn access_config<'a>() -> &'a Config { CONFIG.get_or_init(|| { - ron::from_str(&std::fs::read_to_string(CONFIG_PATH.get().unwrap()).unwrap()).unwrap() + serde_json::from_str(&std::fs::read_to_string(CONFIG_PATH.get().unwrap()).unwrap()).unwrap() }) } #[derive(Serialize, Deserialize, Clone, Debug)] +#[serde(default)] pub struct Config { pub tesla_update_interval_seconds: u64, pub tesla_update_interval_while_charging_seconds: u64, @@ -28,6 +29,7 @@ pub struct Config { pub max_rate: i64, pub duty_cycle_too_high: f64, pub duty_cycle_too_low: f64, + pub optional_string: Option, } impl Default for Config { @@ -49,6 +51,7 @@ impl Default for Config { max_rate: 10, duty_cycle_too_high: 0.9, duty_cycle_too_low: 0.7, + optional_string: None, } } } diff --git a/src/errors.rs b/src/errors.rs index 00d0031..9375596 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -76,18 +76,6 @@ pub enum AuthLoadError { NoVehicles, } -#[derive(Error, Debug)] -pub enum RequestError { - #[error("stdio error")] - StdIo(#[from] std::io::Error), - #[error("ron - spanned error")] - RonSpanned(#[from] ron::error::SpannedError), - #[error("teslatte error")] - Teslatte(#[from] teslatte::error::TeslatteError), - #[error("save error")] - Save(#[from] SaveError), -} - #[derive(Error, Debug)] pub enum PliError { #[error("read error")] diff --git a/src/main.rs b/src/main.rs index c998bf1..56b1f75 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,7 +54,7 @@ async fn main() { let auth_path = args.config_dir.join("auth"); - let _ = CONFIG_PATH.set(args.config_dir.join("config")); + let _ = CONFIG_PATH.set(args.config_dir.join("config.json")); let _recorder = metrics_prometheus::install(); @@ -62,7 +62,7 @@ async fn main() { Commands::GenerateConfig => { println!( "{}", - ron::ser::to_string_pretty(&Config::default(), Default::default()).unwrap() + serde_json::ser::to_string_pretty(&Config::default()).unwrap(), ); } Commands::Watch => {