mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-04 18:29:48 +02:00
Make discharge limits under settings datalayer
This commit is contained in:
parent
91f3c8caf9
commit
c3e67d2f62
5 changed files with 19 additions and 19 deletions
|
@ -401,11 +401,11 @@ void init_stored_settings() {
|
||||||
}
|
}
|
||||||
temp = settings.getUInt("MAXCHARGEAMP", false);
|
temp = settings.getUInt("MAXCHARGEAMP", false);
|
||||||
if (temp != 0) {
|
if (temp != 0) {
|
||||||
datalayer.battery.info.max_charge_amp_dA = temp;
|
datalayer.battery.settings.max_user_set_charge_dA = temp;
|
||||||
}
|
}
|
||||||
temp = settings.getUInt("MAXDISCHARGEAMP", false);
|
temp = settings.getUInt("MAXDISCHARGEAMP", false);
|
||||||
if (temp != 0) {
|
if (temp != 0) {
|
||||||
datalayer.battery.info.max_discharge_amp_dA = temp;
|
datalayer.battery.settings.max_user_set_discharge_dA = temp;
|
||||||
temp = settings.getBool("USE_SCALED_SOC", false);
|
temp = settings.getBool("USE_SCALED_SOC", false);
|
||||||
datalayer.battery.settings.soc_scaling_active = temp; //This bool needs to be checked inside the temp!= block
|
datalayer.battery.settings.soc_scaling_active = temp; //This bool needs to be checked inside the temp!= block
|
||||||
} // No way to know if it wasnt reset otherwise
|
} // No way to know if it wasnt reset otherwise
|
||||||
|
@ -847,11 +847,11 @@ void update_calculated_values() {
|
||||||
((datalayer.battery.status.max_discharge_power_W * 100) / datalayer.battery.status.voltage_dV);
|
((datalayer.battery.status.max_discharge_power_W * 100) / datalayer.battery.status.voltage_dV);
|
||||||
}
|
}
|
||||||
/* Restrict values from user settings if needed*/
|
/* Restrict values from user settings if needed*/
|
||||||
if (datalayer.battery.status.max_charge_current_dA > datalayer.battery.info.max_charge_amp_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.info.max_charge_amp_dA;
|
datalayer.battery.status.max_charge_current_dA = datalayer.battery.settings.max_user_set_charge_dA;
|
||||||
}
|
}
|
||||||
if (datalayer.battery.status.max_discharge_current_dA > datalayer.battery.info.max_discharge_amp_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.info.max_discharge_amp_dA;
|
datalayer.battery.status.max_discharge_current_dA = datalayer.battery.settings.max_user_set_discharge_dA;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (datalayer.battery.settings.soc_scaling_active) {
|
if (datalayer.battery.settings.soc_scaling_active) {
|
||||||
|
@ -991,8 +991,8 @@ void storeSettings() {
|
||||||
datalayer.battery.settings.max_percentage / 10); // Divide by 10 for backwards compatibility
|
datalayer.battery.settings.max_percentage / 10); // Divide by 10 for backwards compatibility
|
||||||
settings.putUInt("MINPERCENTAGE",
|
settings.putUInt("MINPERCENTAGE",
|
||||||
datalayer.battery.settings.min_percentage / 10); // Divide by 10 for backwards compatibility
|
datalayer.battery.settings.min_percentage / 10); // Divide by 10 for backwards compatibility
|
||||||
settings.putUInt("MAXCHARGEAMP", datalayer.battery.info.max_charge_amp_dA);
|
settings.putUInt("MAXCHARGEAMP", datalayer.battery.settings.max_user_set_charge_dA);
|
||||||
settings.putUInt("MAXDISCHARGEAMP", datalayer.battery.info.max_discharge_amp_dA);
|
settings.putUInt("MAXDISCHARGEAMP", datalayer.battery.settings.max_user_set_discharge_dA);
|
||||||
settings.putBool("USE_SCALED_SOC", datalayer.battery.settings.soc_scaling_active);
|
settings.putBool("USE_SCALED_SOC", datalayer.battery.settings.soc_scaling_active);
|
||||||
settings.end();
|
settings.end();
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,10 +19,6 @@ typedef struct {
|
||||||
uint16_t min_cell_voltage_mV = 2700;
|
uint16_t min_cell_voltage_mV = 2700;
|
||||||
/** The maxumum allowed deviation between cells, in milliVolt. 500 = 0.500 V */
|
/** The maxumum allowed deviation between cells, in milliVolt. 500 = 0.500 V */
|
||||||
uint16_t max_cell_voltage_deviation_mV = 500;
|
uint16_t max_cell_voltage_deviation_mV = 500;
|
||||||
/** The user specified maximum allowed charge rate, in deciAmpere. 300 = 30.0 A */
|
|
||||||
uint16_t max_user_set_charge_dA = BATTERY_MAX_CHARGE_AMP;
|
|
||||||
/** The user specified maximum allowed discharge rate, in deciAmpere. 300 = 30.0 A */
|
|
||||||
uint16_t max_user_set_discharge_dA = BATTERY_MAX_DISCHARGE_AMP;
|
|
||||||
|
|
||||||
/** uint8_t */
|
/** uint8_t */
|
||||||
/** Total number of cells in the pack */
|
/** Total number of cells in the pack */
|
||||||
|
@ -111,6 +107,10 @@ typedef struct {
|
||||||
* you want the inverter to be able to use. At this real SOC, the inverter
|
* you want the inverter to be able to use. At this real SOC, the inverter
|
||||||
* will "see" 100% */
|
* will "see" 100% */
|
||||||
uint16_t max_percentage = BATTERY_MAXPERCENTAGE;
|
uint16_t max_percentage = BATTERY_MAXPERCENTAGE;
|
||||||
|
/** The user specified maximum allowed charge rate, in deciAmpere. 300 = 30.0 A */
|
||||||
|
uint16_t max_user_set_charge_dA = BATTERY_MAX_CHARGE_AMP;
|
||||||
|
/** The user specified maximum allowed discharge rate, in deciAmpere. 300 = 30.0 A */
|
||||||
|
uint16_t max_user_set_discharge_dA = BATTERY_MAX_DISCHARGE_AMP;
|
||||||
} DATALAYER_BATTERY_SETTINGS_TYPE;
|
} DATALAYER_BATTERY_SETTINGS_TYPE;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -58,10 +58,10 @@ String settings_processor(const String& var) {
|
||||||
";'>SOC min percentage: " + String(datalayer.battery.settings.min_percentage / 100.0, 1) +
|
";'>SOC min percentage: " + String(datalayer.battery.settings.min_percentage / 100.0, 1) +
|
||||||
" </span> <button onclick='editSocMin()'>Edit</button></h4>";
|
" </span> <button onclick='editSocMin()'>Edit</button></h4>";
|
||||||
content += "<h4 style='color: white;'>Max charge speed: " +
|
content += "<h4 style='color: white;'>Max charge speed: " +
|
||||||
String(datalayer.battery.info.max_user_set_charge_dA / 10.0, 1) +
|
String(datalayer.battery.settings.max_user_set_charge_dA / 10.0, 1) +
|
||||||
" A </span> <button onclick='editMaxChargeA()'>Edit</button></h4>";
|
" A </span> <button onclick='editMaxChargeA()'>Edit</button></h4>";
|
||||||
content += "<h4 style='color: white;'>Max discharge speed: " +
|
content += "<h4 style='color: white;'>Max discharge speed: " +
|
||||||
String(datalayer.battery.info.max_user_set_discharge_dA / 10.0, 1) +
|
String(datalayer.battery.settings.max_user_set_discharge_dA / 10.0, 1) +
|
||||||
" A </span> <button onclick='editMaxDischargeA()'>Edit</button></h4>";
|
" A </span> <button onclick='editMaxDischargeA()'>Edit</button></h4>";
|
||||||
// Close the block
|
// Close the block
|
||||||
content += "</div>";
|
content += "</div>";
|
||||||
|
|
|
@ -209,7 +209,7 @@ void init_webserver() {
|
||||||
return request->requestAuthentication();
|
return request->requestAuthentication();
|
||||||
if (request->hasParam("value")) {
|
if (request->hasParam("value")) {
|
||||||
String value = request->getParam("value")->value();
|
String value = request->getParam("value")->value();
|
||||||
datalayer.battery.info.max_user_set_charge_dA = static_cast<uint16_t>(value.toFloat() * 10);
|
datalayer.battery.settings.max_user_set_charge_dA = static_cast<uint16_t>(value.toFloat() * 10);
|
||||||
storeSettings();
|
storeSettings();
|
||||||
request->send(200, "text/plain", "Updated successfully");
|
request->send(200, "text/plain", "Updated successfully");
|
||||||
} else {
|
} else {
|
||||||
|
@ -223,7 +223,7 @@ void init_webserver() {
|
||||||
return request->requestAuthentication();
|
return request->requestAuthentication();
|
||||||
if (request->hasParam("value")) {
|
if (request->hasParam("value")) {
|
||||||
String value = request->getParam("value")->value();
|
String value = request->getParam("value")->value();
|
||||||
datalayer.battery.info.max_user_set_discharge_dA = static_cast<uint16_t>(value.toFloat() * 10);
|
datalayer.battery.settings.max_user_set_discharge_dA = static_cast<uint16_t>(value.toFloat() * 10);
|
||||||
storeSettings();
|
storeSettings();
|
||||||
request->send(200, "text/plain", "Updated successfully");
|
request->send(200, "text/plain", "Updated successfully");
|
||||||
} else {
|
} else {
|
||||||
|
@ -285,7 +285,7 @@ void init_webserver() {
|
||||||
String value = request->getParam("value")->value();
|
String value = request->getParam("value")->value();
|
||||||
float val = value.toFloat();
|
float val = value.toFloat();
|
||||||
|
|
||||||
if (!(val <= datalayer.battery.info.max_user_set_charge_dA && val <= CHARGER_MAX_A)) {
|
if (!(val <= datalayer.battery.settings.max_user_set_charge_dA && val <= CHARGER_MAX_A)) {
|
||||||
request->send(400, "text/plain", "Bad Request");
|
request->send(400, "text/plain", "Bad Request");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,13 +65,13 @@ void handle_update_data_modbusp301_byd() {
|
||||||
}
|
}
|
||||||
// Convert max discharge Amp value to max Watt
|
// Convert max discharge Amp value to max Watt
|
||||||
user_configured_max_discharge_W =
|
user_configured_max_discharge_W =
|
||||||
((datalayer.battery.info.max_user_set_discharge_dA * datalayer.battery.info.max_design_voltage_dV) / 100);
|
((datalayer.battery.settings.max_user_set_discharge_dA * datalayer.battery.info.max_design_voltage_dV) / 100);
|
||||||
// Use the smaller value, battery reported value OR user configured value
|
// Use the smaller value, battery reported value OR user configured value
|
||||||
max_discharge_W = std::min(datalayer.battery.status.max_discharge_power_W, user_configured_max_discharge_W);
|
max_discharge_W = std::min(datalayer.battery.status.max_discharge_power_W, user_configured_max_discharge_W);
|
||||||
|
|
||||||
// Convert max charge Amp value to max Watt
|
// Convert max charge Amp value to max Watt
|
||||||
user_configured_max_charge_W =
|
user_configured_max_charge_W =
|
||||||
((datalayer.battery.info.max_user_set_charge_dA * datalayer.battery.info.max_design_voltage_dV) / 100);
|
((datalayer.battery.settings.max_user_set_charge_dA * datalayer.battery.info.max_design_voltage_dV) / 100);
|
||||||
// Use the smaller value, battery reported value OR user configured value
|
// Use the smaller value, battery reported value OR user configured value
|
||||||
max_charge_W = std::min(datalayer.battery.status.max_charge_power_W, user_configured_max_charge_W);
|
max_charge_W = std::min(datalayer.battery.status.max_charge_power_W, user_configured_max_charge_W);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue