Feature: Add charging/discharging limiting reason to Webserver (#874)

* Add limiting reason to Webserver

* Add info if settings limit charge/discharge power
This commit is contained in:
Daniel Öster 2025-02-13 22:06:18 +03:00 committed by GitHub
parent 641356622e
commit 8ecea1c309
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 75 additions and 5 deletions

View file

@ -339,13 +339,48 @@ void update_calculated_values() {
/* Restrict values from user settings if needed*/
if (datalayer.battery.status.max_charge_current_dA > datalayer.battery.settings.max_user_set_charge_dA) {
datalayer.battery.status.max_charge_current_dA = datalayer.battery.settings.max_user_set_charge_dA;
datalayer.battery.settings.user_settings_limit_charge = true;
} else {
datalayer.battery.settings.user_settings_limit_charge = false;
}
if (datalayer.battery.status.max_discharge_current_dA > datalayer.battery.settings.max_user_set_discharge_dA) {
datalayer.battery.status.max_discharge_current_dA = datalayer.battery.settings.max_user_set_discharge_dA;
datalayer.battery.settings.user_settings_limit_discharge = true;
} else {
datalayer.battery.settings.user_settings_limit_discharge = false;
}
/* Calculate active power based on voltage and current*/
datalayer.battery.status.active_power_W =
(datalayer.battery.status.current_dA * (datalayer.battery.status.voltage_dV / 100));
/* Calculate if battery or inverter is limiting factor*/
if (datalayer.battery.status.current_dA == 0) { //Battery idle
if (datalayer.battery.status.max_discharge_current_dA > 0) {
//We allow discharge, but inverter does nothing. Inverter is limiting
datalayer.battery.settings.inverter_limits_discharge = true;
} else {
datalayer.battery.settings.inverter_limits_discharge = false;
}
if (datalayer.battery.status.max_charge_current_dA > 0) {
//We allow charge, but inverter does nothing. Inverter is limiting
datalayer.battery.settings.inverter_limits_charge = true;
} else {
datalayer.battery.settings.inverter_limits_charge = false;
}
} else if (datalayer.battery.status.current_dA < 0) { //Battery discharging
if (-datalayer.battery.status.current_dA < datalayer.battery.status.max_discharge_current_dA) {
datalayer.battery.settings.inverter_limits_discharge = true;
} else {
datalayer.battery.settings.inverter_limits_discharge = false;
}
} else { // > 0 Battery charging
//If actual current is smaller than max we allow, inverter is limiting factor
if (datalayer.battery.status.current_dA < datalayer.battery.status.max_charge_current_dA) {
datalayer.battery.settings.inverter_limits_charge = true;
} else {
datalayer.battery.settings.inverter_limits_charge = false;
}
}
#ifdef DOUBLE_BATTERY
/* Calculate active power based on voltage and current for battery 2*/

View file

@ -124,6 +124,12 @@ typedef struct {
/** The user specified maximum allowed discharge voltage, in deciVolt. 3000 = 300.0 V */
uint16_t max_user_set_discharge_voltage_dV = BATTERY_MAX_DISCHARGE_VOLTAGE;
/** Parameters for keeping track of the limiting factor in the system */
bool user_settings_limit_discharge = false;
bool user_settings_limit_charge = false;
bool inverter_limits_discharge = false;
bool inverter_limits_charge = false;
/** Tesla specific settings that are edited on the fly when manually forcing a balance charge for LFP chemistry */
/* Bool for specifying if user has requested manual function */
bool user_requests_balancing = false;

View file

@ -887,8 +887,18 @@ String processor(const String& var) {
} else {
content += formatPowerValue("Max discharge power", datalayer.battery.status.max_discharge_power_W, "", 1);
content += formatPowerValue("Max charge power", datalayer.battery.status.max_charge_power_W, "", 1);
content += "<h4 style='color: white;'>Max discharge current: " + String(maxCurrentDischargeFloat, 1) + " A</h4>";
content += "<h4 style='color: white;'>Max charge current: " + String(maxCurrentChargeFloat, 1) + " A</h4>";
content += "<h4 style='color: white;'>Max discharge current: " + String(maxCurrentDischargeFloat, 1) + " A";
if (datalayer.battery.settings.user_settings_limit_discharge) {
content += " (Manual)</h4>";
} else {
content += " (BMS)</h4>";
}
content += "<h4 style='color: white;'>Max charge current: " + String(maxCurrentChargeFloat, 1) + " A";
if (datalayer.battery.settings.user_settings_limit_charge) {
content += " (Manual)</h4>";
} else {
content += " (BMS)</h4>";
}
}
content += "<h4>Cell max: " + String(datalayer.battery.status.cell_max_voltage_mV) + " mV</h4>";
@ -949,9 +959,28 @@ String processor(const String& var) {
if (datalayer.battery.status.current_dA == 0) {
content += "<h4>Battery idle</h4>";
} else if (datalayer.battery.status.current_dA < 0) {
content += "<h4>Battery discharging!</h4>";
} else { // > 0
content += "<h4>Battery charging!</h4>";
content += "<h4>Battery discharging!";
if (datalayer.battery.settings.inverter_limits_discharge) {
content += " (Inverter limiting)</h4>";
} else {
if (datalayer.battery.settings.user_settings_limit_discharge) {
content += " (Settings limiting)</h4>";
} else {
content += " (Battery limiting)</h4>";
}
}
content += "</h4>";
} else { // > 0 , positive current
content += "<h4>Battery charging!";
if (datalayer.battery.settings.inverter_limits_charge) {
content += " (Inverter limiting)</h4>";
} else {
if (datalayer.battery.settings.user_settings_limit_charge) {
content += " (Settings limiting)</h4>";
} else {
content += " (Battery limiting)</h4>";
}
}
}
content += "<h4>Automatic contactor closing allowed:</h4>";