fudge factor scales
All checks were successful
Build .deb on release / Build-Deb (push) Successful in 1m54s
All checks were successful
Build .deb on release / Build-Deb (push) Successful in 1m54s
This commit is contained in:
parent
95a0a446a1
commit
4ebd386c05
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -2633,7 +2633,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tesla-charge-controller"
|
name = "tesla-charge-controller"
|
||||||
version = "1.0.28"
|
version = "1.0.29"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"clap 4.4.11",
|
"clap 4.4.11",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "tesla-charge-controller"
|
name = "tesla-charge-controller"
|
||||||
version = "1.0.28"
|
version = "1.0.29"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MITNFA"
|
license = "MITNFA"
|
||||||
description = "Controls Tesla charge rate based on solar charge data"
|
description = "Controls Tesla charge rate based on solar charge data"
|
||||||
|
|
|
@ -128,10 +128,12 @@ pub struct Config {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq)]
|
#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq)]
|
||||||
|
#[serde(default)]
|
||||||
pub struct PidControls {
|
pub struct PidControls {
|
||||||
pub proportional_gain: f64,
|
pub proportional_gain: f64,
|
||||||
pub derivative_gain: f64,
|
pub derivative_gain: f64,
|
||||||
pub loop_time_seconds: u64,
|
pub loop_time_seconds: u64,
|
||||||
|
pub load_divisor: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for PidControls {
|
impl Default for PidControls {
|
||||||
|
@ -140,6 +142,7 @@ impl Default for PidControls {
|
||||||
proportional_gain: 1.,
|
proportional_gain: 1.,
|
||||||
derivative_gain: 1.,
|
derivative_gain: 1.,
|
||||||
loop_time_seconds: 5,
|
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.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.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.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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@ fn rocket(state: ServerState) -> rocket::Rocket<rocket::Build> {
|
||||||
set_proportional_gain,
|
set_proportional_gain,
|
||||||
set_derivative_gain,
|
set_derivative_gain,
|
||||||
set_pid_loop_length,
|
set_pid_loop_length,
|
||||||
|
set_load_divisor,
|
||||||
pid_settings,
|
pid_settings,
|
||||||
metrics,
|
metrics,
|
||||||
sync_time,
|
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;
|
write_to_config().pid_controls.loop_time_seconds = time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[post("/pid-settings/load_divisor/<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")]
|
#[get("/pid-settings/status")]
|
||||||
async fn pid_settings() -> Json<crate::config::PidControls> {
|
async fn pid_settings() -> Json<crate::config::PidControls> {
|
||||||
Json(access_config().pid_controls)
|
Json(access_config().pid_controls)
|
||||||
|
|
|
@ -99,6 +99,7 @@ struct PidLoop {
|
||||||
previous_error: f64,
|
previous_error: f64,
|
||||||
proportional_gauge: Gauge,
|
proportional_gauge: Gauge,
|
||||||
derivative_gauge: Gauge,
|
derivative_gauge: Gauge,
|
||||||
|
load_gauge: Gauge,
|
||||||
change_request_gauge: Gauge,
|
change_request_gauge: Gauge,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,12 +115,18 @@ impl Default for PidLoop {
|
||||||
"Derivative component of requested change to charge rate"
|
"Derivative component of requested change to charge rate"
|
||||||
);
|
);
|
||||||
let derivative_gauge = gauge!("tcrc_derivative");
|
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");
|
describe_gauge!("tcrc_change_request", "Requested change to charge rate");
|
||||||
let change_request_gauge = gauge!("tcrc_change_request");
|
let change_request_gauge = gauge!("tcrc_change_request");
|
||||||
Self {
|
Self {
|
||||||
previous_error: 0.,
|
previous_error: 0.,
|
||||||
proportional_gauge,
|
proportional_gauge,
|
||||||
derivative_gauge,
|
derivative_gauge,
|
||||||
|
load_gauge,
|
||||||
change_request_gauge,
|
change_request_gauge,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,16 +146,14 @@ impl PidLoop {
|
||||||
let proportional_component = config.pid_controls.proportional_gain * error;
|
let proportional_component = config.pid_controls.proportional_gain * error;
|
||||||
let derivative_component = config.pid_controls.derivative_gain * derivative;
|
let derivative_component = config.pid_controls.derivative_gain * derivative;
|
||||||
|
|
||||||
let extra_offsets = if pl_state.internal_load_current > 1. {
|
let extra_offsets =
|
||||||
1.
|
(pl_state.internal_load_current / config.pid_controls.load_divisor).clamp(0., 2.);
|
||||||
} else {
|
|
||||||
0.
|
|
||||||
};
|
|
||||||
|
|
||||||
let offset = proportional_component + derivative_component + extra_offsets;
|
let offset = proportional_component + derivative_component + extra_offsets;
|
||||||
|
|
||||||
self.proportional_gauge.set(proportional_component);
|
self.proportional_gauge.set(proportional_component);
|
||||||
self.derivative_gauge.set(derivative_component);
|
self.derivative_gauge.set(derivative_component);
|
||||||
|
self.load_gauge.set(extra_offsets);
|
||||||
self.change_request_gauge.set(offset);
|
self.change_request_gauge.set(offset);
|
||||||
|
|
||||||
let new_target = offset + (charge_state.charge_amps as f64);
|
let new_target = offset + (charge_state.charge_amps as f64);
|
||||||
|
|
|
@ -20,8 +20,8 @@
|
||||||
<input type="number" id="derivative-gain" step="0.1" autocomplete="off" />
|
<input type="number" id="derivative-gain" step="0.1" autocomplete="off" />
|
||||||
<button id="set-derivative" onclick="set_derivative()">Set derivative gain</button>
|
<button id="set-derivative" onclick="set_derivative()">Set derivative gain</button>
|
||||||
<br><br>
|
<br><br>
|
||||||
<input type="number" id="pid-length" step="1" autocomplete="off" />
|
<input type="number" id="load-divisor" step="1" max="50" min="1" autocomplete="off" />
|
||||||
<button id="set-pid-length" onclick="set_pid_length()">Set pid length</button>
|
<button id="set-load-divisor" onclick="set_load_divisor()">Set load current divisor</button>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a class="outlink" href="/">←Home</a>
|
<a class="outlink" href="/">←Home</a>
|
||||||
|
|
|
@ -138,13 +138,13 @@ function set_derivative() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function set_pid_length() {
|
function set_load_divisor() {
|
||||||
var set_button = document.getElementById("set-pid-length");
|
var set_button = document.getElementById("set-load-divisor");
|
||||||
var number_input = document.getElementById("pid-length");
|
var number_input = document.getElementById("load-divisor");
|
||||||
if (!isNaN(number_input.value)) {
|
if (!isNaN(number_input.value)) {
|
||||||
set_button.disabled = true;
|
set_button.disabled = true;
|
||||||
number_input.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) => {
|
.then(async (response) => {
|
||||||
let delayres = await delay(100);
|
let delayres = await delay(100);
|
||||||
refresh_gains();
|
refresh_gains();
|
||||||
|
@ -235,11 +235,11 @@ function update_gains(data) {
|
||||||
derivative_set_button.disabled = false;
|
derivative_set_button.disabled = false;
|
||||||
derivative_number_input.disabled = false;
|
derivative_number_input.disabled = false;
|
||||||
derivative_number_input.value = data.derivative_gain;
|
derivative_number_input.value = data.derivative_gain;
|
||||||
var pid_length_button = document.getElementById("set-pid-length");
|
var load_divisor_button = document.getElementById("set-load-divisor");
|
||||||
var pid_length_input = document.getElementById("pid-length");
|
var load_divisor_input = document.getElementById("load-divisor");
|
||||||
pid_length_button.disabled = false;
|
load_divisor_button.disabled = false;
|
||||||
pid_length_input.disabled = false;
|
load_divisor_input.disabled = false;
|
||||||
pid_length_input.value = data.loop_time_seconds;
|
load_divisor_input.value = data.load_divisor;
|
||||||
}
|
}
|
||||||
|
|
||||||
function refresh_buttons() {
|
function refresh_buttons() {
|
||||||
|
|
Loading…
Reference in a new issue