mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-03 17:59:27 +02:00
Fake Battery and Web Server Adjustments
This commit is contained in:
parent
56fb9616b7
commit
f68539e9e2
3 changed files with 58 additions and 10 deletions
|
@ -860,6 +860,8 @@ void update_scaled_values() {
|
|||
* Before we use real_soc, we must make sure that it's within the range of min_percentage and max_percentage.
|
||||
*/
|
||||
uint32_t calc_soc;
|
||||
uint32_t calc_max_capacity;
|
||||
uint32_t calc_reserved_capacity;
|
||||
// Make sure that the SOC starts out between min and max percentages
|
||||
calc_soc = CONSTRAIN(datalayer.battery.status.real_soc, datalayer.battery.settings.min_percentage,
|
||||
datalayer.battery.settings.max_percentage);
|
||||
|
@ -870,8 +872,6 @@ void update_scaled_values() {
|
|||
|
||||
// Calculate the scaled remaining capacity in Wh
|
||||
if (datalayer.battery.info.total_capacity_Wh > 0 && datalayer.battery.status.real_soc > 0) {
|
||||
uint32_t calc_max_capacity;
|
||||
uint32_t calc_reserved_capacity;
|
||||
calc_max_capacity = (datalayer.battery.status.remaining_capacity_Wh * 10000 / datalayer.battery.status.real_soc);
|
||||
calc_reserved_capacity = calc_max_capacity * datalayer.battery.settings.min_percentage / 10000;
|
||||
// remove % capacity reserved in min_percentage to total_capacity_Wh
|
||||
|
@ -881,9 +881,28 @@ void update_scaled_values() {
|
|||
datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh;
|
||||
}
|
||||
|
||||
#ifdef DOUBLE_BATTERY
|
||||
|
||||
// Calculate the scaled remaining capacity in Wh
|
||||
if (datalayer.battery2.info.total_capacity_Wh > 0 && datalayer.battery2.status.real_soc > 0) {
|
||||
calc_max_capacity =
|
||||
(datalayer.battery2.status.remaining_capacity_Wh * 10000 / datalayer.battery2.status.real_soc);
|
||||
calc_reserved_capacity = calc_max_capacity * datalayer.battery2.settings.min_percentage / 10000;
|
||||
// remove % capacity reserved in min_percentage to total_capacity_Wh
|
||||
datalayer.battery2.status.reported_remaining_capacity_Wh =
|
||||
datalayer.battery2.status.remaining_capacity_Wh - calc_reserved_capacity;
|
||||
} else {
|
||||
datalayer.battery2.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh;
|
||||
}
|
||||
#endif
|
||||
|
||||
} else { // No SOC window wanted. Set scaled to same as real.
|
||||
datalayer.battery.status.reported_soc = datalayer.battery.status.real_soc;
|
||||
datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh;
|
||||
#ifdef DOUBLE_BATTERY
|
||||
datalayer.battery2.status.reported_soc = datalayer.battery2.status.real_soc;
|
||||
datalayer.battery2.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh;
|
||||
#endif
|
||||
}
|
||||
#ifdef DOUBLE_BATTERY
|
||||
// Perform extra SOC sanity checks on double battery setups
|
||||
|
|
|
@ -22,6 +22,8 @@ void print_units(char* header, int value, char* units) {
|
|||
|
||||
void update_values_battery() { /* This function puts fake values onto the parameters sent towards the inverter */
|
||||
|
||||
datalayer.battery.info.number_of_cells = 96;
|
||||
|
||||
datalayer.battery.status.real_soc = 5000; // 50.00%
|
||||
|
||||
datalayer.battery.status.soh_pptt = 9900; // 99.00%
|
||||
|
@ -49,7 +51,7 @@ void update_values_battery() { /* This function puts fake values onto the parame
|
|||
datalayer.battery.status.max_charge_power_W = 5000; // 5kW
|
||||
|
||||
for (int i = 0; i < 97; ++i) {
|
||||
datalayer.battery.status.cell_voltages_mV[i] = 3500 + i;
|
||||
datalayer.battery.status.cell_voltages_mV[i] = 3700 + random(-20, 21);
|
||||
}
|
||||
|
||||
//Fake that we get CAN messages
|
||||
|
@ -75,6 +77,8 @@ void update_values_battery() { /* This function puts fake values onto the parame
|
|||
|
||||
void update_values_battery2() { // Handle the values coming in from battery #2
|
||||
|
||||
datalayer.battery2.info.number_of_cells = 96;
|
||||
|
||||
datalayer.battery2.status.real_soc = 5000; // 50.00%
|
||||
|
||||
datalayer.battery2.status.soh_pptt = 9900; // 99.00%
|
||||
|
@ -102,7 +106,7 @@ void update_values_battery2() { // Handle the values coming in from battery #2
|
|||
datalayer.battery2.status.max_charge_power_W = 5000; // 5kW
|
||||
|
||||
for (int i = 0; i < 97; ++i) {
|
||||
datalayer.battery2.status.cell_voltages_mV[i] = 3500 + i;
|
||||
datalayer.battery2.status.cell_voltages_mV[i] = 3700 + random(-20, 21);
|
||||
}
|
||||
|
||||
//Fake that we get CAN messages
|
||||
|
@ -167,6 +171,8 @@ void send_can_battery() {
|
|||
}
|
||||
|
||||
void setup_battery(void) { // Performs one time setup at startup
|
||||
randomSeed(analogRead(0));
|
||||
|
||||
#ifdef DEBUG_VIA_USB
|
||||
Serial.println("Test mode with fake battery selected");
|
||||
#endif
|
||||
|
|
|
@ -785,7 +785,9 @@ String processor(const String& var) {
|
|||
content += "<h4 style='color: white;'>Current: " + String(currentFloat, 1) + " A</h4>";
|
||||
content += formatPowerValue("Power", powerFloat, "", 1);
|
||||
content += formatPowerValue("Total capacity", datalayer.battery2.info.total_capacity_Wh, "h", 0);
|
||||
content += formatPowerValue("Remaining capacity", datalayer.battery2.status.remaining_capacity_Wh, "h", 1);
|
||||
content += formatPowerValue("Real Remaining capacity", datalayer.battery2.status.remaining_capacity_Wh, "h", 1);
|
||||
content +=
|
||||
formatPowerValue("Scaled Remaining capacity", datalayer.battery2.status.reported_remaining_capacity_Wh, "h", 1);
|
||||
content += formatPowerValue("Max discharge power", datalayer.battery2.status.max_discharge_power_W, "", 1);
|
||||
content += formatPowerValue("Max charge power", datalayer.battery2.status.max_charge_power_W, "", 1);
|
||||
content += "<h4>Cell max: " + String(datalayer.battery2.status.cell_max_voltage_mV) + " mV</h4>";
|
||||
|
@ -827,6 +829,11 @@ String processor(const String& var) {
|
|||
content += "<span style='color: red;'>✕</span></h4>";
|
||||
}
|
||||
|
||||
if (emulator_pause_status == NORMAL)
|
||||
content += "<h4>Power status: " + String(get_emulator_pause_status().c_str()) + " </h4>";
|
||||
else
|
||||
content += "<h4 style='color: red;'>Power status: " + String(get_emulator_pause_status().c_str()) + " </h4>";
|
||||
|
||||
#ifdef CONTACTOR_CONTROL
|
||||
content += "<h4>Contactors controlled by Battery-Emulator: ";
|
||||
if (datalayer.system.status.contactor_control_closed) {
|
||||
|
@ -835,12 +842,28 @@ String processor(const String& var) {
|
|||
content += "<span style='color: red;'>OFF</span>";
|
||||
}
|
||||
content += "</h4>";
|
||||
#endif
|
||||
|
||||
if (emulator_pause_status == NORMAL)
|
||||
content += "<h4>Pause status: " + String(get_emulator_pause_status().c_str()) + " </h4>";
|
||||
else
|
||||
content += "<h4 style='color: red;'>Pause status: " + String(get_emulator_pause_status().c_str()) + " </h4>";
|
||||
content += "<h4>Pre Charge: ";
|
||||
if (digitalRead(PRECHARGE_PIN) == HIGH) {
|
||||
content += "<span style='color: green;'>✓</span>";
|
||||
} else {
|
||||
content += "<span style='color: red;'>✕</span>";
|
||||
}
|
||||
content += " Cont. Neg.: ";
|
||||
if (digitalRead(NEGATIVE_CONTACTOR_PIN) == HIGH) {
|
||||
content += "<span style='color: green;'>✓</span>";
|
||||
} else {
|
||||
content += "<span style='color: red;'>✕</span>";
|
||||
}
|
||||
|
||||
content += " Cont. Pos.: ";
|
||||
if (digitalRead(POSITIVE_CONTACTOR_PIN) == HIGH) {
|
||||
content += "<span style='color: green;'>✓</span>";
|
||||
} else {
|
||||
content += "<span style='color: red;'>✕</span>";
|
||||
}
|
||||
content += "</h4>";
|
||||
#endif
|
||||
|
||||
content += "</div>";
|
||||
content += "</div>";
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue