#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 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 BYD_ATTO_3_BATTERY 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) + "

"; #endif //BYD_ATTO_3_BATTERY #ifdef TESLA_BATTERY static const char* contactorText[] = {"UNKNOWN(0)", "OPEN", "CLOSING", "BLOCKED", "OPENING", "CLOSED", "UNKNOWN(6)", "WELDED", "POS_CL", "NEG_CL", "UNKNOWN(10)", "UNKNOWN(11)", "UNKNOWN(12)"}; content += "

Contactor Status: " + String(contactorText[datalayer_extended.tesla.status_contactor]) + "

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

HVIL: " + String(hvilStatusState[datalayer_extended.tesla.hvil_status]) + "

"; static const char* contactorState[] = {"SNA", "OPEN", "PRECHARGE", "BLOCKED", "PULLED_IN", "OPENING", "ECONOMIZED", "WELDED", "UNKNOWN(8)", "UNKNOWN(9)", "UNKNOWN(10)", "UNKNOWN(11)"}; content += "

Negative contactor: " + String(contactorState[datalayer_extended.tesla.packContNegativeState]) + "

"; content += "

Positive contactor: " + String(contactorState[datalayer_extended.tesla.packContPositiveState]) + "

"; static const char* falseTrue[] = {"False", "True"}; content += "

Closing allowed?: " + String(falseTrue[datalayer_extended.tesla.packCtrsClosingAllowed]) + "

"; content += "

Pyrotest: " + String(falseTrue[datalayer_extended.tesla.pyroTestInProgress]) + "

"; #endif #ifdef NISSAN_LEAF_BATTERY content += "

LEAF generation: " + String(datalayer_extended.nissanleaf.LEAF_gen) + "

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

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 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 #if !defined(TESLA_BATTERY) && !defined(NISSAN_LEAF_BATTERY) && !defined(BMW_I3_BATTERY) && \ !defined(BYD_ATTO_3_BATTERY) && !defined(RENAULT_ZOE_GEN2_BATTERY) && !defined(CELLPOWER_BMS) content += "No extra information available for this battery type"; #endif content += "
"; content += ""; return content; } return String(); }