#include "../../datalayer/datalayer.h"
#include "../../datalayer/datalayer_extended.h"
String advanced_battery_processor(const String& var) {
if (var == "X") {
String content = "";
//Page format
content += "";
content += "Back to main page ";
// Start a new block with a specific background color
content += "";
#ifdef BOLT_AMPERA_BATTERY
content += "
5V Reference: " + String(datalayer_extended.boltampera.battery_5V_ref) + " ";
content += "Module 1 temp: " + String(datalayer_extended.boltampera.battery_module_temp_1) + " ";
content += "Module 2 temp: " + String(datalayer_extended.boltampera.battery_module_temp_2) + " ";
content += "Module 3 temp: " + String(datalayer_extended.boltampera.battery_module_temp_3) + " ";
content += "Module 4 temp: " + String(datalayer_extended.boltampera.battery_module_temp_4) + " ";
content += "Module 5 temp: " + String(datalayer_extended.boltampera.battery_module_temp_5) + " ";
content += "Module 6 temp: " + String(datalayer_extended.boltampera.battery_module_temp_6) + " ";
content +=
"Cell average voltage: " + String(datalayer_extended.boltampera.battery_cell_average_voltage) + " ";
content +=
"Cell average voltage 2: " + String(datalayer_extended.boltampera.battery_cell_average_voltage_2) + " ";
content += "Terminal voltage: " + String(datalayer_extended.boltampera.battery_terminal_voltage) + " ";
content +=
"Ignition power mode: " + String(datalayer_extended.boltampera.battery_ignition_power_mode) + " ";
content += "Battery current (7E7): " + String(datalayer_extended.boltampera.battery_current_7E7) + " ";
content += "Capacity MY17-18: " + String(datalayer_extended.boltampera.battery_capacity_my17_18) + " ";
content += "Capacity MY19+: " + String(datalayer_extended.boltampera.battery_capacity_my19plus) + " ";
content += "SOC Display: " + String(datalayer_extended.boltampera.battery_SOC_display) + " ";
content += "SOC Raw highprec: " + String(datalayer_extended.boltampera.battery_SOC_raw_highprec) + " ";
content += "Max temp: " + String(datalayer_extended.boltampera.battery_max_temperature) + " ";
content += "Min temp: " + String(datalayer_extended.boltampera.battery_min_temperature) + " ";
content += "Cell max mV: " + String(datalayer_extended.boltampera.battery_max_cell_voltage) + " ";
content += "Cell min mV: " + String(datalayer_extended.boltampera.battery_min_cell_voltage) + " ";
content += "Lowest cell: " + String(datalayer_extended.boltampera.battery_lowest_cell) + " ";
content += "Highest cell: " + String(datalayer_extended.boltampera.battery_highest_cell) + " ";
content +=
"Internal resistance: " + String(datalayer_extended.boltampera.battery_internal_resistance) + " ";
content += "Voltage: " + String(datalayer_extended.boltampera.battery_voltage_polled) + " ";
content += "Isolation Ohm: " + String(datalayer_extended.boltampera.battery_vehicle_isolation) + " ";
content += "Isolation kOhm: " + String(datalayer_extended.boltampera.battery_isolation_kohm) + " ";
content += "HV locked: " + String(datalayer_extended.boltampera.battery_HV_locked) + " ";
content += "Crash event: " + String(datalayer_extended.boltampera.battery_crash_event) + " ";
content += "HVIL: " + String(datalayer_extended.boltampera.battery_HVIL) + " ";
content += "HVIL status: " + String(datalayer_extended.boltampera.battery_HVIL_status) + " ";
content += "Current (7E4): " + String(datalayer_extended.boltampera.battery_current_7E4) + " ";
#endif //BOLT_AMPERA_BATTERY
#ifdef BMW_IX_BATTERY
content +=
"Battery Voltage after Contactor: " + String(datalayer_extended.bmwix.battery_voltage_after_contactor) +
" dV ";
content += "Max Design Voltage: " + String(datalayer.battery.info.max_design_voltage_dV) + " dV ";
content += "Min Design Voltage: " + String(datalayer.battery.info.min_design_voltage_dV) + " dV ";
content += "Max Cell Design Voltage: " + String(datalayer.battery.info.max_cell_voltage_mV) + " mV ";
content += "Min Cell Design Voltage: " + String(datalayer.battery.info.min_cell_voltage_mV) + " mV ";
content +=
"Min Cell Voltage Data Age: " + String(datalayer_extended.bmwix.min_cell_voltage_data_age) + " ms ";
content +=
"Max Cell Voltage Data Age: " + String(datalayer_extended.bmwix.max_cell_voltage_data_age) + " ms ";
content += "Allowed Discharge Power: " + String(datalayer.battery.status.max_discharge_power_W) + " W ";
content += "Allowed Charge Power: " + String(datalayer.battery.status.max_charge_power_W) + " W ";
content += "T30 Terminal Voltage: " + String(datalayer_extended.bmwix.T30_Voltage) + " mV ";
content += "Detected Cell Count: " + String(datalayer.battery.info.number_of_cells) + " ";
static const char* balanceText[5] = {"0 No balancing mode active", "1 Voltage-Controlled Balancing Mode",
"2 Time-Controlled Balancing Mode with Demand Calculation at End of Charging",
"3 Time-Controlled Balancing Mode with Demand Calculation at Resting Voltage",
"4 No balancing mode active, qualifier invalid"};
content += "Balancing: " + String((balanceText[datalayer_extended.bmwix.balancing_status])) + " ";
static const char* hvilText[2] = {"Error (Loop Open)", "OK (Loop Closed)"};
content += "HVIL Status: " + String(hvilText[datalayer_extended.bmwix.hvil_status]) + " ";
content += "BMS Uptime: " + String(datalayer_extended.bmwix.bms_uptime) + " seconds ";
content += "BMS Allowed Charge Amps: " + String(datalayer_extended.bmwix.allowable_charge_amps) + " A ";
content +=
"BMS Allowed Disharge Amps: " + String(datalayer_extended.bmwix.allowable_discharge_amps) + " A ";
content += " ";
content += "HV Isolation (2147483647kOhm = maximum/invalid) ";
content += "Isolation Positive: " + String(datalayer_extended.bmwix.iso_safety_positive) + " kOhm ";
content += "Isolation Negative: " + String(datalayer_extended.bmwix.iso_safety_negative) + " kOhm ";
content += "Isolation Parallel: " + String(datalayer_extended.bmwix.iso_safety_parallel) + " kOhm ";
static const char* pyroText[5] = {"0 Value Invalid", "1 Successfully Blown", "2 Disconnected",
"3 Not Activated - Pyro Intact", "4 Unknown"};
content += "Pyro Status PSS1: " + String((pyroText[datalayer_extended.bmwix.pyro_status_pss1])) + " ";
content += "Pyro Status PSS4: " + String((pyroText[datalayer_extended.bmwix.pyro_status_pss4])) + " ";
content += "Pyro Status PSS6: " + String((pyroText[datalayer_extended.bmwix.pyro_status_pss6])) + " ";
#endif //BMW_IX_BATTERY
#ifdef BMW_PHEV_BATTERY
content +=
"Battery Voltage after Contactor: " + String(datalayer_extended.bmwphev.battery_voltage_after_contactor) +
" dV ";
content += "Allowed Discharge Power: " + String(datalayer.battery.status.max_discharge_power_W) + " W ";
content += "Allowed Charge Power: " + String(datalayer.battery.status.max_charge_power_W) + " W ";
static const char* balanceText[5] = {"0 Balancing Inactive - Balancing not needed", "1 Balancing Active",
"2 Balancing Inactive - Cells not in rest break wait 10mins",
"3 Balancing Inactive", "4 Unknown"};
content += "Balancing: " + String((balanceText[datalayer_extended.bmwphev.balancing_status])) + " ";
static const char* pyroText[5] = {"0 Value Invalid", "1 Successfully Blown", "2 Disconnected",
"3 Not Activated - Pyro Intact", "4 Unknown"};
static const char* statusText[16] = {
"Not evaluated", "OK", "Error!", "Invalid signal", "", "", "", "", "", "", "", "", "", "", "", ""};
content += "Interlock: " + String(statusText[datalayer_extended.bmwphev.ST_interlock]) + " ";
content += "Isolation external: " + String(statusText[datalayer_extended.bmwphev.ST_iso_ext]) + " ";
content += "Isolation internal: " + String(statusText[datalayer_extended.bmwphev.ST_iso_int]) + " ";
content += "Isolation: " + String(statusText[datalayer_extended.bmwphev.ST_isolation]) + " ";
content += "Cooling valve: " + String(statusText[datalayer_extended.bmwphev.ST_valve_cooling]) + " ";
content += "Emergency: " + String(statusText[datalayer_extended.bmwphev.ST_EMG]) + " ";
static const char* prechargeText[16] = {"Not evaluated",
"Not active, closing not blocked",
"Error precharge blocked",
"Invalid signal",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""};
content += "Precharge: " + String(prechargeText[datalayer_extended.bmwphev.ST_precharge]) +
" "; //Still unclear of enum
static const char* DCSWText[16] = {"Contactors open",
"Precharge ongoing",
"Contactors engaged",
"Invalid signal",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""};
content += "Contactor status: " + String(DCSWText[datalayer_extended.bmwphev.ST_DCSW]) + " ";
static const char* contText[16] = {"Contactors OK",
"One contactor welded!",
"Two contactors welded!",
"Invalid signal",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""};
content += "Contactor weld: " + String(contText[datalayer_extended.bmwphev.ST_WELD]) + " ";
static const char* valveText[16] = {"OK",
"Short circuit to GND",
"Short circuit to 12V",
"Line break",
"",
"",
"Driver error",
"",
"",
"",
"",
"",
"Stuck",
"Stuck",
"",
"Invalid Signal"};
content +=
"Cold shutoff valve: " + String(valveText[datalayer_extended.bmwphev.ST_cold_shutoff_valve]) + " ";
content +=
"Min Cell Voltage Data Age: " + String(datalayer_extended.bmwphev.min_cell_voltage_data_age) + " ms ";
content +=
"Max Cell Voltage Data Age: " + String(datalayer_extended.bmwphev.max_cell_voltage_data_age) + " ms ";
content += "Max Design Voltage: " + String(datalayer.battery.info.max_design_voltage_dV) + " dV ";
content += "Min Design Voltage: " + String(datalayer.battery.info.min_design_voltage_dV) + " dV ";
content += "BMS Allowed Charge Amps: " + String(datalayer_extended.bmwphev.allowable_charge_amps) + " A ";
content +=
"BMS Allowed Disharge Amps: " + String(datalayer_extended.bmwphev.allowable_discharge_amps) + " A ";
content += "Detected Cell Count: " + String(datalayer.battery.info.number_of_cells) + " ";
content += "iso_safety_int_kohm: " + String(datalayer_extended.bmwphev.iso_safety_int_kohm) + " ";
content += "iso_safety_ext_kohm: " + String(datalayer_extended.bmwphev.iso_safety_ext_kohm) + " ";
content += "iso_safety_trg_kohm: " + String(datalayer_extended.bmwphev.iso_safety_trg_kohm) + " ";
content += "iso_safety_ext_plausible: " + String(datalayer_extended.bmwphev.iso_safety_ext_plausible) + " ";
content += "iso_safety_int_plausible: " + String(datalayer_extended.bmwphev.iso_safety_int_plausible) + " ";
content += "iso_safety_trg_plausible: " + String(datalayer_extended.bmwphev.iso_safety_trg_plausible) + " ";
content += "iso_safety_kohm: " + String(datalayer_extended.bmwphev.iso_safety_kohm) + " ";
content += "iso_safety_kohm_quality: " + String(datalayer_extended.bmwphev.iso_safety_kohm_quality) + " ";
content += " ";
content += "Todo";
content += " ";
content += "Max Cell Design Voltage: " + String(datalayer.battery.info.max_cell_voltage_mV) + " mV ";
content += "Min Cell Design Voltage: " + String(datalayer.battery.info.min_cell_voltage_mV) + " mV ";
content += "T30 Terminal Voltage: " + String(datalayer_extended.bmwphev.T30_Voltage) + " mV ";
content += " ";
#endif //BMW_PHEV_BATTERY
#ifdef BMW_I3_BATTERY
content += "SOC raw: " + String(datalayer_extended.bmwi3.SOC_raw) + " ";
content += "SOC dash: " + String(datalayer_extended.bmwi3.SOC_dash) + " ";
content += "SOC OBD2: " + String(datalayer_extended.bmwi3.SOC_OBD2) + " ";
static const char* statusText[16] = {
"Not evaluated", "OK", "Error!", "Invalid signal", "", "", "", "", "", "", "", "", "", "", "", ""};
content += "Interlock: " + String(statusText[datalayer_extended.bmwi3.ST_interlock]) + " ";
content += "Isolation external: " + String(statusText[datalayer_extended.bmwi3.ST_iso_ext]) + " ";
content += "Isolation internal: " + String(statusText[datalayer_extended.bmwi3.ST_iso_int]) + " ";
content += "Isolation: " + String(statusText[datalayer_extended.bmwi3.ST_isolation]) + " ";
content += "Cooling valve: " + String(statusText[datalayer_extended.bmwi3.ST_valve_cooling]) + " ";
content += "Emergency: " + String(statusText[datalayer_extended.bmwi3.ST_EMG]) + " ";
static const char* prechargeText[16] = {"Not evaluated",
"Not active, closing not blocked",
"Error precharge blocked",
"Invalid signal",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""};
content += "Precharge: " + String(prechargeText[datalayer_extended.bmwi3.ST_precharge]) +
" "; //Still unclear of enum
static const char* DCSWText[16] = {"Contactors open",
"Precharge ongoing",
"Contactors engaged",
"Invalid signal",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""};
content += "Contactor status: " + String(DCSWText[datalayer_extended.bmwi3.ST_DCSW]) + " ";
static const char* contText[16] = {"Contactors OK",
"One contactor welded!",
"Two contactors welded!",
"Invalid signal",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
""};
content += "Contactor weld: " + String(contText[datalayer_extended.bmwi3.ST_WELD]) + " ";
static const char* valveText[16] = {"OK",
"Short circuit to GND",
"Short circuit to 12V",
"Line break",
"",
"",
"Driver error",
"",
"",
"",
"",
"",
"Stuck",
"Stuck",
"",
"Invalid Signal"};
content += "Cold shutoff valve: " + String(contText[datalayer_extended.bmwi3.ST_cold_shutoff_valve]) + " ";
#endif //BMW_I3_BATTERY
#ifdef CELLPOWER_BMS
static const char* falseTrue[2] = {"False", "True"};
content += "States: ";
content += "Discharge: " + String(falseTrue[datalayer_extended.cellpower.system_state_discharge]) + " ";
content += "Charge: " + String(falseTrue[datalayer_extended.cellpower.system_state_charge]) + " ";
content +=
"Cellbalancing: " + String(falseTrue[datalayer_extended.cellpower.system_state_cellbalancing]) + " ";
content +=
"Tricklecharging: " + String(falseTrue[datalayer_extended.cellpower.system_state_tricklecharge]) + " ";
content += "Idle: " + String(falseTrue[datalayer_extended.cellpower.system_state_idle]) + " ";
content += "Charge completed: " + String(falseTrue[datalayer_extended.cellpower.system_state_chargecompleted]) +
" ";
content +=
"Maintenance charge: " + String(falseTrue[datalayer_extended.cellpower.system_state_maintenancecharge]) +
" ";
content += "IO: ";
content +=
"Main positive relay: " + String(falseTrue[datalayer_extended.cellpower.IO_state_main_positive_relay]) +
" ";
content +=
"Main negative relay: " + String(falseTrue[datalayer_extended.cellpower.IO_state_main_negative_relay]) +
" ";
content +=
"Charge enabled: " + String(falseTrue[datalayer_extended.cellpower.IO_state_charge_enable]) + " ";
content +=
"Precharge relay: " + String(falseTrue[datalayer_extended.cellpower.IO_state_precharge_relay]) + " ";
content +=
"Discharge enable: " + String(falseTrue[datalayer_extended.cellpower.IO_state_discharge_enable]) + " ";
content += "IO 6: " + String(falseTrue[datalayer_extended.cellpower.IO_state_IO_6]) + " ";
content += "IO 7: " + String(falseTrue[datalayer_extended.cellpower.IO_state_IO_7]) + " ";
content += "IO 8: " + String(falseTrue[datalayer_extended.cellpower.IO_state_IO_8]) + " ";
content += "Errors: ";
content +=
"Cell overvoltage: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_overvoltage]) + " ";
content +=
"Cell undervoltage: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_undervoltage]) + " ";
content += "Cell end of life voltage: " +
String(falseTrue[datalayer_extended.cellpower.error_Cell_end_of_life_voltage]) + " ";
content +=
"Cell voltage misread: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_voltage_misread]) +
" ";
content +=
"Cell over temperature: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_over_temperature]) +
" ";
content +=
"Cell under temperature: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_under_temperature]) +
" ";
content += "Cell unmanaged: " + String(falseTrue[datalayer_extended.cellpower.error_Cell_unmanaged]) + " ";
content +=
"LMU over temperature: " + String(falseTrue[datalayer_extended.cellpower.error_LMU_over_temperature]) +
" ";
content +=
"LMU under temperature: " + String(falseTrue[datalayer_extended.cellpower.error_LMU_under_temperature]) +
" ";
content += "Temp sensor open circuit: " +
String(falseTrue[datalayer_extended.cellpower.error_Temp_sensor_open_circuit]) + " ";
content += "Temp sensor short circuit: " +
String(falseTrue[datalayer_extended.cellpower.error_Temp_sensor_short_circuit]) + " ";
content += "SUB comm: " + String(falseTrue[datalayer_extended.cellpower.error_SUB_communication]) + " ";
content += "LMU comm: " + String(falseTrue[datalayer_extended.cellpower.error_LMU_communication]) + " ";
content +=
"Over current In: " + String(falseTrue[datalayer_extended.cellpower.error_Over_current_IN]) + " ";
content +=
"Over current Out: " + String(falseTrue[datalayer_extended.cellpower.error_Over_current_OUT]) + " ";
content += "Short circuit: " + String(falseTrue[datalayer_extended.cellpower.error_Short_circuit]) + " ";
content += "Leak detected: " + String(falseTrue[datalayer_extended.cellpower.error_Leak_detected]) + " ";
content +=
"Leak detection failed: " + String(falseTrue[datalayer_extended.cellpower.error_Leak_detection_failed]) +
" ";
content +=
"Voltage diff: " + String(falseTrue[datalayer_extended.cellpower.error_Voltage_difference]) + " ";
content += "BMCU supply overvoltage: " +
String(falseTrue[datalayer_extended.cellpower.error_BMCU_supply_over_voltage]) + " ";
content += "BMCU supply undervoltage: " +
String(falseTrue[datalayer_extended.cellpower.error_BMCU_supply_under_voltage]) + " ";
content += "Main positive contactor: " +
String(falseTrue[datalayer_extended.cellpower.error_Main_positive_contactor]) + " ";
content += "Main negative contactor: " +
String(falseTrue[datalayer_extended.cellpower.error_Main_negative_contactor]) + " ";
content += "Precharge contactor: " + String(falseTrue[datalayer_extended.cellpower.error_Precharge_contactor]) +
" ";
content +=
"Midpack contactor: " + String(falseTrue[datalayer_extended.cellpower.error_Midpack_contactor]) + " ";
content +=
"Precharge timeout: " + String(falseTrue[datalayer_extended.cellpower.error_Precharge_timeout]) + " ";
content += "EMG connector override: " +
String(falseTrue[datalayer_extended.cellpower.error_Emergency_connector_override]) + " ";
content += "Warnings: ";
content +=
"High cell voltage: " + String(falseTrue[datalayer_extended.cellpower.warning_High_cell_voltage]) + " ";
content +=
"Low cell voltage: " + String(falseTrue[datalayer_extended.cellpower.warning_Low_cell_voltage]) + " ";
content +=
"High cell temperature: " + String(falseTrue[datalayer_extended.cellpower.warning_High_cell_temperature]) +
" ";
content +=
"Low cell temperature: " + String(falseTrue[datalayer_extended.cellpower.warning_Low_cell_temperature]) +
" ";
content +=
"High LMU temperature: " + String(falseTrue[datalayer_extended.cellpower.warning_High_LMU_temperature]) +
" ";
content +=
"Low LMU temperature: " + String(falseTrue[datalayer_extended.cellpower.warning_Low_LMU_temperature]) +
" ";
content +=
"SUB comm interf: " + String(falseTrue[datalayer_extended.cellpower.warning_SUB_communication_interfered]) +
" ";
content +=
"LMU comm interf: " + String(falseTrue[datalayer_extended.cellpower.warning_LMU_communication_interfered]) +
" ";
content +=
"High current In: " + String(falseTrue[datalayer_extended.cellpower.warning_High_current_IN]) + " ";
content +=
"High current Out: " + String(falseTrue[datalayer_extended.cellpower.warning_High_current_OUT]) + " ";
content += "Pack resistance diff: " +
String(falseTrue[datalayer_extended.cellpower.warning_Pack_resistance_difference]) + " ";
content +=
"High pack resistance: " + String(falseTrue[datalayer_extended.cellpower.warning_High_pack_resistance]) +
" ";
content += "Cell resistance diff: " +
String(falseTrue[datalayer_extended.cellpower.warning_Cell_resistance_difference]) + " ";
content +=
"High cell resistance: " + String(falseTrue[datalayer_extended.cellpower.warning_High_cell_resistance]) +
" ";
content += "High BMCU supply voltage: " +
String(falseTrue[datalayer_extended.cellpower.warning_High_BMCU_supply_voltage]) + " ";
content += "Low BMCU supply voltage: " +
String(falseTrue[datalayer_extended.cellpower.warning_Low_BMCU_supply_voltage]) + " ";
content += "Low SOC: " + String(falseTrue[datalayer_extended.cellpower.warning_Low_SOC]) + " ";
content += "Balancing required: " +
String(falseTrue[datalayer_extended.cellpower.warning_Balancing_required_OCV_model]) + " ";
content += "Charger not responding: " +
String(falseTrue[datalayer_extended.cellpower.warning_Charger_not_responding]) + " ";
#endif //CELLPOWER_BMS
#ifdef CMFA_EV_BATTERY
content += "SOC U: " + String(datalayer_extended.CMFAEV.soc_u) + "percent ";
content += "SOC Z: " + String(datalayer_extended.CMFAEV.soc_z) + "percent ";
content += "SOH Average: " + String(datalayer_extended.CMFAEV.soh_average) + "pptt ";
content += "12V voltage: " + String(datalayer_extended.CMFAEV.lead_acid_voltage) + "mV ";
content += "Highest cell number: " + String(datalayer_extended.CMFAEV.highest_cell_voltage_number) + " ";
content += "Lowest cell number: " + String(datalayer_extended.CMFAEV.lowest_cell_voltage_number) + " ";
content += "Max regen power: " + String(datalayer_extended.CMFAEV.max_regen_power) + " ";
content += "Max discharge power: " + String(datalayer_extended.CMFAEV.max_discharge_power) + " ";
content += "Max charge power: " + String(datalayer_extended.CMFAEV.maximum_charge_power) + " ";
content += "SOH available power: " + String(datalayer_extended.CMFAEV.SOH_available_power) + " ";
content += "SOH generated power: " + String(datalayer_extended.CMFAEV.SOH_generated_power) + " ";
content += "Average temperature: " + String(datalayer_extended.CMFAEV.average_temperature) + "dC ";
content += "Maximum temperature: " + String(datalayer_extended.CMFAEV.maximum_temperature) + "dC ";
content += "Minimum temperature: " + String(datalayer_extended.CMFAEV.minimum_temperature) + "dC ";
content +=
"Cumulative energy discharged: " + String(datalayer_extended.CMFAEV.cumulative_energy_when_discharging) +
"Wh ";
content += "Cumulative energy charged: " + String(datalayer_extended.CMFAEV.cumulative_energy_when_charging) +
"Wh ";
content +=
"Cumulative energy regen: " + String(datalayer_extended.CMFAEV.cumulative_energy_in_regen) + "Wh ";
#endif //CMFA_EV_BATTERY
#ifdef KIA_HYUNDAI_64_BATTERY
content += "Cells: " + String(datalayer_extended.KiaHyundai64.total_cell_count) + "S ";
content += "12V voltage: " + String(datalayer_extended.KiaHyundai64.battery_12V / 10.0, 1) + " ";
content += "Waterleakage: " + String(datalayer_extended.KiaHyundai64.waterleakageSensor) + " ";
content +=
"Temperature, water inlet: " + String(datalayer_extended.KiaHyundai64.temperature_water_inlet) + " ";
content +=
"Temperature, power relay: " + String(datalayer_extended.KiaHyundai64.powerRelayTemperature) + " ";
content += "Batterymanagement mode: " + String(datalayer_extended.KiaHyundai64.batteryManagementMode) + " ";
content += "BMS ignition: " + String(datalayer_extended.KiaHyundai64.BMS_ign) + " ";
content += "Battery relay: " + String(datalayer_extended.KiaHyundai64.batteryRelay) + " ";
#ifdef DOUBLE_BATTERY
content += "Values from battery 2 ";
content += "Cells: " + String(datalayer_extended.KiaHyundai64.battery2_total_cell_count) + "S ";
content += "12V voltage: " + String(datalayer_extended.KiaHyundai64.battery2_battery_12V / 10.0, 1) + " ";
content += "Waterleakage: " + String(datalayer_extended.KiaHyundai64.battery2_waterleakageSensor) + " ";
content +=
"Temperature, water inlet: " + String(datalayer_extended.KiaHyundai64.battery2_temperature_water_inlet) +
" ";
content +=
"Temperature, power relay: " + String(datalayer_extended.KiaHyundai64.battery2_powerRelayTemperature) +
" ";
content += "Batterymanagement mode: " + String(datalayer_extended.KiaHyundai64.battery2_batteryManagementMode) +
" ";
content += "BMS ignition: " + String(datalayer_extended.KiaHyundai64.battery2_BMS_ign) + " ";
content += "Battery relay: " + String(datalayer_extended.KiaHyundai64.battery2_batteryRelay) + " ";
#endif //DOUBLE_BATTERY
#endif //KIA_HYUNDAI_64_BATTERY
#ifdef BYD_ATTO_3_BATTERY
static const char* SOCmethod[2] = {"Estimated from voltage", "Measured by BMS"};
content += "SOC method used: " + String(SOCmethod[datalayer_extended.bydAtto3.SOC_method]) + " ";
content += "SOC estimated: " + String(datalayer_extended.bydAtto3.SOC_estimated) + " ";
content += "SOC highprec: " + String(datalayer_extended.bydAtto3.SOC_highprec) + " ";
content += "SOC OBD2: " + String(datalayer_extended.bydAtto3.SOC_polled) + " ";
content += "Voltage periodic: " + String(datalayer_extended.bydAtto3.voltage_periodic) + " ";
content += "Voltage OBD2: " + String(datalayer_extended.bydAtto3.voltage_polled) + " ";
content += "Temperature sensor 1: " + String(datalayer_extended.bydAtto3.battery_temperatures[0]) + " ";
content += "Temperature sensor 2: " + String(datalayer_extended.bydAtto3.battery_temperatures[1]) + " ";
content += "Temperature sensor 3: " + String(datalayer_extended.bydAtto3.battery_temperatures[2]) + " ";
content += "Temperature sensor 4: " + String(datalayer_extended.bydAtto3.battery_temperatures[3]) + " ";
content += "Temperature sensor 5: " + String(datalayer_extended.bydAtto3.battery_temperatures[4]) + " ";
content += "Temperature sensor 6: " + String(datalayer_extended.bydAtto3.battery_temperatures[5]) + " ";
content += "Temperature sensor 7: " + String(datalayer_extended.bydAtto3.battery_temperatures[6]) + " ";
content += "Temperature sensor 8: " + String(datalayer_extended.bydAtto3.battery_temperatures[7]) + " ";
content += "Temperature sensor 9: " + String(datalayer_extended.bydAtto3.battery_temperatures[8]) + " ";
content += "Temperature sensor 10: " + String(datalayer_extended.bydAtto3.battery_temperatures[9]) + " ";
#endif //BYD_ATTO_3_BATTERY
#ifdef TESLA_BATTERY
float beginning_of_life = static_cast(datalayer_extended.tesla.battery_beginning_of_life);
float battTempPct = static_cast(datalayer_extended.tesla.battery_battTempPct) * 0.4;
float dcdcLvBusVolt = static_cast(datalayer_extended.tesla.battery_dcdcLvBusVolt) * 0.0390625;
float dcdcHvBusVolt = static_cast(datalayer_extended.tesla.battery_dcdcHvBusVolt) * 0.146484;
float dcdcLvOutputCurrent = static_cast(datalayer_extended.tesla.battery_dcdcLvOutputCurrent) * 0.1;
float nominal_full_pack_energy =
static_cast(datalayer_extended.tesla.battery_nominal_full_pack_energy) * 0.1;
float nominal_full_pack_energy_m0 =
static_cast(datalayer_extended.tesla.battery_nominal_full_pack_energy_m0) * 0.02;
float nominal_energy_remaining =
static_cast(datalayer_extended.tesla.battery_nominal_energy_remaining) * 0.1;
float nominal_energy_remaining_m0 =
static_cast(datalayer_extended.tesla.battery_nominal_energy_remaining_m0) * 0.02;
float ideal_energy_remaining = static_cast(datalayer_extended.tesla.battery_ideal_energy_remaining) * 0.1;
float ideal_energy_remaining_m0 =
static_cast(datalayer_extended.tesla.battery_ideal_energy_remaining_m0) * 0.02;
float energy_to_charge_complete =
static_cast(datalayer_extended.tesla.battery_energy_to_charge_complete) * 0.1;
float energy_to_charge_complete_m1 =
static_cast(datalayer_extended.tesla.battery_energy_to_charge_complete_m1) * 0.02;
float energy_buffer = static_cast(datalayer_extended.tesla.battery_energy_buffer) * 0.1;
float energy_buffer_m1 = static_cast(datalayer_extended.tesla.battery_energy_buffer_m1) * 0.01;
float expected_energy_remaining_m1 =
static_cast(datalayer_extended.tesla.battery_expected_energy_remaining_m1) * 0.02;
float total_discharge = static_cast(datalayer.battery.status.total_discharged_battery_Wh) * 0.001;
float total_charge = static_cast(datalayer.battery.status.total_charged_battery_Wh) * 0.001;
float packMass = static_cast(datalayer_extended.tesla.battery_packMass);
float platformMaxBusVoltage =
static_cast(datalayer_extended.tesla.battery_platformMaxBusVoltage) * 0.1 + 375;
float bms_min_voltage = static_cast(datalayer_extended.tesla.battery_bms_min_voltage) * 0.01 * 2;
float bms_max_voltage = static_cast(datalayer_extended.tesla.battery_bms_max_voltage) * 0.01 * 2;
float max_charge_current = static_cast(datalayer_extended.tesla.battery_max_charge_current);
float max_discharge_current = static_cast(datalayer_extended.tesla.battery_max_discharge_current);
float soc_ave = static_cast(datalayer_extended.tesla.battery_soc_ave) * 0.1;
float soc_max = static_cast(datalayer_extended.tesla.battery_soc_max) * 0.1;
float soc_min = static_cast(datalayer_extended.tesla.battery_soc_min) * 0.1;
float soc_ui = static_cast(datalayer_extended.tesla.battery_soc_ui) * 0.1;
float BrickVoltageMax = static_cast(datalayer_extended.tesla.battery_BrickVoltageMax) * 0.002;
float BrickVoltageMin = static_cast(datalayer_extended.tesla.battery_BrickVoltageMin) * 0.002;
float BrickModelTMax = static_cast(datalayer_extended.tesla.battery_BrickModelTMax) * 0.5 - 40;
float BrickModelTMin = static_cast(datalayer_extended.tesla.battery_BrickModelTMin) * 0.5 - 40;
float isolationResistance = static_cast(datalayer_extended.tesla.battery_BMS_isolationResistance) * 10;
float PCS_dcdcMaxOutputCurrentAllowed =
static_cast(datalayer_extended.tesla.battery_PCS_dcdcMaxOutputCurrentAllowed) * 0.1;
float PCS_dcdcTemp = static_cast(datalayer_extended.tesla.PCS_dcdcTemp) * 0.1 + 40;
float PCS_ambientTemp = static_cast(datalayer_extended.tesla.PCS_ambientTemp) * 0.1 + 40;
float PCS_chgPhATemp = static_cast(datalayer_extended.tesla.PCS_chgPhATemp) * 0.1 + 40;
float PCS_chgPhBTemp = static_cast(datalayer_extended.tesla.PCS_chgPhBTemp) * 0.1 + 40;
float PCS_chgPhCTemp = static_cast(datalayer_extended.tesla.PCS_chgPhCTemp) * 0.1 + 40;
float BMS_maxRegenPower = static_cast(datalayer_extended.tesla.BMS_maxRegenPower) * 0.01;
float BMS_maxDischargePower = static_cast(datalayer_extended.tesla.BMS_maxDischargePower) * 0.013;
float BMS_maxStationaryHeatPower = static_cast(datalayer_extended.tesla.BMS_maxStationaryHeatPower) * 0.01;
float BMS_hvacPowerBudget = static_cast(datalayer_extended.tesla.BMS_hvacPowerBudget) * 0.02;
float BMS_powerDissipation = static_cast(datalayer_extended.tesla.BMS_powerDissipation) * 0.02;
float BMS_flowRequest = static_cast(datalayer_extended.tesla.BMS_flowRequest) * 0.3;
float BMS_inletActiveCoolTargetT =
static_cast(datalayer_extended.tesla.BMS_inletActiveCoolTargetT) * 0.25 - 25;
float BMS_inletPassiveTargetT = static_cast(datalayer_extended.tesla.BMS_inletPassiveTargetT) * 0.25 - 25;
float BMS_inletActiveHeatTargetT =
static_cast(datalayer_extended.tesla.BMS_inletActiveHeatTargetT) * 0.25 - 25;
float BMS_packTMin = static_cast(datalayer_extended.tesla.BMS_packTMin) * 0.25 - 25;
float BMS_packTMax = static_cast(datalayer_extended.tesla.BMS_packTMax) * 0.25 - 25;
float PCS_dcdcMaxLvOutputCurrent = static_cast(datalayer_extended.tesla.PCS_dcdcMaxLvOutputCurrent) * 0.1;
float PCS_dcdcCurrentLimit = static_cast(datalayer_extended.tesla.PCS_dcdcCurrentLimit) * 0.1;
float PCS_dcdcLvOutputCurrentTempLimit =
static_cast(datalayer_extended.tesla.PCS_dcdcLvOutputCurrentTempLimit) * 0.1;
float PCS_dcdcUnifiedCommand = static_cast(datalayer_extended.tesla.PCS_dcdcUnifiedCommand) * 0.001;
float PCS_dcdcCLAControllerOutput =
static_cast(datalayer_extended.tesla.PCS_dcdcCLAControllerOutput * 0.001);
float PCS_dcdcTankVoltage = static_cast(datalayer_extended.tesla.PCS_dcdcTankVoltage);
float PCS_dcdcTankVoltageTarget = static_cast(datalayer_extended.tesla.PCS_dcdcTankVoltageTarget);
float PCS_dcdcClaCurrentFreq = static_cast(datalayer_extended.tesla.PCS_dcdcClaCurrentFreq) * 0.0976563;
float PCS_dcdcTCommMeasured = static_cast(datalayer_extended.tesla.PCS_dcdcTCommMeasured) * 0.00195313;
float PCS_dcdcShortTimeUs = static_cast(datalayer_extended.tesla.PCS_dcdcShortTimeUs) * 0.000488281;
float PCS_dcdcHalfPeriodUs = static_cast(datalayer_extended.tesla.PCS_dcdcHalfPeriodUs) * 0.000488281;
float PCS_dcdcIntervalMaxFrequency = static_cast(datalayer_extended.tesla.PCS_dcdcIntervalMaxFrequency);
float PCS_dcdcIntervalMaxHvBusVolt =
static_cast(datalayer_extended.tesla.PCS_dcdcIntervalMaxHvBusVolt) * 0.1;
float PCS_dcdcIntervalMaxLvBusVolt =
static_cast(datalayer_extended.tesla.PCS_dcdcIntervalMaxLvBusVolt) * 0.1;
float PCS_dcdcIntervalMaxLvOutputCurr =
static_cast(datalayer_extended.tesla.PCS_dcdcIntervalMaxLvOutputCurr);
float PCS_dcdcIntervalMinFrequency = static_cast(datalayer_extended.tesla.PCS_dcdcIntervalMinFrequency);
float PCS_dcdcIntervalMinHvBusVolt =
static_cast(datalayer_extended.tesla.PCS_dcdcIntervalMinHvBusVolt) * 0.1;
float PCS_dcdcIntervalMinLvBusVolt =
static_cast(datalayer_extended.tesla.PCS_dcdcIntervalMinLvBusVolt) * 0.1;
float PCS_dcdcIntervalMinLvOutputCurr =
static_cast(datalayer_extended.tesla.PCS_dcdcIntervalMinLvOutputCurr);
float PCS_dcdc12vSupportLifetimekWh =
static_cast(datalayer_extended.tesla.PCS_dcdc12vSupportLifetimekWh) * 0.01;
float HVP_hvp1v5Ref = static_cast(datalayer_extended.tesla.HVP_hvp1v5Ref) * 0.1;
float HVP_shuntCurrentDebug = static_cast(datalayer_extended.tesla.HVP_shuntCurrentDebug) * 0.1;
float HVP_dcLinkVoltage = static_cast(datalayer_extended.tesla.HVP_dcLinkVoltage) * 0.1;
float HVP_packVoltage = static_cast(datalayer_extended.tesla.HVP_packVoltage) * 0.1;
float HVP_fcLinkVoltage = static_cast(datalayer_extended.tesla.HVP_fcLinkVoltage) * 0.1;
float HVP_packContVoltage = static_cast(datalayer_extended.tesla.HVP_packContVoltage) * 0.1;
float HVP_packNegativeV = static_cast(datalayer_extended.tesla.HVP_packNegativeV) * 0.1;
float HVP_packPositiveV = static_cast(datalayer_extended.tesla.HVP_packPositiveV) * 0.1;
float HVP_pyroAnalog = static_cast(datalayer_extended.tesla.HVP_pyroAnalog) * 0.1;
float HVP_dcLinkNegativeV = static_cast(datalayer_extended.tesla.HVP_dcLinkNegativeV) * 0.1;
float HVP_dcLinkPositiveV = static_cast(datalayer_extended.tesla.HVP_dcLinkPositiveV) * 0.1;
float HVP_fcLinkNegativeV = static_cast(datalayer_extended.tesla.HVP_fcLinkNegativeV) * 0.1;
float HVP_fcContCoilCurrent = static_cast(datalayer_extended.tesla.HVP_fcContCoilCurrent) * 0.1;
float HVP_fcContVoltage = static_cast(datalayer_extended.tesla.HVP_fcContVoltage) * 0.1;
float HVP_hvilInVoltage = static_cast(datalayer_extended.tesla.HVP_hvilInVoltage) * 0.1;
float HVP_hvilOutVoltage = static_cast(datalayer_extended.tesla.HVP_hvilOutVoltage) * 0.1;
float HVP_fcLinkPositiveV = static_cast(datalayer_extended.tesla.HVP_fcLinkPositiveV) * 0.1;
float HVP_packContCoilCurrent = static_cast(datalayer_extended.tesla.HVP_packContCoilCurrent) * 0.1;
float HVP_battery12V = static_cast(datalayer_extended.tesla.HVP_battery12V) * 0.1;
float HVP_shuntRefVoltageDbg = static_cast(datalayer_extended.tesla.HVP_shuntRefVoltageDbg) * 0.001;
float HVP_shuntAuxCurrentDbg = static_cast(datalayer_extended.tesla.HVP_shuntAuxCurrentDbg) * 0.1;
float HVP_shuntBarTempDbg = static_cast(datalayer_extended.tesla.HVP_shuntBarTempDbg) * 0.01;
float HVP_shuntAsicTempDbg = static_cast(datalayer_extended.tesla.HVP_shuntAsicTempDbg) * 0.01;
static const char* contactorText[] = {"UNKNOWN(0)", "OPEN", "CLOSING", "BLOCKED", "OPENING",
"CLOSED", "UNKNOWN(6)", "WELDED", "POS_CL", "NEG_CL",
"UNKNOWN(10)", "UNKNOWN(11)", "UNKNOWN(12)"};
static const char* hvilStatusState[] = {"NOT Ok",
"STATUS_OK",
"CURRENT_SOURCE_FAULT",
"INTERNAL_OPEN_FAULT",
"VEHICLE_OPEN_FAULT",
"PENTHOUSE_LID_OPEN_FAULT",
"UNKNOWN_LOCATION_OPEN_FAULT",
"VEHICLE_NODE_FAULT",
"NO_12V_SUPPLY",
"VEHICLE_OR_PENTHOUSE_LID_OPENFAULT",
"UNKNOWN(10)",
"UNKNOWN(11)",
"UNKNOWN(12)",
"UNKNOWN(13)",
"UNKNOWN(14)",
"UNKNOWN(15)"};
static const char* contactorState[] = {"SNA", "OPEN", "PRECHARGE", "BLOCKED",
"PULLED_IN", "OPENING", "ECONOMIZED", "WELDED",
"UNKNOWN(8)", "UNKNOWN(9)", "UNKNOWN(10)", "UNKNOWN(11)"};
static const char* BMS_state[] = {"STANDBY", "DRIVE", "SUPPORT", "CHARGE", "FEIM",
"CLEAR_FAULT", "FAULT", "WELD", "TEST", "SNA"};
static const char* BMS_contactorState[] = {"SNA", "OPEN", "OPENING", "CLOSING", "CLOSED", "WELDED", "BLOCKED"};
static const char* BMS_hvState[] = {"DOWN", "COMING_UP", "GOING_DOWN", "UP_FOR_DRIVE",
"UP_FOR_CHARGE", "UP_FOR_DC_CHARGE", "UP"};
static const char* BMS_uiChargeStatus[] = {"DISCONNECTED", "NO_POWER", "ABOUT_TO_CHARGE",
"CHARGING", "CHARGE_COMPLETE", "CHARGE_STOPPED"};
static const char* PCS_dcdcStatus[] = {"IDLE", "ACTIVE", "FAULTED"};
static const char* PCS_dcdcMainState[] = {"STANDBY", "12V_SUPPORT_ACTIVE", "PRECHARGE_STARTUP",
"PRECHARGE_ACTIVE", "DIS_HVBUS_ACTIVE", "SHUTDOWN",
"FAULTED"};
static const char* PCS_dcdcSubState[] = {"PWR_UP_INIT",
"STANDBY",
"12V_SUPPORT_ACTIVE",
"DIS_HVBUS",
"PCHG_FAST_DIS_HVBUS",
"PCHG_SLOW_DIS_HVBUS",
"PCHG_DWELL_CHARGE",
"PCHG_DWELL_WAIT",
"PCHG_DI_RECOVERY_WAIT",
"PCHG_ACTIVE",
"PCHG_FLT_FAST_DIS_HVBUS",
"SHUTDOWN",
"12V_SUPPORT_FAULTED",
"DIS_HVBUS_FAULTED",
"PCHG_FAULTED",
"CLEAR_FAULTS",
"FAULTED",
"NUM"};
static const char* BMS_powerLimitState[] = {"NOT_CALCULATED_FOR_DRIVE", "CALCULATED_FOR_DRIVE"};
static const char* HVP_status[] = {"INVALID", "NOT_AVAILABLE", "STALE", "VALID"};
static const char* HVP_contactor[] = {"NOT_ACTIVE", "ACTIVE", "COMPLETED"};
static const char* falseTrue[] = {"False", "True"};
static const char* noYes[] = {"No", "Yes"};
static const char* Fault[] = {"NOT_ACTIVE", "ACTIVE"};
//Buttons for user action
content += "Clear isolation fault ";
content += "BMS reset ";
//0x20A 522 HVP_contatorState
content += "Contactor Status: " + String(contactorText[datalayer_extended.tesla.status_contactor]) + " ";
content += "HVIL: " + String(hvilStatusState[datalayer_extended.tesla.hvil_status]) + " ";
content +=
"Negative contactor: " + String(contactorState[datalayer_extended.tesla.packContNegativeState]) + " ";
content +=
"Positive contactor: " + String(contactorState[datalayer_extended.tesla.packContPositiveState]) + " ";
content += "Closing allowed?: " + String(noYes[datalayer_extended.tesla.packCtrsClosingAllowed]) + " ";
content += "Pyrotest in Progress: " + String(noYes[datalayer_extended.tesla.pyroTestInProgress]) + " ";
content += "Contactors Open Now Requested: " +
String(noYes[datalayer_extended.tesla.battery_packCtrsOpenNowRequested]) + " ";
content +=
"Contactors Open Requested: " + String(noYes[datalayer_extended.tesla.battery_packCtrsOpenRequested]) +
" ";
content += "Contactors Request Status: " +
String(HVP_contactor[datalayer_extended.tesla.battery_packCtrsRequestStatus]) + " ";
content += "Contactors Reset Request Required: " +
String(noYes[datalayer_extended.tesla.battery_packCtrsResetRequestRequired]) + " ";
content +=
"DC Link Allowed to Energize: " + String(noYes[datalayer_extended.tesla.battery_dcLinkAllowedToEnergize]) +
" ";
char readableSerialNumber[15]; // One extra space for null terminator
memcpy(readableSerialNumber, datalayer_extended.tesla.BMS_SerialNumber,
sizeof(datalayer_extended.tesla.BMS_SerialNumber));
readableSerialNumber[14] = '\0'; // Null terminate the string
content += "BMS Serial number: " + String(readableSerialNumber) + " ";
// Comment what data you would like to display, order can be changed.
//0x352 850 BMS_energyStatus
if (datalayer_extended.tesla.BMS352_mux == false) {
content += "BMS 0x352 w/o mux "; //if using older BMS <2021 and comment 0x352 without MUX
content += "Calculated SOH: " + String(nominal_full_pack_energy * 100 / beginning_of_life) + " ";
content += "Nominal Full Pack Energy: " + String(nominal_full_pack_energy) + " KWh ";
content += "Nominal Energy Remaining: " + String(nominal_energy_remaining) + " KWh ";
content += "Ideal Energy Remaining: " + String(ideal_energy_remaining) + " KWh ";
content += "Energy to Charge Complete: " + String(energy_to_charge_complete) + " KWh ";
content += "Energy Buffer: " + String(energy_buffer) + " KWh ";
content += "Full Charge Complete: " + String(noYes[datalayer_extended.tesla.battery_full_charge_complete]) +
" "; //bool
}
//0x352 850 BMS_energyStatus
if (datalayer_extended.tesla.BMS352_mux == true) {
content += "BMS 0x352 w/ mux "; //if using newer BMS >2021 and comment 0x352 with MUX
content += "Calculated SOH: " + String(nominal_full_pack_energy_m0 * 100 / beginning_of_life) + " ";
content += "Nominal Full Pack Energy: " + String(nominal_full_pack_energy_m0) + " KWh ";
content += "Nominal Energy Remaining: " + String(nominal_energy_remaining_m0) + " KWh ";
content += "Ideal Energy Remaining: " + String(ideal_energy_remaining_m0) + " KWh ";
content += "Energy to Charge Complete: " + String(energy_to_charge_complete_m1) + " KWh ";
content += "Energy Buffer: " + String(energy_buffer_m1) + " KWh ";
content += "Expected Energy Remaining: " + String(expected_energy_remaining_m1) + " KWh ";
content += "Fully Charged: " + String(noYes[datalayer_extended.tesla.battery_fully_charged]) + " ";
}
//0x3D2 978 BMS_kwhCounter
content += "Total Discharge: " + String(total_discharge) + " KWh ";
content += "Total Charge: " + String(total_charge) + " KWh ";
//0x292 658 BMS_socStates
content += "Battery Beginning of Life: " + String(beginning_of_life) + " KWh ";
content += "Battery SOC UI: " + String(soc_ui) + " ";
content += "Battery SOC Ave: " + String(soc_ave) + " ";
content += "Battery SOC Max: " + String(soc_max) + " ";
content += "Battery SOC Min: " + String(soc_min) + " ";
content += "Battery Temp Percent: " + String(battTempPct) + " ";
//0x2B4 PCS_dcdcRailStatus
content += "PCS Lv Output: " + String(dcdcLvOutputCurrent) + " A ";
content += "PCS Lv Bus: " + String(dcdcLvBusVolt) + " V ";
content += "PCS Hv Bus: " + String(dcdcHvBusVolt) + " V ";
//0x392 BMS_packConfig
//content += "packConfigMultiplexer: " + String(datalayer_extended.tesla.battery_packConfigMultiplexer) + " "; // Not giving useable data
//content += "moduleType: " + String(datalayer_extended.tesla.battery_moduleType) + " "; // Not giving useable data
//content += "reserveConfig: " + String(datalayer_extended.tesla.battery_reservedConfig) + " "; // Not giving useable data
content += "Battery Pack Mass: " + String(packMass) + " KG ";
content += "Platform Max Bus Voltage: " + String(platformMaxBusVoltage) + " V ";
//0x2D2 722 BMSVAlimits
content += "BMS Min Voltage: " + String(bms_min_voltage) + " V ";
content += "BMS Max Voltage: " + String(bms_max_voltage) + " V ";
content += "Max Charge Current: " + String(max_charge_current) + " A ";
content += "Max Discharge Current: " + String(max_discharge_current) + " A ";
//0x332 818 BMS_bmbMinMax
content += "Brick Voltage Max: " + String(BrickVoltageMax) + " V ";
content += "Brick Voltage Min: " + String(BrickVoltageMin) + " V ";
content += "Brick Temp Max Num: " + String(datalayer_extended.tesla.battery_BrickTempMaxNum) + " ";
content += "Brick Temp Min Num: " + String(datalayer_extended.tesla.battery_BrickTempMinNum) + " ";
//content += "Brick Model Temp Max: " + String(BrickModelTMax) + " C ";// Not giving useable data
//content += "Brick Model Temp Min: " + String(BrickModelTMin) + " C ";// Not giving useable data
//0x2A4 676 PCS_thermalStatus
content += "PCS dcdc Temp: " + String(PCS_dcdcTemp) + " DegC ";
content += "PCS Ambient Temp: " + String(PCS_ambientTemp) + " DegC ";
content += "PCS Chg PhA Temp: " + String(PCS_chgPhATemp) + " DegC ";
content += "PCS Chg PhB Temp: " + String(PCS_chgPhBTemp) + " DegC ";
content += "PCS Chg PhC Temp: " + String(PCS_chgPhCTemp) + " DegC ";
//0x252 594 BMS_powerAvailable
content += "Max Regen Power: " + String(BMS_maxRegenPower) + " KW ";
content += "Max Discharge Power: " + String(BMS_maxDischargePower) + " KW ";
//content += "Max Stationary Heat Power: " + String(BMS_maxStationaryHeatPower) + " KWh "; // Not giving useable data
//content += "HVAC Power Budget: " + String(BMS_hvacPowerBudget) + " KW "; // Not giving useable data
//content += "Not Enough Power For Heat Pump: " + String(noYes[datalayer_extended.tesla.BMS_notEnoughPowerForHeatPump]) + " "; // Not giving useable data
content +=
"Power Limit State: " + String(BMS_powerLimitState[datalayer_extended.tesla.BMS_powerLimitState]) + " ";
//content += "Inverter TQF: " + String(datalayer_extended.tesla.BMS_inverterTQF) + " "; // Not giving useable data
//0x212 530 BMS_status
content += "Isolation Resistance: " + String(isolationResistance) + " kOhms ";
content +=
"BMS Contactor State: " + String(BMS_contactorState[datalayer_extended.tesla.battery_BMS_contactorState]) +
" ";
content += "BMS State: " + String(BMS_state[datalayer_extended.tesla.battery_BMS_state]) + " ";
content += "BMS HV State: " + String(BMS_hvState[datalayer_extended.tesla.battery_BMS_hvState]) + " ";
content += "BMS UI Charge Status: " + String(BMS_uiChargeStatus[datalayer_extended.tesla.battery_BMS_hvState]) +
" ";
content +=
"BMS PCS PWM Enabled: " + String(Fault[datalayer_extended.tesla.battery_BMS_pcsPwmEnabled]) + " ";
//0x312 786 BMS_thermalStatus
content += "Power Dissipation: " + String(BMS_powerDissipation) + " kW ";
content += "Flow Request: " + String(BMS_flowRequest) + " LPM ";
content += "Inlet Active Cool Target Temp: " + String(BMS_inletActiveCoolTargetT) + " DegC ";
content += "Inlet Passive Target Temp: " + String(BMS_inletPassiveTargetT) + " DegC ";
content += "Inlet Active Heat Target Temp: " + String(BMS_inletActiveHeatTargetT) + " DegC ";
content += "Pack Temp Min: " + String(BMS_packTMin) + " DegC ";
content += "Pack Temp Max: " + String(BMS_packTMax) + " DegC ";
content += "PCS No Flow Request: " + String(Fault[datalayer_extended.tesla.BMS_pcsNoFlowRequest]) + " ";
content += "BMS No Flow Request: " + String(Fault[datalayer_extended.tesla.BMS_noFlowRequest]) + " ";
//0x224 548 PCS_dcdcStatus
content +=
"Precharge Status: " + String(PCS_dcdcStatus[datalayer_extended.tesla.battery_PCS_dcdcPrechargeStatus]) +
" ";
content +=
"12V Support Status: " + String(PCS_dcdcStatus[datalayer_extended.tesla.battery_PCS_dcdc12VSupportStatus]) +
" ";
content += "HV Bus Discharge Status: " +
String(PCS_dcdcStatus[datalayer_extended.tesla.battery_PCS_dcdcHvBusDischargeStatus]) + " ";
content +=
"Main State: " + String(PCS_dcdcMainState[datalayer_extended.tesla.battery_PCS_dcdcMainState]) + " ";
content +=
"Sub State: " + String(PCS_dcdcSubState[datalayer_extended.tesla.battery_PCS_dcdcSubState]) + " ";
content += "PCS Faulted: " + String(Fault[datalayer_extended.tesla.battery_PCS_dcdcFaulted]) + " ";
content +=
"Output Is Limited: " + String(Fault[datalayer_extended.tesla.battery_PCS_dcdcOutputIsLimited]) + " ";
content += "Max Output Current Allowed: " + String(PCS_dcdcMaxOutputCurrentAllowed) + " A ";
content += "Precharge Rty Cnt: " + String(falseTrue[datalayer_extended.tesla.battery_PCS_dcdcPrechargeRtyCnt]) +
" ";
content +=
"12V Support Rty Cnt: " + String(falseTrue[datalayer_extended.tesla.battery_PCS_dcdc12VSupportRtyCnt]) +
" ";
content += "Discharge Rty Cnt: " + String(falseTrue[datalayer_extended.tesla.battery_PCS_dcdcDischargeRtyCnt]) +
" ";
content +=
"PWM Enable Line: " + String(Fault[datalayer_extended.tesla.battery_PCS_dcdcPwmEnableLine]) + " ";
content += "Supporting Fixed LV Target: " +
String(Fault[datalayer_extended.tesla.battery_PCS_dcdcSupportingFixedLvTarget]) + " ";
content += "Precharge Restart Cnt: " +
String(falseTrue[datalayer_extended.tesla.battery_PCS_dcdcPrechargeRestartCnt]) + " ";
content += "Initial Precharge Substate: " +
String(PCS_dcdcSubState[datalayer_extended.tesla.battery_PCS_dcdcInitialPrechargeSubState]) + " ";
//0x2C4 708 PCS_logging
content += "PCS_dcdcMaxLvOutputCurrent: " + String(PCS_dcdcMaxLvOutputCurrent) + " A ";
content += "PCS_dcdcCurrentLimit: " + String(PCS_dcdcCurrentLimit) + " A ";
content += "PCS_dcdcLvOutputCurrentTempLimit: " + String(PCS_dcdcLvOutputCurrentTempLimit) + " A ";
content += "PCS_dcdcUnifiedCommand: " + String(PCS_dcdcUnifiedCommand) + " ";
content += "PCS_dcdcCLAControllerOutput: " + String(PCS_dcdcCLAControllerOutput) + " ";
content += "PCS_dcdcTankVoltage: " + String(PCS_dcdcTankVoltage) + " V ";
content += "PCS_dcdcTankVoltageTarget: " + String(PCS_dcdcTankVoltageTarget) + " V ";
content += "PCS_dcdcClaCurrentFreq: " + String(PCS_dcdcClaCurrentFreq) + " kHz ";
content += "PCS_dcdcTCommMeasured: " + String(PCS_dcdcTCommMeasured) + " us ";
content += "PCS_dcdcShortTimeUs: " + String(PCS_dcdcShortTimeUs) + " us ";
content += "PCS_dcdcHalfPeriodUs: " + String(PCS_dcdcHalfPeriodUs) + " us ";
content += "PCS_dcdcIntervalMaxFrequency: " + String(PCS_dcdcIntervalMaxFrequency) + " kHz ";
content += "PCS_dcdcIntervalMaxHvBusVolt: " + String(PCS_dcdcIntervalMaxHvBusVolt) + " V ";
content += "PCS_dcdcIntervalMaxLvBusVolt: " + String(PCS_dcdcIntervalMaxLvBusVolt) + " V ";
content += "PCS_dcdcIntervalMaxLvOutputCurr: " + String(PCS_dcdcIntervalMaxLvOutputCurr) + " A ";
content += "PCS_dcdcIntervalMinFrequency: " + String(PCS_dcdcIntervalMinFrequency) + " kHz ";
content += "PCS_dcdcIntervalMinHvBusVolt: " + String(PCS_dcdcIntervalMinHvBusVolt) + " V ";
content += "PCS_dcdcIntervalMinLvBusVolt: " + String(PCS_dcdcIntervalMinLvBusVolt) + " V ";
content += "PCS_dcdcIntervalMinLvOutputCurr: " + String(PCS_dcdcIntervalMinLvOutputCurr) + " A ";
content += "PCS_dcdc12vSupportLifetimekWh: " + String(PCS_dcdc12vSupportLifetimekWh) + " kWh ";
//0x7AA 1962 HVP_debugMessage
content += "HVP_battery12V: " + String(HVP_battery12V) + " V ";
content += "HVP_dcLinkVoltage: " + String(HVP_dcLinkVoltage) + " V ";
content += "HVP_packVoltage: " + String(HVP_packVoltage) + " V ";
content += "HVP_packContVoltage: " + String(HVP_packContVoltage) + " V ";
content += "HVP_packContCoilCurrent: " + String(HVP_packContCoilCurrent) + " A ";
content += "HVP_pyroAnalog: " + String(HVP_pyroAnalog) + " V ";
content += "HVP_hvp1v5Ref: " + String(HVP_hvp1v5Ref) + " V ";
content += "HVP_hvilInVoltage: " + String(HVP_hvilInVoltage) + " V ";
content += "HVP_hvilOutVoltage: " + String(HVP_hvilOutVoltage) + " V ";
content +=
"HVP_gpioPassivePyroDepl: " + String(Fault[datalayer_extended.tesla.HVP_gpioPassivePyroDepl]) + " ";
content += "HVP_gpioPyroIsoEn: " + String(Fault[datalayer_extended.tesla.HVP_gpioPyroIsoEn]) + " ";
content += "HVP_gpioCpFaultIn: " + String(Fault[datalayer_extended.tesla.HVP_gpioCpFaultIn]) + " ";
content +=
"HVP_gpioPackContPowerEn: " + String(Fault[datalayer_extended.tesla.HVP_gpioPackContPowerEn]) + " ";
content += "HVP_gpioHvCablesOk: " + String(Fault[datalayer_extended.tesla.HVP_gpioHvCablesOk]) + " ";
content += "HVP_gpioHvpSelfEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioHvpSelfEnable]) + " ";
content += "HVP_gpioLed: " + String(Fault[datalayer_extended.tesla.HVP_gpioLed]) + " ";
content += "HVP_gpioCrashSignal: " + String(Fault[datalayer_extended.tesla.HVP_gpioCrashSignal]) + " ";
content +=
"HVP_gpioShuntDataReady: " + String(Fault[datalayer_extended.tesla.HVP_gpioShuntDataReady]) + " ";
content += "HVP_gpioFcContPosAux: " + String(Fault[datalayer_extended.tesla.HVP_gpioFcContPosAux]) + " ";
content += "HVP_gpioFcContNegAux: " + String(Fault[datalayer_extended.tesla.HVP_gpioFcContNegAux]) + " ";
content += "HVP_gpioBmsEout: " + String(Fault[datalayer_extended.tesla.HVP_gpioBmsEout]) + " ";
content += "HVP_gpioCpFaultOut: " + String(Fault[datalayer_extended.tesla.HVP_gpioCpFaultOut]) + " ";
content += "HVP_gpioPyroPor: " + String(Fault[datalayer_extended.tesla.HVP_gpioPyroPor]) + " ";
content += "HVP_gpioShuntEn: " + String(Fault[datalayer_extended.tesla.HVP_gpioShuntEn]) + " ";
content += "HVP_gpioHvpVerEn: " + String(Fault[datalayer_extended.tesla.HVP_gpioHvpVerEn]) + " ";
content +=
"HVP_gpioPackCoontPosFlywheel: " + String(Fault[datalayer_extended.tesla.HVP_gpioPackCoontPosFlywheel]) +
" ";
content += "HVP_gpioCpLatchEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioCpLatchEnable]) + " ";
content += "HVP_gpioPcsEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioPcsEnable]) + " ";
content +=
"HVP_gpioPcsDcdcPwmEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioPcsDcdcPwmEnable]) + " ";
content += "HVP_gpioPcsChargePwmEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioPcsChargePwmEnable]) +
" ";
content +=
"HVP_gpioFcContPowerEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioFcContPowerEnable]) + " ";
content += "HVP_gpioHvilEnable: " + String(Fault[datalayer_extended.tesla.HVP_gpioHvilEnable]) + " ";
content += "HVP_gpioSecDrdy: " + String(Fault[datalayer_extended.tesla.HVP_gpioSecDrdy]) + " ";
content += "HVP_shuntCurrentDebug: " + String(HVP_shuntCurrentDebug) + " A ";
content += "HVP_packCurrentMia: " + String(noYes[datalayer_extended.tesla.HVP_packCurrentMia]) + " ";
content += "HVP_auxCurrentMia: " + String(noYes[datalayer_extended.tesla.HVP_auxCurrentMia]) + " ";
content += "HVP_currentSenseMia: " + String(noYes[datalayer_extended.tesla.HVP_currentSenseMia]) + " ";
content +=
"HVP_shuntRefVoltageMismatch: " + String(noYes[datalayer_extended.tesla.HVP_shuntRefVoltageMismatch]) +
" ";
content +=
"HVP_shuntThermistorMia: " + String(noYes[datalayer_extended.tesla.HVP_shuntThermistorMia]) + " ";
content += "HVP_shuntHwMia: " + String(noYes[datalayer_extended.tesla.HVP_shuntHwMia]) + " ";
//content += "HVP_fcLinkVoltage: " + String(HVP_fcLinkVoltage) + " V "; // Not giving useable data
//content += "HVP_packNegativeV: " + String(HVP_packNegativeV) + " V "; // Not giving useable data
//content += "HVP_packPositiveV: " + String(HVP_packPositiveV) + " V "; // Not giving useable data
//content += "HVP_dcLinkNegativeV: " + String(HVP_dcLinkNegativeV) + " V "; // Not giving useable data
//content += "HVP_dcLinkPositiveV: " + String(HVP_dcLinkPositiveV) + " V "; // Not giving useable data
//content += "HVP_fcLinkNegativeV: " + String(HVP_fcLinkNegativeV) + " V "; // Not giving useable data
//content += "HVP_fcContCoilCurrent: " + String(HVP_fcContCoilCurrent) + " A "; // Not giving useable data
//content += "HVP_fcContVoltage: " + String(HVP_fcContVoltage) + " V "; // Not giving useable data
//content += "HVP_fcLinkPositiveV: " + String(HVP_fcLinkPositiveV) + " V "; // Not giving useable data
//content += "HVP_shuntRefVoltageDbg: " + String(HVP_shuntRefVoltageDbg) + " V "; // Not giving useable data
//content += "HVP_shuntAuxCurrentDbg: " + String(HVP_shuntAuxCurrentDbg) + " A "; // Not giving useable data
//content += "HVP_shuntBarTempDbg: " + String(HVP_shuntBarTempDbg) + " DegC "; // Not giving useable data
//content += "HVP_shuntAsicTempDbg: " + String(HVP_shuntAsicTempDbg) + " DegC "; // Not giving useable data
//content += "HVP_shuntAuxCurrentStatus: " + String(HVP_status[datalayer_extended.tesla.HVP_shuntAuxCurrentStatus]) + " "; // Not giving useable data
//content += "HVP_shuntBarTempStatus: " + String(HVP_status[datalayer_extended.tesla.HVP_shuntBarTempStatus]) + " "; // Not giving useable data
//content += "HVP_shuntAsicTempStatus: " + String(HVP_status[datalayer_extended.tesla.HVP_shuntAsicTempStatus]) + " "; // Not giving useable data
#endif
#ifdef NISSAN_LEAF_BATTERY
static const char* LEAFgen[] = {"ZE0", "AZE0", "ZE1"};
content += "LEAF generation: " + String(LEAFgen[datalayer_extended.nissanleaf.LEAF_gen]) + " ";
char readableSerialNumber[16]; // One extra space for null terminator
memcpy(readableSerialNumber, datalayer_extended.nissanleaf.BatterySerialNumber,
sizeof(datalayer_extended.nissanleaf.BatterySerialNumber));
readableSerialNumber[15] = '\0'; // Null terminate the string
content += "Serial number: " + String(readableSerialNumber) + " ";
char readablePartNumber[8]; // One extra space for null terminator
memcpy(readablePartNumber, datalayer_extended.nissanleaf.BatteryPartNumber,
sizeof(datalayer_extended.nissanleaf.BatteryPartNumber));
readablePartNumber[7] = '\0'; // Null terminate the string
content += "Part number: " + String(readablePartNumber) + " ";
char readableBMSID[9]; // One extra space for null terminator
memcpy(readableBMSID, datalayer_extended.nissanleaf.BMSIDcode, sizeof(datalayer_extended.nissanleaf.BMSIDcode));
readableBMSID[8] = '\0'; // Null terminate the string
content += "BMS ID: " + String(readableBMSID) + " ";
content += "GIDS: " + String(datalayer_extended.nissanleaf.GIDS) + " ";
content += "Regen kW: " + String(datalayer_extended.nissanleaf.ChargePowerLimit) + " ";
content += "Charge kW: " + String(datalayer_extended.nissanleaf.MaxPowerForCharger) + " ";
content += "Interlock: " + String(datalayer_extended.nissanleaf.Interlock) + " ";
content += "Insulation: " + String(datalayer_extended.nissanleaf.Insulation) + " ";
content += "Relay cut request: " + String(datalayer_extended.nissanleaf.RelayCutRequest) + " ";
content += "Failsafe status: " + String(datalayer_extended.nissanleaf.FailsafeStatus) + " ";
content += "Fully charged: " + String(datalayer_extended.nissanleaf.Full) + " ";
content += "Battery empty: " + String(datalayer_extended.nissanleaf.Empty) + " ";
content += "Main relay ON: " + String(datalayer_extended.nissanleaf.MainRelayOn) + " ";
content += "Heater present: " + String(datalayer_extended.nissanleaf.HeatExist) + " ";
content += "Heating stopped: " + String(datalayer_extended.nissanleaf.HeatingStop) + " ";
content += "Heating started: " + String(datalayer_extended.nissanleaf.HeatingStart) + " ";
content += "Heating requested: " + String(datalayer_extended.nissanleaf.HeaterSendRequest) + " ";
content += "Reset degradation data ";
content += "CryptoChallenge: " + String(datalayer_extended.nissanleaf.CryptoChallenge) + " ";
content += "SolvedChallenge: " + String(datalayer_extended.nissanleaf.SolvedChallengeMSB) +
String(datalayer_extended.nissanleaf.SolvedChallengeLSB) + " ";
content += "Challenge failed: " + String(datalayer_extended.nissanleaf.challengeFailed) + " ";
#endif
#ifdef MEB_BATTERY
content += datalayer_extended.meb.SDSW ? "Service disconnect switch: Missing! "
: "Service disconnect switch: OK ";
content += datalayer_extended.meb.pilotline ? "Pilotline: Open! " : "Pilotline: OK ";
content += datalayer_extended.meb.transportmode ? "Transportmode: Locked! " : "Transportmode: OK ";
content += datalayer_extended.meb.shutdown_active ? "Shutdown: Active! " : "Shutdown: No ";
content += datalayer_extended.meb.componentprotection ? "Component protection: Active! "
: "Component protection: No ";
content += "HVIL status: ";
switch (datalayer_extended.meb.HVIL) {
case 0:
content += String("Init");
break;
case 1:
content += String("Closed");
break;
case 2:
content += String("Open!");
break;
case 3:
content += String("Fault");
break;
default:
content += String("?");
}
content += " KL30C status: ";
switch (datalayer_extended.meb.BMS_Kl30c_Status) {
case 0:
content += String("Init");
break;
case 1:
content += String("Closed");
break;
case 2:
content += String("Open!");
break;
case 3:
content += String("Fault");
break;
default:
content += String("?");
}
content += " BMS mode: ";
switch (datalayer_extended.meb.BMS_mode) {
case 0:
content += String("HV inactive");
break;
case 1:
content += String("HV active");
break;
case 2:
content += String("Balancing");
break;
case 3:
content += String("Extern charging");
break;
case 4:
content += String("AC charging");
break;
case 5:
content += String("Battery error");
break;
case 6:
content += String("DC charging");
break;
case 7:
content += String("Init");
break;
default:
content += String("?");
}
content += String(" Charging: ") + (datalayer_extended.meb.charging_active ? "active" : "not active");
content += String(" Balancing: ");
switch (datalayer_extended.meb.balancing_active) {
case 0:
content += String("init");
break;
case 1:
content += String("active");
break;
case 2:
content += String("inactive");
break;
default:
content += String("?");
}
content +=
String(" Slow charging: ") + (datalayer_extended.meb.balancing_request ? "requested" : "not requested");
content += " Diagnostic: ";
switch (datalayer_extended.meb.battery_diagnostic) {
case 0:
content += String("Init");
break;
case 1:
content += String("Battery display");
break;
case 4:
content += String("Battery display OK");
break;
case 6:
content += String("Battery display check");
break;
case 7:
content += String("Fault");
break;
default:
content += String("?");
}
content += " HV line status: ";
switch (datalayer_extended.meb.status_HV_line) {
case 0:
content += String("Init");
break;
case 1:
content += String("No open HV line detected");
break;
case 2:
content += String("Open HV line");
break;
case 3:
content += String("Fault");
break;
default:
content += String("? ") + String(datalayer_extended.meb.status_HV_line);
}
content += " ";
content += datalayer_extended.meb.BMS_fault_performance ? "BMS fault performance: Active! "
: "BMS fault performance: Off ";
content += datalayer_extended.meb.BMS_fault_emergency_shutdown_crash
? "BMS fault emergency shutdown crash: Active! "
: "BMS fault emergency shutdown crash: Off ";
content += datalayer_extended.meb.BMS_error_shutdown_request ? "BMS error shutdown request: Active! "
: "BMS error shutdown request: Inactive ";
content += datalayer_extended.meb.BMS_error_shutdown ? "BMS error shutdown: Active! "
: "BMS error shutdown: Off ";
content += "Welded contactors: ";
switch (datalayer_extended.meb.BMS_welded_contactors_status) {
case 0:
content += String("Init");
break;
case 1:
content += String("No contactor welded");
break;
case 2:
content += String("At least 1 contactor welded");
break;
case 3:
content += String("Protection status detection error");
break;
default:
content += String("?");
}
content += " Warning support: ";
switch (datalayer_extended.meb.warning_support) {
case 0:
content += String("OK");
break;
case 1:
content += String("Not OK");
break;
case 6:
content += String("Init");
break;
case 7:
content += String("Fault");
break;
default:
content += String("?");
}
content += " Interm. Voltage (" + String(datalayer_extended.meb.BMS_voltage_intermediate_dV / 10.0, 1) +
"V) status: ";
switch (datalayer_extended.meb.BMS_status_voltage_free) {
case 0:
content += String("Init");
break;
case 1:
content += String("BMS interm circuit voltage free (U<20V)");
break;
case 2:
content += String("BMS interm circuit not voltage free (U >= 25V)");
break;
case 3:
content += String("Error");
break;
default:
content += String("?");
}
content += " DC chargeport Voltage: " + String(datalayer_extended.meb.BMS_voltage_HV_charge_port_dV / 10.0, 1);
content += " BMS error status: ";
switch (datalayer_extended.meb.BMS_error_status) {
case 0:
content += String("Component IO");
break;
case 1:
content += String("Iso Error 1");
break;
case 2:
content += String("Iso Error 2");
break;
case 3:
content += String("Interlock");
break;
case 4:
content += String("SD");
break;
case 5:
content += String("Performance red");
break;
case 6:
content += String("No component function");
break;
case 7:
content += String("Init");
break;
default:
content += String("?");
}
content += " BMS voltage: " + String(datalayer_extended.meb.BMS_voltage_dV / 10.0, 1) + " ";
content += datalayer_extended.meb.BMS_OBD_MIL ? "OBD MIL: ON! " : "OBD MIL: Off ";
content +=
datalayer_extended.meb.BMS_error_lamp_req ? "Red error lamp: ON! " : "Red error lamp: Off ";
content += datalayer_extended.meb.BMS_warning_lamp_req ? "Yellow warning lamp: ON! "
: "Yellow warning lamp: Off ";
content += "Isolation resistance: " + String(datalayer_extended.meb.isolation_resistance) + " kOhm ";
content +=
datalayer_extended.meb.battery_heating ? "Battery heating: Active! " : "Battery heating: Off ";
const char* rt_enum[] = {"No", "Error level 1", "Error level 2", "Error level 3"};
content += "Overcurrent: " + String(rt_enum[datalayer_extended.meb.rt_overcurrent & 0x03]) + " ";
content += "CAN fault: " + String(rt_enum[datalayer_extended.meb.rt_CAN_fault & 0x03]) + " ";
content += "Overcharged: " + String(rt_enum[datalayer_extended.meb.rt_overcharge & 0x03]) + " ";
content += "SOC too high: " + String(rt_enum[datalayer_extended.meb.rt_SOC_high & 0x03]) + " ";
content += "SOC too low: " + String(rt_enum[datalayer_extended.meb.rt_SOC_low & 0x03]) + " ";
content += "SOC jumping: " + String(rt_enum[datalayer_extended.meb.rt_SOC_jumping & 0x03]) + " ";
content += "Temp difference: " + String(rt_enum[datalayer_extended.meb.rt_temp_difference & 0x03]) + " ";
content += "Cell overtemp: " + String(rt_enum[datalayer_extended.meb.rt_cell_overtemp & 0x03]) + " ";
content += "Cell undertemp: " + String(rt_enum[datalayer_extended.meb.rt_cell_undertemp & 0x03]) + " ";
content +=
"Battery overvoltage: " + String(rt_enum[datalayer_extended.meb.rt_battery_overvolt & 0x03]) + " ";
content +=
"Battery undervoltage: " + String(rt_enum[datalayer_extended.meb.rt_battery_undervol & 0x03]) + " ";
content += "Cell overvoltage: " + String(rt_enum[datalayer_extended.meb.rt_cell_overvolt & 0x03]) + " ";
content += "Cell undervoltage: " + String(rt_enum[datalayer_extended.meb.rt_cell_undervol & 0x03]) + " ";
content += "Cell imbalance: " + String(rt_enum[datalayer_extended.meb.rt_cell_imbalance & 0x03]) + " ";
content +=
"Battery unathorized: " + String(rt_enum[datalayer_extended.meb.rt_battery_unathorized & 0x03]) + " ";
content +=
"Battery temperature: " + String(datalayer_extended.meb.battery_temperature_dC / 10.f, 1) + " °C ";
for (int i = 0; i < 3; i++) {
content += "Temperature points " + String(i * 6 + 1) + "-" + String(i * 6 + 6) + " :";
for (int j = 0; j < 6; j++)
content += " " + String(datalayer_extended.meb.temp_points[i * 6 + j], 1);
content += " °C ";
}
bool temps_done = false;
for (int i = 0; i < 7 && !temps_done; i++) {
content += "Cell temperatures " + String(i * 8 + 1) + "-" + String(i * 8 + 8) + " :";
for (int j = 0; j < 8; j++) {
if (datalayer_extended.meb.celltemperature_dC[i * 8 + j] == 865) {
temps_done = true;
break;
} else {
content += " " + String(datalayer_extended.meb.celltemperature_dC[i * 8 + j] / 10.f, 1);
}
}
content += " °C ";
}
content +=
"Total charged: " + String(datalayer.battery.status.total_charged_battery_Wh / 1000.0, 1) + " kWh ";
content += "Total discharged: " + String(datalayer.battery.status.total_discharged_battery_Wh / 1000.0, 1) +
" kWh ";
content += "Battery efficiency: " + String(((float)( -1 * datalayer.battery.status.total_discharged_battery_Wh + datalayer.battery.status.remaining_capacity_Wh)) / datalayer.battery.status.total_charged_battery_Wh * 100, 2) +
" % ";
#endif //MEB_BATTERY
#ifdef RENAULT_ZOE_GEN2_BATTERY
content += "soc: " + String(datalayer_extended.zoePH2.battery_soc) + " ";
content += "usable soc: " + String(datalayer_extended.zoePH2.battery_usable_soc) + " ";
content += "soh: " + String(datalayer_extended.zoePH2.battery_soh) + " ";
content += "pack voltage: " + String(datalayer_extended.zoePH2.battery_pack_voltage) + " ";
content += "max cell voltage: " + String(datalayer_extended.zoePH2.battery_max_cell_voltage) + " ";
content += "min cell voltage: " + String(datalayer_extended.zoePH2.battery_min_cell_voltage) + " ";
content += "12v: " + String(datalayer_extended.zoePH2.battery_12v) + " ";
content += "avg temp: " + String(datalayer_extended.zoePH2.battery_avg_temp) + " ";
content += "min temp: " + String(datalayer_extended.zoePH2.battery_min_temp) + " ";
content += "max temp: " + String(datalayer_extended.zoePH2.battery_max_temp) + " ";
content += "max power: " + String(datalayer_extended.zoePH2.battery_max_power) + " ";
content += "interlock: " + String(datalayer_extended.zoePH2.battery_interlock) + " ";
content += "kwh: " + String(datalayer_extended.zoePH2.battery_kwh) + " ";
content += "current: " + String(datalayer_extended.zoePH2.battery_current) + " ";
content += "current offset: " + String(datalayer_extended.zoePH2.battery_current_offset) + " ";
content += "max generated: " + String(datalayer_extended.zoePH2.battery_max_generated) + " ";
content += "max available: " + String(datalayer_extended.zoePH2.battery_max_available) + " ";
content += "current voltage: " + String(datalayer_extended.zoePH2.battery_current_voltage) + " ";
content += "charging status: " + String(datalayer_extended.zoePH2.battery_charging_status) + " ";
content += "remaining charge: " + String(datalayer_extended.zoePH2.battery_remaining_charge) + " ";
content +=
"balance capacity total: " + String(datalayer_extended.zoePH2.battery_balance_capacity_total) + " ";
content += "balance time total: " + String(datalayer_extended.zoePH2.battery_balance_time_total) + " ";
content +=
"balance capacity sleep: " + String(datalayer_extended.zoePH2.battery_balance_capacity_sleep) + " ";
content += "balance time sleep: " + String(datalayer_extended.zoePH2.battery_balance_time_sleep) + " ";
content +=
"balance capacity wake: " + String(datalayer_extended.zoePH2.battery_balance_capacity_wake) + " ";
content += "balance time wake: " + String(datalayer_extended.zoePH2.battery_balance_time_wake) + " ";
content += "bms state: " + String(datalayer_extended.zoePH2.battery_bms_state) + " ";
content += "balance switches: " + String(datalayer_extended.zoePH2.battery_balance_switches) + " ";
content += "energy complete: " + String(datalayer_extended.zoePH2.battery_energy_complete) + " ";
content += "energy partial: " + String(datalayer_extended.zoePH2.battery_energy_partial) + " ";
content += "slave failures: " + String(datalayer_extended.zoePH2.battery_slave_failures) + " ";
content += "mileage: " + String(datalayer_extended.zoePH2.battery_mileage) + " ";
content += "fan speed: " + String(datalayer_extended.zoePH2.battery_fan_speed) + " ";
content += "fan period: " + String(datalayer_extended.zoePH2.battery_fan_period) + " ";
content += "fan control: " + String(datalayer_extended.zoePH2.battery_fan_control) + " ";
content += "fan duty: " + String(datalayer_extended.zoePH2.battery_fan_duty) + " ";
content += "temporisation: " + String(datalayer_extended.zoePH2.battery_temporisation) + " ";
content += "time: " + String(datalayer_extended.zoePH2.battery_time) + " ";
content += "pack time: " + String(datalayer_extended.zoePH2.battery_pack_time) + " ";
content += "soc min: " + String(datalayer_extended.zoePH2.battery_soc_min) + " ";
content += "soc max: " + String(datalayer_extended.zoePH2.battery_soc_max) + " ";
#endif //RENAULT_ZOE_GEN2_BATTERY
#ifdef VOLVO_SPA_BATTERY
content += "BECM reported SOC: " + String(datalayer_extended.VolvoPolestar.soc_bms) + " ";
content += "Calculated SOC: " + String(datalayer_extended.VolvoPolestar.soc_calc) + " ";
content += "Rescaled SOC: " + String(datalayer_extended.VolvoPolestar.soc_rescaled / 10) + " ";
content += "BECM reported SOH: " + String(datalayer_extended.VolvoPolestar.soh_bms) + " ";
content += "BECM supply voltage: " + String(datalayer_extended.VolvoPolestar.BECMsupplyVoltage) + " mV ";
content += "HV voltage: " + String(datalayer_extended.VolvoPolestar.BECMBatteryVoltage) + " V ";
content += "HV current: " + String(datalayer_extended.VolvoPolestar.BECMBatteryCurrent) + " A ";
content += "Dynamic max voltage: " + String(datalayer_extended.VolvoPolestar.BECMUDynMaxLim) + " V ";
content += "Dynamic min voltage: " + String(datalayer_extended.VolvoPolestar.BECMUDynMinLim) + " V ";
content +=
"Discharge power limit 1: " + String(datalayer_extended.VolvoPolestar.HvBattPwrLimDcha1) + " kW ";
content +=
"Discharge soft power limit: " + String(datalayer_extended.VolvoPolestar.HvBattPwrLimDchaSoft) + " kW ";
content +=
"Discharge power limit slow aging: " + String(datalayer_extended.VolvoPolestar.HvBattPwrLimDchaSlowAgi) +
" kW ";
content +=
"Charge power limit slow aging: " + String(datalayer_extended.VolvoPolestar.HvBattPwrLimChrgSlowAgi) +
" kW ";
content += "HV system relay status: ";
switch (datalayer_extended.VolvoPolestar.HVSysRlySts) {
case 0:
content += String("Open");
break;
case 1:
content += String("Closed");
break;
case 2:
content += String("KeepStatus");
break;
case 3:
content += String("OpenAndRequestActiveDischarge");
break;
default:
content += String("Not valid");
}
content += " HV system relay status 1: ";
switch (datalayer_extended.VolvoPolestar.HVSysDCRlySts1) {
case 0:
content += String("Open");
break;
case 1:
content += String("Closed");
break;
case 2:
content += String("KeepStatus");
break;
case 3:
content += String("Fault");
break;
default:
content += String("Not valid");
}
content += " HV system relay status 2: ";
switch (datalayer_extended.VolvoPolestar.HVSysDCRlySts2) {
case 0:
content += String("Open");
break;
case 1:
content += String("Closed");
break;
case 2:
content += String("KeepStatus");
break;
case 3:
content += String("Fault");
break;
default:
content += String("Not valid");
}
content += " HV system isolation resistance monitoring status: ";
switch (datalayer_extended.VolvoPolestar.HVSysIsoRMonrSts) {
case 0:
content += String("Not valid 1");
break;
case 1:
content += String("False");
break;
case 2:
content += String("True");
break;
case 3:
content += String("Not valid 2");
break;
default:
content += String("Not valid");
}
content += "Erase DTC ";
content += "Read DTC (result must be checked in CANlog) ";
content += "Restart BECM module ";
#endif // VOLVO_SPA_BATTERY
#ifdef VOLVO_SPA_HYBRID_BATTERY
content += "BECM reported SOC: " + String(datalayer_extended.VolvoHybrid.soc_bms) + " ";
content += "Calculated SOC: " + String(datalayer_extended.VolvoHybrid.soc_calc) + " ";
content += "Rescaled SOC: " + String(datalayer_extended.VolvoHybrid.soc_rescaled / 10) + " ";
content += "BECM reported SOH: " + String(datalayer_extended.VolvoHybrid.soh_bms) + " ";
content += "BECM supply voltage: " + String(datalayer_extended.VolvoHybrid.BECMsupplyVoltage) + " mV ";
content += "HV voltage: " + String(datalayer_extended.VolvoHybrid.BECMBatteryVoltage) + " V ";
content += "HV current: " + String(datalayer_extended.VolvoHybrid.BECMBatteryCurrent) + " A ";
content += "Dynamic max voltage: " + String(datalayer_extended.VolvoHybrid.BECMUDynMaxLim) + " V ";
content += "Dynamic min voltage: " + String(datalayer_extended.VolvoHybrid.BECMUDynMinLim) + " V ";
content += "Discharge power limit 1: " + String(datalayer_extended.VolvoHybrid.HvBattPwrLimDcha1) + " kW ";
content +=
"Discharge soft power limit: " + String(datalayer_extended.VolvoHybrid.HvBattPwrLimDchaSoft) + " kW ";
content += "HV system relay status: ";
switch (datalayer_extended.VolvoHybrid.HVSysRlySts) {
case 0:
content += String("Open");
break;
case 1:
content += String("Closed");
break;
case 2:
content += String("KeepStatus");
break;
case 3:
content += String("OpenAndRequestActiveDischarge");
break;
default:
content += String("Not valid");
}
content += " HV system relay status 1: ";
switch (datalayer_extended.VolvoHybrid.HVSysDCRlySts1) {
case 0:
content += String("Open");
break;
case 1:
content += String("Closed");
break;
case 2:
content += String("KeepStatus");
break;
case 3:
content += String("Fault");
break;
default:
content += String("Not valid");
}
content += " HV system relay status 2: ";
switch (datalayer_extended.VolvoHybrid.HVSysDCRlySts2) {
case 0:
content += String("Open");
break;
case 1:
content += String("Closed");
break;
case 2:
content += String("KeepStatus");
break;
case 3:
content += String("Fault");
break;
default:
content += String("Not valid");
}
content += " HV system isolation resistance monitoring status: ";
switch (datalayer_extended.VolvoHybrid.HVSysIsoRMonrSts) {
case 0:
content += String("Not valid 1");
break;
case 1:
content += String("False");
break;
case 2:
content += String("True");
break;
case 3:
content += String("Not valid 2");
break;
default:
content += String("Not valid");
}
content += "Erase DTC ";
content += "Read DTC (result must be checked in CANlog) ";
content += "Restart BECM module ";
#endif // VOLVO_SPA_HYBRID_BATTERY
#if !defined(BMW_PHEV_BATTERY) && !defined(BMW_IX_BATTERY) && !defined(BOLT_AMPERA_BATTERY) && \
!defined(TESLA_BATTERY) && !defined(NISSAN_LEAF_BATTERY) && !defined(BMW_I3_BATTERY) && \
!defined(BYD_ATTO_3_BATTERY) && !defined(RENAULT_ZOE_GEN2_BATTERY) && !defined(CELLPOWER_BMS) && \
!defined(MEB_BATTERY) && !defined(VOLVO_SPA_BATTERY) && !defined(VOLVO_SPA_HYBRID_BATTERY) && \
!defined(KIA_HYUNDAI_64_BATTERY) && !defined(CMFA_EV_BATTERY) //Only the listed types have extra info
content += "No extra information available for this battery type";
#endif
content += " ";
content += "";
content += "";
content += "";
content += "";
content += "";
content += "";
// Additial functions added
content += "";
return content;
}
return String();
}