mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-05 19:42:08 +02:00
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:
parent
641356622e
commit
8ecea1c309
3 changed files with 75 additions and 5 deletions
|
@ -339,13 +339,48 @@ void update_calculated_values() {
|
||||||
/* Restrict values from user settings if needed*/
|
/* Restrict values from user settings if needed*/
|
||||||
if (datalayer.battery.status.max_charge_current_dA > datalayer.battery.settings.max_user_set_charge_dA) {
|
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.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) {
|
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.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*/
|
/* Calculate active power based on voltage and current*/
|
||||||
datalayer.battery.status.active_power_W =
|
datalayer.battery.status.active_power_W =
|
||||||
(datalayer.battery.status.current_dA * (datalayer.battery.status.voltage_dV / 100));
|
(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
|
#ifdef DOUBLE_BATTERY
|
||||||
/* Calculate active power based on voltage and current for battery 2*/
|
/* Calculate active power based on voltage and current for battery 2*/
|
||||||
|
|
|
@ -124,6 +124,12 @@ typedef struct {
|
||||||
/** The user specified maximum allowed discharge voltage, in deciVolt. 3000 = 300.0 V */
|
/** 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;
|
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 */
|
/** 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 for specifying if user has requested manual function */
|
||||||
bool user_requests_balancing = false;
|
bool user_requests_balancing = false;
|
||||||
|
|
|
@ -887,8 +887,18 @@ String processor(const String& var) {
|
||||||
} else {
|
} else {
|
||||||
content += formatPowerValue("Max discharge power", datalayer.battery.status.max_discharge_power_W, "", 1);
|
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 += 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 discharge current: " + String(maxCurrentDischargeFloat, 1) + " A";
|
||||||
content += "<h4 style='color: white;'>Max charge current: " + String(maxCurrentChargeFloat, 1) + " A</h4>";
|
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>";
|
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) {
|
if (datalayer.battery.status.current_dA == 0) {
|
||||||
content += "<h4>Battery idle</h4>";
|
content += "<h4>Battery idle</h4>";
|
||||||
} else if (datalayer.battery.status.current_dA < 0) {
|
} else if (datalayer.battery.status.current_dA < 0) {
|
||||||
content += "<h4>Battery discharging!</h4>";
|
content += "<h4>Battery discharging!";
|
||||||
} else { // > 0
|
if (datalayer.battery.settings.inverter_limits_discharge) {
|
||||||
content += "<h4>Battery charging!</h4>";
|
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>";
|
content += "<h4>Automatic contactor closing allowed:</h4>";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue