#include "advanced_battery_html.h" #include #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 += ""; // 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 += ""; content += ""; //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 += ""; 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 += "


"; content += "
"; content += ""; #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 += "


"; content += "
"; content += ""; #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(); }