From 4ebd386c0585019c82694c85f500ae9c709ba529 Mon Sep 17 00:00:00 2001
From: Alex Janka
Date: Thu, 25 Jan 2024 16:03:19 +1100
Subject: [PATCH] fudge factor scales
---
Cargo.lock | 2 +-
Cargo.toml | 2 +-
src/config.rs | 4 ++++
src/server/mod.rs | 7 +++++++
src/tesla_charge_rate.rs | 15 ++++++++++-----
webapp/pid/index.html | 4 ++--
webapp/script.js | 18 +++++++++---------
7 files changed, 34 insertions(+), 18 deletions(-)
diff --git a/Cargo.lock b/Cargo.lock
index dfbd3a9..c7dbdd4 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2633,7 +2633,7 @@ dependencies = [
[[package]]
name = "tesla-charge-controller"
-version = "1.0.28"
+version = "1.0.29"
dependencies = [
"chrono",
"clap 4.4.11",
diff --git a/Cargo.toml b/Cargo.toml
index f0ec111..6645351 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "tesla-charge-controller"
-version = "1.0.28"
+version = "1.0.29"
edition = "2021"
license = "MITNFA"
description = "Controls Tesla charge rate based on solar charge data"
diff --git a/src/config.rs b/src/config.rs
index 545b76d..77d8805 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -128,10 +128,12 @@ pub struct Config {
}
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq)]
+#[serde(default)]
pub struct PidControls {
pub proportional_gain: f64,
pub derivative_gain: f64,
pub loop_time_seconds: u64,
+ pub load_divisor: f64,
}
impl Default for PidControls {
@@ -140,6 +142,7 @@ impl Default for PidControls {
proportional_gain: 1.,
derivative_gain: 1.,
loop_time_seconds: 5,
+ load_divisor: 30.,
}
}
}
@@ -217,5 +220,6 @@ impl Config {
self.duty_cycle_too_low = self.duty_cycle_too_low.clamp(0.0, 1.0);
self.pid_controls.proportional_gain = self.pid_controls.proportional_gain.clamp(0.0, 50.0);
self.pid_controls.derivative_gain = self.pid_controls.derivative_gain.clamp(0.0, 50.0);
+ self.pid_controls.load_divisor = self.pid_controls.load_divisor.clamp(1.0, 50.0);
}
}
diff --git a/src/server/mod.rs b/src/server/mod.rs
index 15db8f1..34b8e94 100644
--- a/src/server/mod.rs
+++ b/src/server/mod.rs
@@ -67,6 +67,7 @@ fn rocket(state: ServerState) -> rocket::Rocket {
set_proportional_gain,
set_derivative_gain,
set_pid_loop_length,
+ set_load_divisor,
pid_settings,
metrics,
sync_time,
@@ -177,6 +178,12 @@ async fn set_pid_loop_length(time: u64, remote_addr: std::net::IpAddr) {
write_to_config().pid_controls.loop_time_seconds = time;
}
+#[post("/pid-settings/load_divisor/")]
+async fn set_load_divisor(divisor: f64, remote_addr: std::net::IpAddr) {
+ log::warn!("setting load divisor interval: {remote_addr:?}");
+ write_to_config().pid_controls.load_divisor = divisor;
+}
+
#[get("/pid-settings/status")]
async fn pid_settings() -> Json {
Json(access_config().pid_controls)
diff --git a/src/tesla_charge_rate.rs b/src/tesla_charge_rate.rs
index 7ffcfd8..ef8cf17 100644
--- a/src/tesla_charge_rate.rs
+++ b/src/tesla_charge_rate.rs
@@ -99,6 +99,7 @@ struct PidLoop {
previous_error: f64,
proportional_gauge: Gauge,
derivative_gauge: Gauge,
+ load_gauge: Gauge,
change_request_gauge: Gauge,
}
@@ -114,12 +115,18 @@ impl Default for PidLoop {
"Derivative component of requested change to charge rate"
);
let derivative_gauge = gauge!("tcrc_derivative");
+ describe_gauge!(
+ "tcrc_load",
+ "Fudge factor from internal load of requested change to charge rate"
+ );
+ let load_gauge = gauge!("tcrc_load");
describe_gauge!("tcrc_change_request", "Requested change to charge rate");
let change_request_gauge = gauge!("tcrc_change_request");
Self {
previous_error: 0.,
proportional_gauge,
derivative_gauge,
+ load_gauge,
change_request_gauge,
}
}
@@ -139,16 +146,14 @@ impl PidLoop {
let proportional_component = config.pid_controls.proportional_gain * error;
let derivative_component = config.pid_controls.derivative_gain * derivative;
- let extra_offsets = if pl_state.internal_load_current > 1. {
- 1.
- } else {
- 0.
- };
+ let extra_offsets =
+ (pl_state.internal_load_current / config.pid_controls.load_divisor).clamp(0., 2.);
let offset = proportional_component + derivative_component + extra_offsets;
self.proportional_gauge.set(proportional_component);
self.derivative_gauge.set(derivative_component);
+ self.load_gauge.set(extra_offsets);
self.change_request_gauge.set(offset);
let new_target = offset + (charge_state.charge_amps as f64);
diff --git a/webapp/pid/index.html b/webapp/pid/index.html
index 1053280..e848e1d 100644
--- a/webapp/pid/index.html
+++ b/webapp/pid/index.html
@@ -20,8 +20,8 @@
-
-
+
+
←Home
diff --git a/webapp/script.js b/webapp/script.js
index 3a6fa19..e431f4a 100644
--- a/webapp/script.js
+++ b/webapp/script.js
@@ -138,13 +138,13 @@ function set_derivative() {
}
}
-function set_pid_length() {
- var set_button = document.getElementById("set-pid-length");
- var number_input = document.getElementById("pid-length");
+function set_load_divisor() {
+ var set_button = document.getElementById("set-load-divisor");
+ var number_input = document.getElementById("load-divisor");
if (!isNaN(number_input.value)) {
set_button.disabled = true;
number_input.disabled = true;
- fetch(api_url + "/pid-settings/loop_time_seconds/" + number_input.value, { method: "POST" })
+ fetch(api_url + "/pid-settings/load_divisor/" + number_input.value, { method: "POST" })
.then(async (response) => {
let delayres = await delay(100);
refresh_gains();
@@ -235,11 +235,11 @@ function update_gains(data) {
derivative_set_button.disabled = false;
derivative_number_input.disabled = false;
derivative_number_input.value = data.derivative_gain;
- var pid_length_button = document.getElementById("set-pid-length");
- var pid_length_input = document.getElementById("pid-length");
- pid_length_button.disabled = false;
- pid_length_input.disabled = false;
- pid_length_input.value = data.loop_time_seconds;
+ var load_divisor_button = document.getElementById("set-load-divisor");
+ var load_divisor_input = document.getElementById("load-divisor");
+ load_divisor_button.disabled = false;
+ load_divisor_input.disabled = false;
+ load_divisor_input.value = data.load_divisor;
}
function refresh_buttons() {