Toyota e-TNGA platform
Support for the Toyota e-TNGA platform. This is a shared base module, not a directly selectable vehicle: it provides the CAN polling, charging state machine, BMS handling, web UI and the common support baseline for the vehicles built on it:
Those pages list only what is specific to each vehicle; everything below is the shared baseline they inherit.
Vehicle Type: not selectable directly — select one of the vehicles above
Log tag:
v-etnga(nearly all logging; the vehicle wrappers log almost nothing of their own)Namespace:
xte
Support Overview
Function |
Support Status |
|---|---|
Hardware |
Any OVMS v3 (or later) module. |
Vehicle Cable |
OBD-II to DB9 Data Cable for OVMS (1441200 right, or 1139300 left) |
GSM Antenna |
1000500 Open Vehicles OVMS GSM Antenna (or any compatible antenna) |
GPS Antenna |
1020200 Universal GPS Antenna (SMA Connector) (or any compatible antenna) |
SOC Display |
Yes |
Range Display |
No |
GPS Location |
Yes |
Speed Display |
Yes |
Temperature Display |
Yes |
BMS v+t Display |
Yes (see note below) |
TPMS Display |
Yes |
Charge Status Display |
Yes |
Charge Interruption Alerts |
Yes (see note below) |
Charge Control |
No |
Cabin Pre-heat/cool Control |
No |
Lock/Unlock Vehicle |
No |
Valet Mode Control |
No |
Others |
VIN, charge session report, 12V auxiliary battery telemetry |
Note
Charge Interruption Alerts are produced by the OVMS framework, not by this module:
e-TNGA writes ms_v_charge_state = "stopped" whenever a charge phase ends, and the
OvmsVehicle base turns that into a charge.stopped notification. The module does
not set ms_v_charge_substate, so the notification is raised at alert priority
rather than info — including at an ordinary phase boundary, such as a scheduled
charge pausing and resuming, which is not a fault.
Note
BMS v+t Display is Yes for all e-TNGA vehicles. The base class declares the HV pack
arrangement (Toyota EM “Type B” chemistry, CATL cells, shared across the platform) and derives
the actual cell and temperature-sensor counts from the reply length of 0x182E / 0x1814
on the HV Battery ECU (0x747) at runtime, so per-cell history, deviation flags and pack
statistics work across pack variants. The 96-cell pack is arranged as 96 voltages in 4 modules
of 24, with 24 temperature sensors at 6 per module; cells are accepted between 2.5 and 4.3 V
and -30 to +60 °C, and deviation is flagged at 20 mV warn / 30 mV alert and 4 °C warn /
8 °C alert.
The pack variant follows the model year and drivetrain, not the badge — 96-cell for 2022-24, 78-cell FWD or 104-cell AWD for the 2025/26 refresh — which is why the count is derived at runtime rather than declared per vehicle. Only the 96-cell pack is on-vehicle validated.
Validation status
e-TNGA is developed against a single available vehicle — a 96-cell Subaru Solterra. Much of the decode logic is therefore derived from CAN reverse engineering rather than confirmed against an independent reference, and several pack and charging variants have no hardware behind them at all. This table records which behaviours have actually been observed on a car, so a measured behaviour can be told apart from an inferred one. The vehicle pages built on this base inherit these statuses.
- Vehicle-validated
Observed on a real vehicle, with the date of the session that confirmed it.
- Vehicle-validated (partial)
Confirmed on some code paths but not all; the unexercised path is named.
- Log-inferred
Decoded from captured CAN traffic or module logs and self-consistent, but never cross-checked against an independent ground truth — a scan tool, a published specification, or a physically known value.
- Unvalidated
Reasoned from a specification, an analogous DID, or another platform. Never exercised on hardware.
Last reviewed: 2026-08-22.
Behaviour |
Status |
Evidence / gap |
|---|---|---|
|
Vehicle-validated |
Continuous daily-driver use since 2026-06. |
|
Vehicle-validated |
Zero spurious “Vehicle is idling” alerts over a 14.6 kWh charge (2026-07-13); the true-positive path fired twice in the following week, both genuine. |
Adaptive parked-sleep cooldown backoff |
Unvalidated |
Merged, but the escalating cooldown has never been confirmed on a vehicle. |
AC charge path (handshake, wait, charging) |
Vehicle-validated |
Many sessions, including multi-phase pause/resume within one plug-in (2026-06-24). |
DC charge path |
Vehicle-validated |
Repeated DC fast charges over the 2026-07-16→19 road trip, up to 50.58 kWh (6%→84%). |
Charge port |
Vehicle-validated (partial) |
Confirmed for plug-in while already |
|
Vehicle-validated |
AC read correctly across sessions; 27 grid-log records over the 2026-07-16→19 road
trip carry |
Charge power derived from pack V×I |
Vehicle-validated |
Energy reconciliation on 2026-06-24: 88% efficiency, station 0.17 kWh vs battery 0.15 kWh, replacing earlier 52%/158% garbage. |
Charge-fault diagnostic DID dump |
Vehicle-validated (partial) |
A real fault on 2026-06-24 fired the dump and rendered decoded values. It also fired on healthy scheduled AC charges by reading a retained value; fixed 2026-08-22, the fix awaits one scheduled charge to confirm. |
CAN-stale logging/accounting suspend |
Vehicle-validated |
A real lock produced an 85 s CSV gap with no stale rows, 2026-06-24. |
DC limiting-side attribution (car vs station) |
Vehicle-validated |
15 classifications on real DC sessions over 2026-07-16→19, exercising both branches. The thresholds remain untuned against ground truth — there is no station nameplate data to check against. |
Charge-power DID scale factors |
Log-inferred |
Units inferred by analogy to the grid-power DID |
HLC handshake ( |
Log-inferred |
Labels come from CAN reverse engineering; they render correctly in the 2026-06-24 fault dump, but the enum semantics have not been cross-checked against a scan tool. |
Ambient temperature during charge ( |
Log-inferred |
Selected because the A/C ECU |
96-cell pack arrangement and per-cell decode |
Vehicle-validated |
|
78-cell and 104-cell pack variants |
Unvalidated |
No such hardware available; both are reasoned from published pack specs. The runtime auto-arrange is deliberately grow-only — it cannot shrink, because a short reply is indistinguishable from a truncated one. |
Per-cell voltage polling during AC charge |
Unvalidated |
|
|
Vehicle-validated |
Confirmed on-module 2026-08-22: the live metrics reproduce exactly from the eight raw per-module slots (197.656 Ah / 98.2875 % / 62.96 kWh). Only the 96-cell pack has an established nominal. |
|
Vehicle-validated |
The 2026-07-16→20 road trip closed the last two gaps: the DC-charge term (16 of 16 fast charges) and the 12V rising-edge wake trigger (4 clean fires). |
12V current from |
Vehicle-validated (partial) |
Direct read confirmed on-module 2026-06-21. The under-load swing is still unexercised. |
TPMS pressures and temperatures |
Vehicle-validated |
Two drive sessions on 2026-06-04 polled cleanly via the gateway relay: ~280→310 kPa, 34–38 °C, no timeouts. Zeros only before the sensors wake at drive start. |
Throttle, foot brake and park brake (Brake/EPB ECU |
Vehicle-validated |
Throttle logged 90,752 change events spanning 0–100%, foot brake 11,239 events spanning 0–100%, park brake 163 Applied / 151 Released. |
Drive mode and AWD mode (Hybrid Control ECU |
Unvalidated |
Neither metric has produced a change event in any captured log, while sibling metrics from the same ECU logged tens of thousands. Cheapest check: change drive mode once and watch for the log line. |
Poll states
The module keeps the vehicle in one of seven poll states. The state selects which PIDs are
polled and how often, which is what keeps a parked car’s 12V battery from being drained by
OVMS itself. The current state is logged on every transition under the v-etnga tag
(“Transitioning from the X to the Y state”), and is the first thing to look at when
diagnosing behaviour.
State |
Entered when |
Polling |
|---|---|---|
|
At boot; when CAN2 has been silent for about 120 s; or when a watchdog forces it |
Nothing is transmitted. The module only listens for CAN2 traffic and watches the 12V rail. A wake is deliberately edge-triggered on 12V rising past the calibrated reference, and is held off briefly after a forced sleep by an escalating cooldown, so a car that never wakes properly cannot be polled awake repeatedly. |
|
Any CAN2 frame, or a 12V rising edge |
A small keep-alive set: control mode and charge lid, park-brake status, the cable-seated signal and the pack capacity arrays. Two watchdogs bound how long this can last — 5 minutes if the charge door never opens, 15 minutes if it opened but no cable follows. |
|
The vehicle reports its control mode as driving |
The full driving set at 1 to 120 s: speed, gear, odometer, throttle and brakes, pack voltage and current, per-cell arrays, cabin climate, 12V telemetry and TPMS. |
|
The charge cable is seated and no session is already open |
Negotiation signals at 1 s, charge history and voltage type at 5 s, ambient at 30 s. |
|
Handshake did not engage within 60 s (a scheduled or delayed charge), a charge phase ended, or the cable is still seated after a wait-sleep |
The same signals slowed to 10-30 s, then nothing: after 10 minutes of waiting the module sleeps so the bus idles and 12V recovers, resuming the open session on the next wake. A wait re-entered after such a sleep sleeps again after 15 s, which keeps the duty cycle low over a long delay. A charge starting during a waking window is caught within 10 s. |
|
The charger reports AC operation running |
Live power and SOC at 1 s, the charger, grid and cabin channels at 1-5 s, 12V telemetry at 10-120 s, the heavy per-cell and capacity arrays at 30-60 s. |
|
The DC high-level communication sequence is active |
Live power and SOC at 1 s, station present voltage and current at 1 s, station caps at 5 s, 12V telemetry at 10-120 s, the arrays at 20-60 s. |
There is no direct edge between DRIVING and any charge state, and no direct edge from
DRIVING to SLEEP — those paths pass through AWAKE, which clears trip metrics on the
way. Removing the cable ends the session and returns to AWAKE — from CHARGE_AC or
CHARGE_DC by way of CHARGE_WAIT. If the cable is pulled while the module is asleep
mid-wait, the removal is reconciled on the next wake, and the session is closed then.
ms_v_charge_state follows the charge states: prepared in CHARGE_HANDSHAKE,
charging in CHARGE_AC and CHARGE_DC, stopped in CHARGE_WAIT, and done on
returning to AWAKE after energy was delivered (empty if the session was cancelled before it
started). Note that v.e.awake reads false in every charge state — the car is not
switched on — which is what stops the periodic “Vehicle is idling” notification from firing
during a charge.
Poll targets
Six ECUs are polled, all on CAN2. A PID number is only meaningful together with the ECU it is
polled on: 0x1004 is drive-mode select on the Hybrid Control ECU and tyre temperatures on
the TPMS gateway, and 0x106E is read from two different ECUs depending on the state.
ECU |
Request / reply |
Polled in |
Provides |
|---|---|---|---|
Plug-In Control System |
|
AWAKE, DRIVING and all four charge states |
23 PIDs: control mode, charge lid, the PISW cable-seated signal, the AC and DC handshake signals, SOC, charge power, station and car charge limits, charge history and outcome, My Room, and cabin power while charging. |
HV Battery |
|
AWAKE, DRIVING, AC and DC charge |
4 PIDs: BMS SOC, the per-cell voltage and temperature arrays, and the per-module
capacity array behind |
Hybrid Control System (EV ECU) |
|
DRIVING and all four charge states |
15 PIDs: speed, gear, odometer, ready signal, throttle, drive and AWD mode, pack voltage and current, cabin power while driving, the 12V auxiliary telemetry, and ambient temperature during a charge. |
Brake / EPB |
|
AWAKE, DRIVING |
2 PIDs: brake pedal stroke and electric park brake status. The EPB stays alive in the parked body tail, which is why park brake is polled in AWAKE as well. |
A/C |
|
DRIVING |
5 PIDs: cabin and ambient temperature, HVAC setpoint, HV heater power and blower level. This ECU sleeps while charging, which is why in-charge ambient is read from the Hybrid Control ECU instead. |
TPMS, via gateway relay |
|
DRIVING |
3 PIDs: pressures, temperatures and the slot-to-corner map. Mixed ( |
The exhaustive per-PID cadences are the two poll arrays obdii_polls_base and
obdii_polls_charge in vehicle_toyota_etnga.cpp, where every row carries a comment naming
its DID, its meaning and its cadence in each state. They are split in two because a poll list
supports only VEHICLE_POLL_NSTATES (4) states: the first array covers SLEEP / AWAKE /
DRIVING and the second is registered at an offset so its four columns land on the four charge
states. A PID polled on both sides therefore appears in both arrays.
TPMS
Tyre pressures and temperatures are read every 60 s while driving. Three standard vector metrics
are published, one element per wheel in the canonical order [FL, FR, RL, RR]:
v.t.pressure (kPa), v.t.temp (°C) and v.t.alert (0 normal, 1 warning, 2 alert).
TPMS sensors are motion-activated, so the values are those last reported while the wheels were rolling; they are not refreshed for a car that has been parked for a while. A wheel with no sensor fitted publishes 0 and is excluded from alerting. The sensor slot-to-corner assignment is re-read on every poll cycle, so a tyre rotation or a TPMS relearn is picked up within about a minute with no restart.
The four alert thresholds are [xte] config parameters (see Configuration below). Pressure
uses a low-pressure test and temperature an overheat test, so for the three-level behaviour to
work the pressure warn threshold must be above its alert threshold and the temperature warn
threshold below its alert threshold.
Web UI
The following pages are registered for all e-TNGA vehicles and appear in the vehicle menu of the OVMS web interface. Page titles use the active vehicle name.
URL |
Menu |
Purpose |
|---|---|---|
|
Vehicle |
BMS cell monitor — per-cell voltage and temperature display. |
|
Vehicle |
Live charging metrics dashboard — key charge telemetry during a session. |
|
Vehicle |
Saved charge-report browser — lists stored session reports with links to the HTML report and the per-sample CSV download. |
|
(none) |
Serves one stored report or CSV by filename (linked from |
|
Vehicle |
Vehicle configuration — the six |
Charge session report
At the end of each charging session (plug-in to unplug), the module writes a self-contained HTML
report and a per-sample CSV to /sd/charge-reports/ when an SD card is mounted, falling back to
/store/charge-reports/ on internal flash. The newest 50 sessions are retained; older sessions
and orphan CSV files whose session never produced a report are pruned automatically.
The HTML report contains:
Summary — plug-in and unplug timestamps (UTC), duration, plug-in GPS location with an OpenStreetMap link, ambient temperature range, charge type, SOC start to end, delivered and grid energy, peak and average power, battery temperature range, and the session outcome decoded to a human-readable label.
Inline SVG power/SOC chart — a downsampled power trace with an SOC overlay, rendered on-module with no external dependencies.
Session event log — timestamped state-machine events (plug-in, charge phases started and ended, unplug).
Estimates — charging efficiency (AC sessions, where grid energy is available) and implied pack capacity derived from delivered Ah and the SOC delta.
A link to the per-sample CSV for offline analysis.
The CSV is written one row per second during active charging. Its columns cover session position
(phase, elapsed_s), both SOC readings, the three measured powers (station, battery,
cabin), pack voltage/current/temperature and ambient, the pack temperature spread, the station’s
caps, the car’s asks, raw station telemetry, and the module’s own charge integral.
Note
Parse the CSV by header name, not by column index. The column set has grown across releases and one column was inserted at the front rather than appended, so a positional parser written against an older file will silently misread every field. The header row is authoritative and is written at the top of every file.
Two columns are easy to misread. batt_temp_c is the mean of the pack sensors, while
batt_tmin_c / batt_tmax_c are the extremes; the spread is roughly 3 °C even during a
gentle AC charge, and a BMS derates on its hottest sensor, so a charging curve should be keyed
to batt_tmax_c. obc_kw is diagnostic only and under-reads on DC charging — use
battery_kw for real power. ambient_c is empty rather than 0.0 until the first
in-charge reading arrives, so an empty field is distinguishable from a genuine 0 °C.
Configuration
All e-TNGA vehicles share the xte config instance, registered by the base module. Every
parameter can be set from the shell with config set xte <param> <value> or from the
/xte/config web page.
Parameter |
Default |
Meaning |
|---|---|---|
|
240 |
Tyre pressure (kPa) below which a warning is raised |
|
220 |
Tyre pressure (kPa) below which an alert is raised |
|
90 |
Tyre temperature (°C) above which a warning is raised |
|
100 |
Tyre temperature (°C) above which an alert is raised |
|
0 |
Pack nominal full-charge capacity (Ah), the denominator
for |
|
0 |
Pack nominal voltage (V), used to convert capacity to kWh
for |
Metrics
Beyond the obvious SOC, speed, odometer, temperature and VIN, the module populates these standard OVMS metrics:
Metric |
Source |
Meaning |
|---|---|---|
|
|
A/C cooling active: |
|
A/C ECU |
HV electric heater active (any heater power draw) |
|
A/C ECU |
Blower level as a percentage (levels 1-7) |
|
derived |
Trip-average energy consumption (Wh/km), computed each tick while driving |
|
derived |
Per-trip charge and discharge coulombs (Ah), reset at trip start; the |
|
derived |
Per-trip energy (kWh); the |
|
Plug-In Control ECU |
Battery-delivered charge power, valid for both AC and DC charging |
|
Plug-In Control ECU |
AC grid energy delivered this session and lifetime (AC only; reads 0 during DC) |
|
HV Battery ECU |
Pack full-charge capacity (Ah) as measured by the BMS: the mean of eight per-module slots |
|
derived from |
State of health (%) and usable capacity (kWh) against the pack nominal. Only the
96-cell pack has a built-in nominal; on other variants both stay empty until
|
|
Plug-In Control ECU |
DC station present voltage and current (DC charging only) |
|
Hybrid Control ECU |
Accelerator position (%) and the selected drive mode (Eco / Normal / Power) |
|
Brake/EPB ECU |
Brake pedal stroke (%) and electric park brake applied |
|
TPMS gateway |
Per-wheel tyre pressure, temperature and alert level (see TPMS above) |
Custom metrics live in the xte namespace. The charge-protocol and charger channels:
Metric |
Source |
Meaning |
|---|---|---|
|
Plug-In Control ECU |
The two raw charge-protocol signals the state machine runs on: the DC high-level communication state and the cable-seated signal. Exposed unmodified so a session can be followed, or a stuck handshake diagnosed, from the metrics alone |
|
Plug-In Control ECU |
AC operation status, which drives entry to AC charging; and the separate charger operation status |
|
Plug-In Control ECU |
AC target charging power (kW) and AC current upper limit (A) |
|
Plug-In Control ECU |
Charger output and target power (kW); the kW units are inferred, not confirmed |
|
Plug-In Control ECU |
A/C usable power (kW); unit inferred |
|
Plug-In Control ECU |
Grid input power (kW); AC charging only, the grid-side companion to |
|
Plug-In Control ECU |
The car’s minimum charging permission power — the taper floor of the DC charge curve — and the target charging current it asks for |
|
Plug-In Control ECU |
The DC station’s advertised maxima, as negotiated over the CCS contract |
|
Plug-In Control ECU |
Charging history outcome — why the session ended. Retained between sessions: the vehicle does not reset it on plug-in, so it must be scoped per session |
|
Plug-In Control ECU |
Charge sequence stop request from the CCM — the high-level-communication fault reason. Partial decode |
|
Plug-In Control ECU |
My Room active — cabin run on grid power while plugged in. The only live My Room signal on the bus |
|
Plug-In Control ECU |
The vehicle’s own control-mode self-report (0 none, 1 driving, 3 charging), which is what drives the transition into and out of the driving state |
Climate and cabin energy:
Metric |
Source |
Meaning |
|---|---|---|
|
|
HVAC / cabin power draw (kW), tracked in both contexts |
|
derived |
My Room cabin energy (kWh): the direct time-integral of the above over the My-Room-active interval, reset at charge start. Valid for both AC and DC |
|
derived |
Per-trip driving cabin/HVAC energy (kWh), reset at trip start |
|
Hybrid Control ECU |
AWD / X-MODE status. Unvalidated — see the validation table above |
HV battery internals:
Metric |
Source |
Meaning |
|---|---|---|
|
HV Battery ECU |
SOC as the BMS reports it, which differs from the displayed |
12V auxiliary battery, all from the Hybrid Control ECU (0x7D2):
Metric |
Source |
Meaning |
|---|---|---|
|
Hybrid Control ECU |
Hi-res aux voltage, alongside the module’s own ADC reading in |
|
Hybrid Control ECU |
Aux battery temperature (°C) and full-charge capacity (Ah) |
|
Hybrid Control ECU |
Lifetime charge and discharge integrals (Ah) and integrated Ready-ON time (h) |
Debug Logs
To see state transitions, metric changes and PID poll results in the log, set log level
verbose for component v-etnga. Nearly all e-TNGA logging uses that tag, including on the
vehicles built on the platform.