From 35bf3c799c29a7ba00b85067ddb251d946f6c7a0 Mon Sep 17 00:00:00 2001 From: Manu Evans Date: Wed, 19 Aug 2026 17:18:12 +1000 Subject: [PATCH] obd: MG ZS EV vehicle profile Full enumeration of the UDS did space at 0x7E3; unidentified dids are carried raw and hidden so polling records a history to diff across vehicle states. --- obd_profiles/mg_zs_ev.conf | 266 +++++++++++++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 obd_profiles/mg_zs_ev.conf diff --git a/obd_profiles/mg_zs_ev.conf b/obd_profiles/mg_zs_ev.conf new file mode 100644 index 0000000..41993e3 --- /dev/null +++ b/obd_profiles/mg_zs_ev.conf @@ -0,0 +1,266 @@ +# +# MG ZS EV vehicle profile +# +# Everything here is read from the VCU at 0x7E3 (replies 0x7EB) using UDS +# ReadDataByIdentifier. On this vehicle the OBD gateway exposes exactly one +# diagnostically reachable ECU: an enumeration of every request address in +# 0x700-0x7FF answered only at 0x7DF and 0x7E3. The BMS documented at 0x781 in +# older MG datasets does not respond here, with the CAN receive filter fully +# open (ATCF 000 / ATCM 000), so pack SOC is not reachable by that route. +# +# Legend: +# obd: mode, pid, offset, type [, ecu=] +# +# The did space was enumerated by sweeping 0xB000-0xBFFF at 0x7E3; unsupported +# dids answer 0x7F 0x22 0x31, so the 111 dids below are an exhaustive map of +# the page rather than a guess. Dids whose meaning is not yet established are +# carried raw and hidden: polling them records a history that can be diffed +# across vehicle states (parked, charging, ready, driving) to identify them. +# +# Signals biased by a zero point (speed BA00 is (raw-20000)/100, and the pack +# currents use 20000/32767/40000 offsets) are carried raw pending bias support +# in the value-spec grammar, as the J1979 A-40 temperatures are. +# + +elements: + obd: 0x22, 0xB000, 0, u8, ecu=0x7E3 desc: did_b000, , low, "Unknown B000" + obd: 0x22, 0xB001, 0, u8, ecu=0x7E3 desc: did_b001, , low, "Unknown B001" + obd: 0x22, 0xB002, 0, u8, ecu=0x7E3 desc: did_b002, , low, "Unknown B002" + obd: 0x22, 0xB003, 0, u16, ecu=0x7E3 desc: did_b003, , low, "Unknown B003" + obd: 0x22, 0xB007, 0, u16, ecu=0x7E3 desc: did_b007, , low, "Unknown B007" + obd: 0x22, 0xB00C, 0, u16:0.01V, ecu=0x7E3 desc: hv_voltage, V, medium, "HV Pack Voltage" + obd: 0x22, 0xB00D, 0, u16, ecu=0x7E3 desc: did_b00d, , low, "Unknown B00D" + obd: 0x22, 0xB00E, 0, u16, ecu=0x7E3 desc: did_b00e, , low, "Unknown B00E" + obd: 0x22, 0xB00F, 0, u16, ecu=0x7E3 desc: did_b00f, , low, "Unknown B00F" + obd: 0x22, 0xB010, 0, u16, ecu=0x7E3 desc: did_b010, , low, "Unknown B010" + obd: 0x22, 0xB011, 0, u8, ecu=0x7E3 desc: did_b011, , low, "Unknown B011" + obd: 0x22, 0xB014, 0, u8, ecu=0x7E3 desc: did_b014, , low, "Unknown B014" + obd: 0x22, 0xB080, 0, u16, ecu=0x7E3 desc: did_b080, , low, "Unknown B080" + obd: 0x22, 0xB081, 0, u16, ecu=0x7E3 desc: did_b081, , low, "Unknown B081" + obd: 0x22, 0xB100, 0, u16, ecu=0x7E3 desc: did_b100, , low, "Unknown B100" + obd: 0x22, 0xB101, 0, u16, ecu=0x7E3 desc: did_b101, , low, "Unknown B101" + obd: 0x22, 0xB102, 0, u16, ecu=0x7E3 desc: did_b102, , low, "Unknown B102" + obd: 0x22, 0xB103, 0, u16, ecu=0x7E3 desc: did_b103, , low, "Unknown B103" + obd: 0x22, 0xB104, 0, u16, ecu=0x7E3 desc: did_b104, , low, "Unknown B104" + obd: 0x22, 0xB120, 0, u16, ecu=0x7E3 desc: did_b120, , low, "Unknown B120" + obd: 0x22, 0xB140, 0, u8, ecu=0x7E3 desc: did_b140, , low, "Unknown B140" + obd: 0x22, 0xB141, 0, u8, ecu=0x7E3 desc: did_b141, , low, "Unknown B141" + obd: 0x22, 0xB142, 0, u8, ecu=0x7E3 desc: did_b142, , low, "Unknown B142" + obd: 0x22, 0xB180, 0, u8, ecu=0x7E3 desc: did_b180, , low, "Unknown B180" + obd: 0x22, 0xB181, 0, u8, ecu=0x7E3 desc: did_b181, , low, "Unknown B181" + obd: 0x22, 0xB182, 0, u16:0.01V, ecu=0x7E3 desc: aux_voltage, V, medium, "Auxiliary Bus Voltage" + obd: 0x22, 0xB188, 0, u8, ecu=0x7E3 desc: did_b188, , low, "Unknown B188" + obd: 0x22, 0xB18B, 0, u8, ecu=0x7E3 desc: did_b18b, , low, "Unknown B18B" + obd: 0x22, 0xB18C, 0, u8, ecu=0x7E3 desc: did_b18c, , low, "Unknown B18C" + obd: 0x22, 0xB18D, 0, u8, ecu=0x7E3 desc: did_b18d, , low, "Unknown B18D" + obd: 0x22, 0xB18E, 0, u8, ecu=0x7E3 desc: did_b18e, , low, "Unknown B18E" + obd: 0x22, 0xB18F, 0, u8, ecu=0x7E3 desc: did_b18f, , low, "Unknown B18F" + obd: 0x22, 0xB193, 0, u8, ecu=0x7E3 desc: did_b193, , low, "Unknown B193" + obd: 0x22, 0xB194, 0, u8, ecu=0x7E3 desc: did_b194, , low, "Unknown B194" + obd: 0x22, 0xB195, 0, u8, ecu=0x7E3 desc: did_b195, , low, "Unknown B195" + obd: 0x22, 0xB1A0, 0, u8, ecu=0x7E3 desc: did_b1a0, , low, "Unknown B1A0" + obd: 0x22, 0xB1A2, 0, u8, ecu=0x7E3 desc: did_b1a2, , low, "Unknown B1A2" + obd: 0x22, 0xB1A3, 0, u8, ecu=0x7E3 desc: did_b1a3, , low, "Unknown B1A3" + obd: 0x22, 0xB309, 0, u8, ecu=0x7E3 desc: did_b309, , low, "Unknown B309" + obd: 0x22, 0xB400, 0, u8, ecu=0x7E3 desc: did_b400, , low, "Unknown B400" + obd: 0x22, 0xB403, 0, u16, ecu=0x7E3 desc: did_b403, , low, "Unknown B403" + obd: 0x22, 0xB404, 0, u16, ecu=0x7E3 desc: did_b404, , low, "Unknown B404" + obd: 0x22, 0xB405, 0, u8, ecu=0x7E3 desc: did_b405, , low, "Unknown B405" + obd: 0x22, 0xB407, 0, u8, ecu=0x7E3 desc: did_b407, , low, "Unknown B407" + obd: 0x22, 0xB40A, 0, u8, ecu=0x7E3 desc: did_b40a, , low, "Unknown B40A" + obd: 0x22, 0xB40C, 0, u8, ecu=0x7E3 desc: did_b40c, , low, "Unknown B40C" + obd: 0x22, 0xB40E, 0, u8, ecu=0x7E3 desc: did_b40e, , low, "Unknown B40E" + obd: 0x22, 0xB480, 0, u8, ecu=0x7E3 desc: did_b480, , low, "Unknown B480" + obd: 0x22, 0xB483, 0, u16, ecu=0x7E3 desc: did_b483, , low, "Unknown B483" + obd: 0x22, 0xB484, 0, u16, ecu=0x7E3 desc: did_b484, , low, "Unknown B484" + obd: 0x22, 0xB580, 0, u8, ecu=0x7E3 desc: did_b580, , low, "Unknown B580" + obd: 0x22, 0xB582, 0, u16, ecu=0x7E3 desc: dcdc_hv_raw, , medium, "DC/DC HV Side (raw)" + obd: 0x22, 0xB583, 0, u16:0.1A, ecu=0x7E3 desc: dcdc_out_current, A, medium, "DC/DC Output Current" + obd: 0x22, 0xB584, 0, u16:0.1V, ecu=0x7E3 desc: dcdc_out_voltage, V, medium, "DC/DC Output Voltage" + obd: 0x22, 0xB587, 0, u8, ecu=0x7E3 desc: did_b587, , low, "Unknown B587" + obd: 0x22, 0xB5D0, 0, u8, ecu=0x7E3 desc: did_b5d0, , low, "Unknown B5D0" + obd: 0x22, 0xB700, 0, u16, ecu=0x7E3 desc: did_b700, , low, "Unknown B700" + obd: 0x22, 0xB701, 0, u16, ecu=0x7E3 desc: did_b701, , low, "Unknown B701" + obd: 0x22, 0xB702, 0, u8, ecu=0x7E3 desc: did_b702, , low, "Unknown B702" + obd: 0x22, 0xB703, 0, u8, ecu=0x7E3 desc: hv_contactor, , high, "HV Contactor State" + obd: 0x22, 0xB705, 0, u16, ecu=0x7E3 desc: did_b705, , low, "Unknown B705" + obd: 0x22, 0xB706, 0, u16, ecu=0x7E3 desc: did_b706, , low, "Unknown B706" + obd: 0x22, 0xB70C, 0, u16, ecu=0x7E3 desc: did_b70c, , low, "Unknown B70C" + obd: 0x22, 0xB70D, 0, u16, ecu=0x7E3 desc: did_b70d, , low, "Unknown B70D" + obd: 0x22, 0xB70E, 0, u16, ecu=0x7E3 desc: did_b70e, , low, "Unknown B70E" + obd: 0x22, 0xB70F, 0, u16, ecu=0x7E3 desc: did_b70f, , low, "Unknown B70F" + obd: 0x22, 0xB710, 0, u16, ecu=0x7E3 desc: charge_limit, , medium, "Charge Limit (raw)" + obd: 0x22, 0xB711, 0, u16, ecu=0x7E3 desc: did_b711, , low, "Unknown B711" + obd: 0x22, 0xB712, 0, u16, ecu=0x7E3 desc: charge_power_max, , medium, "Max Charge Power (raw)" + obd: 0x22, 0xB713, 0, u16, ecu=0x7E3 desc: did_b713, , low, "Unknown B713" + obd: 0x22, 0xB717, 0, u8, ecu=0x7E3 desc: charge_flag, , high, "Charge Flag" + obd: 0x22, 0xB71B, 0, u8, ecu=0x7E3 desc: charge_state, , high, "Charge State" + obd: 0x22, 0xB780, 0, u8, ecu=0x7E3 desc: did_b780, , low, "Unknown B780" + obd: 0x22, 0xB781, 0, u8, ecu=0x7E3 desc: did_b781, , low, "Unknown B781" + obd: 0x22, 0xB900, 0, u8, ecu=0x7E3 desc: did_b900, , low, "Unknown B900" + obd: 0x22, 0xB904, 0, u8, ecu=0x7E3 desc: did_b904, , low, "Unknown B904" + obd: 0x22, 0xB981, 0, u16, ecu=0x7E3 desc: did_b981, , low, "Unknown B981" + obd: 0x22, 0xBA00, 0, u16, ecu=0x7E3 desc: speed_raw, , medium, "Vehicle Speed (raw, biased 20000)" + obd: 0x22, 0xBA01, 0, u16, ecu=0x7E3 desc: did_ba01, , low, "Unknown BA01" + obd: 0x22, 0xBA02, 0, u8, ecu=0x7E3 desc: did_ba02, , low, "Unknown BA02" + obd: 0x22, 0xBA40, 0, u8, ecu=0x7E3 desc: did_ba40, , low, "Unknown BA40" + obd: 0x22, 0xBA41, 0, u8, ecu=0x7E3 desc: did_ba41, , low, "Unknown BA41" + obd: 0x22, 0xBB01, 0, u16, ecu=0x7E3 desc: did_bb01, , low, "Unknown BB01" + obd: 0x22, 0xBB02, 0, u8, ecu=0x7E3 desc: did_bb02, , low, "Unknown BB02" + obd: 0x22, 0xBB05, 0, u8, ecu=0x7E3 desc: did_bb05, , low, "Unknown BB05" + obd: 0x22, 0xBB06, 0, u8, ecu=0x7E3 desc: did_bb06, , low, "Unknown BB06" + obd: 0x22, 0xBB0A, 0, u16, ecu=0x7E3 desc: did_bb0a, , low, "Unknown BB0A" + obd: 0x22, 0xBB80, 0, u16, ecu=0x7E3 desc: did_bb80, , low, "Unknown BB80" + obd: 0x22, 0xBB89, 0, u8, ecu=0x7E3 desc: did_bb89, , low, "Unknown BB89" + obd: 0x22, 0xBB8E, 0, u16, ecu=0x7E3 desc: did_bb8e, , low, "Unknown BB8E" + obd: 0x22, 0xBB90, 0, u8, ecu=0x7E3 desc: did_bb90, , low, "Unknown BB90" + obd: 0x22, 0xBB91, 0, u8, ecu=0x7E3 desc: did_bb91, , low, "Unknown BB91" + obd: 0x22, 0xBB93, 0, str19, ecu=0x7E3 desc: did_bb93, , low, "Unknown BB93" + obd: 0x22, 0xBB94, 0, str19, ecu=0x7E3 desc: did_bb94, , low, "Unknown BB94" + obd: 0x22, 0xBB96, 0, str19, ecu=0x7E3 desc: did_bb96, , low, "Unknown BB96" + obd: 0x22, 0xBB97, 0, str19, ecu=0x7E3 desc: did_bb97, , low, "Unknown BB97" + obd: 0x22, 0xBB99, 0, str19, ecu=0x7E3 desc: did_bb99, , low, "Unknown BB99" + obd: 0x22, 0xBB9A, 0, str19, ecu=0x7E3 desc: did_bb9a, , low, "Unknown BB9A" + obd: 0x22, 0xBC00, 0, u8, ecu=0x7E3 desc: did_bc00, , low, "Unknown BC00" + obd: 0x22, 0xBC01, 0, u8, ecu=0x7E3 desc: did_bc01, , low, "Unknown BC01" + obd: 0x22, 0xBC02, 0, u8, ecu=0x7E3 desc: did_bc02, , low, "Unknown BC02" + obd: 0x22, 0xBC03, 0, u8, ecu=0x7E3 desc: did_bc03, , low, "Unknown BC03" + obd: 0x22, 0xBC04, 0, u8, ecu=0x7E3 desc: did_bc04, , low, "Unknown BC04" + obd: 0x22, 0xBC05, 0, u8, ecu=0x7E3 desc: did_bc05, , low, "Unknown BC05" + obd: 0x22, 0xBC06, 0, u8, ecu=0x7E3 desc: did_bc06, , low, "Unknown BC06" + obd: 0x22, 0xBC0B, 0, u16, ecu=0x7E3 desc: did_bc0b, , low, "Unknown BC0B" + obd: 0x22, 0xBC0C, 0, u16, ecu=0x7E3 desc: did_bc0c, , low, "Unknown BC0C" + obd: 0x22, 0xBC0D, 0, u16, ecu=0x7E3 desc: did_bc0d, , low, "Unknown BC0D" + obd: 0x22, 0xBC0E, 0, u16, ecu=0x7E3 desc: did_bc0e, , low, "Unknown BC0E" + obd: 0x22, 0xBC0F, 0, u16, ecu=0x7E3 desc: did_bc0f, , low, "Unknown BC0F" + obd: 0x22, 0xBC10, 0, u16, ecu=0x7E3 desc: did_bc10, , low, "Unknown BC10" + obd: 0x09, 0x02, 1, str17 desc: vin, , const, "VIN" + +device-template: + component: + id: info + template: DeviceInfo + element: type, "vehicle" + element: manufacturer_name, "MG" + element: model_name, "ZS EV" + element-map: vin, @vin + component: + id: battery + element-map: voltage, @hv_voltage + element-map: contactor, @hv_contactor + component: + id: charging + element-map: state, @charge_state + element-map: active, @charge_flag + element-map: power_max, @charge_power_max + element-map: limit, @charge_limit + component: + id: aux + element-map: voltage, @aux_voltage + element-map: dcdc_voltage, @dcdc_out_voltage + element-map: dcdc_current, @dcdc_out_current + element-map: dcdc_hv, @dcdc_hv_raw + component: + id: raw + hidden: true + element-map: speed, @speed_raw + element-map: b000, @did_b000 + element-map: b001, @did_b001 + element-map: b002, @did_b002 + element-map: b003, @did_b003 + element-map: b007, @did_b007 + element-map: b00d, @did_b00d + element-map: b00e, @did_b00e + element-map: b00f, @did_b00f + element-map: b010, @did_b010 + element-map: b011, @did_b011 + element-map: b014, @did_b014 + element-map: b080, @did_b080 + element-map: b081, @did_b081 + element-map: b100, @did_b100 + element-map: b101, @did_b101 + element-map: b102, @did_b102 + element-map: b103, @did_b103 + element-map: b104, @did_b104 + element-map: b120, @did_b120 + element-map: b140, @did_b140 + element-map: b141, @did_b141 + element-map: b142, @did_b142 + element-map: b180, @did_b180 + element-map: b181, @did_b181 + element-map: b188, @did_b188 + element-map: b18b, @did_b18b + element-map: b18c, @did_b18c + element-map: b18d, @did_b18d + element-map: b18e, @did_b18e + element-map: b18f, @did_b18f + element-map: b193, @did_b193 + element-map: b194, @did_b194 + element-map: b195, @did_b195 + element-map: b1a0, @did_b1a0 + element-map: b1a2, @did_b1a2 + element-map: b1a3, @did_b1a3 + element-map: b309, @did_b309 + element-map: b400, @did_b400 + element-map: b403, @did_b403 + element-map: b404, @did_b404 + element-map: b405, @did_b405 + element-map: b407, @did_b407 + element-map: b40a, @did_b40a + element-map: b40c, @did_b40c + element-map: b40e, @did_b40e + element-map: b480, @did_b480 + element-map: b483, @did_b483 + element-map: b484, @did_b484 + element-map: b580, @did_b580 + element-map: b587, @did_b587 + element-map: b5d0, @did_b5d0 + element-map: b700, @did_b700 + element-map: b701, @did_b701 + element-map: b702, @did_b702 + element-map: b705, @did_b705 + element-map: b706, @did_b706 + element-map: b70c, @did_b70c + element-map: b70d, @did_b70d + element-map: b70e, @did_b70e + element-map: b70f, @did_b70f + element-map: b711, @did_b711 + element-map: b713, @did_b713 + element-map: b780, @did_b780 + element-map: b781, @did_b781 + element-map: b900, @did_b900 + element-map: b904, @did_b904 + element-map: b981, @did_b981 + element-map: ba01, @did_ba01 + element-map: ba02, @did_ba02 + element-map: ba40, @did_ba40 + element-map: ba41, @did_ba41 + element-map: bb01, @did_bb01 + element-map: bb02, @did_bb02 + element-map: bb05, @did_bb05 + element-map: bb06, @did_bb06 + element-map: bb0a, @did_bb0a + element-map: bb80, @did_bb80 + element-map: bb89, @did_bb89 + element-map: bb8e, @did_bb8e + element-map: bb90, @did_bb90 + element-map: bb91, @did_bb91 + element-map: bb93, @did_bb93 + element-map: bb94, @did_bb94 + element-map: bb96, @did_bb96 + element-map: bb97, @did_bb97 + element-map: bb99, @did_bb99 + element-map: bb9a, @did_bb9a + element-map: bc00, @did_bc00 + element-map: bc01, @did_bc01 + element-map: bc02, @did_bc02 + element-map: bc03, @did_bc03 + element-map: bc04, @did_bc04 + element-map: bc05, @did_bc05 + element-map: bc06, @did_bc06 + element-map: bc0b, @did_bc0b + element-map: bc0c, @did_bc0c + element-map: bc0d, @did_bc0d + element-map: bc0e, @did_bc0e + element-map: bc0f, @did_bc0f + element-map: bc10, @did_bc10