
An ISO 15118-20 bidirectional power transfer session in the order one open-source implementation runs it, with the messages that carry the discharge limits and the charge or discharge flag.
The control mode changes what a few steps carry, marked below; the rest are the same in both.
ServiceSelectionReqISO 15118-20 common messages (XSD): Service selection requestNo message pair is BPT-only. The marked steps are where BPT shows up, or, for the three service steps, where the bidirectional service is offered and chosen, which is this page’s reading. The unmarked steps are the same messages a charge-only session uses.ISO 15118-20 common messages (XSD): Message pairs; the DC, AC and common-types files hold the variants
ISO’s schemas give no message order. This order is Josev’s, one open-source implementation’s, read from the state each state names next. Reading the order of the common messages in the schema file as the session order would be an inference.Josev: iso15118_20_states.py, next-state targets
Step 1: Session setup
DC session, Dynamic mode.
SessionSetupReqSessionSetupResISO 15118-20 common messages (XSD): Message pairsMeterInfoTypeChargedEnergyReadingWhBPT_DischargedEnergyReadingWhBPT_InductiveEnergyReadingVARhISO 15118-20 common types (XSD): Meter info typeRationalNumberTypeISO 15118-20 common types (XSD): RationalNumberType; no annotationsISO 15118-2, the first-generation protocol between charger and car, is charge-only. Its abstract says its messages support energy transfer from the charger to the car and that the bidirectional use cases sit in Part 1, where using them would need enhancements to the message set. A search of its five schemas for discharge, bidirectional, V2X and reverse finds nothing, and its list of energy-transfer modes has no bidirectional entry. Bidirectional power transfer therefore needs ISO 15118-20, which defines the messages and the sequence requirements for it.
What is striking about -20 is how little it adds. No message pair is bidirectional-only. Bidirectional transfer appears in three ways: variants that swap into the shared charge-parameter-discovery and charge-loop messages, one optional field in the power-delivery request that says whether the channel is charging or discharging, and optional bidirectional fields in the meter record, a discharged-energy counter and an inductive reactive-energy reading. The schedule exchange also carries discharge content with no such prefix. The service steps are marked too, as the place where the bidirectional service is offered and chosen, which is this page’s reading. Every unmarked step is the same message a charge-only session uses.
The order of the steps is not ISO’s. The schemas carry no sequencing, and reading the order of the common messages in the schema file as the order of a session would be an inference. The order shown is the one Josev, an open-source implementation, runs: for DC, from session setup through service selection, charge-parameter discovery, schedule exchange, cable check, pre-charge, power delivery, the repeating charge loop, power delivery again, welding detection and session stop. The AC session is the same up to schedule exchange, then goes to power delivery, the loop, power delivery and stop, because the AC set has no cable-check, pre-charge or welding messages.
Direction is carried by names rather than by a sign. A limit gets its direction from separate charge and discharge field names, the one direction flag is the optional channel selection in power delivery, and the meter keeps a charged counter and a separate, optional discharged counter, both unsigned, so there is no signed net figure. In DC, charge-parameter discovery gives each side four required discharge limits, and the loop drops the car’s minimum discharge current. In AC the limits are power only, with optional twins for the second and third phase. What a negative power value means is not stated in the schemas; Josev reads a negative last entry in the car’s power profile as discharge.
The service numbers and the bidirectional parameters are not in the schemas either. They come from two open-source implementations: Josev numbers the AC and DC bidirectional services 5 and 6, and EVerest agrees. Both name a channel setting and a generator mode, and both have a grid-code islanding-detection parameter, though they spell its name differently and the standard’s table was not read, so which spelling is right is not settled here. The schemas also state no units for any limit, energy request or time, so this page adds none.
ISO 15118-2 ISO 15118-2:2014, Part 2: Network and application protocol requirements. Ed. 1, 2014-04 (catalogue abstract).
ISO 15118-2 schemas ISO’s openly published schema folder for ISO 15118-2 (five XSD files). Folder named ed-2; MsgBody last modified 2013-08-20.
The catalogue lists the published -2 as Edition 1, 2014.
ISO 15118-20 ISO 15118-20:2022, Part 20: 2nd generation network layer and application layer requirements. Ed. 1, 2022-04 (catalogue abstract).
ISO 15118-20 common messages (XSD) V2G_CI_CommonMessages.xsd, ISO’s openly published schema. Ed. 1, last modified 2021-10-12.
The schema carries no annotations: no units, no message order and no service numbers.
ISO 15118-20 DC messages (XSD) V2G_CI_DC.xsd, ISO’s openly published schema. Ed. 1, last modified 2021-08-23.
The schema carries no annotations: no units, no message order and no service numbers.
ISO 15118-20 common types (XSD) V2G_CI_CommonTypes.xsd, ISO’s openly published schema. Ed. 1, last modified 2021-10-12.
The schema carries no annotations: no units, no message order and no service numbers.
Josev Open-source ISO 15118 implementation in Python (SwitchEV iso15118): the order of the messages in a session. Version 0.31.2, commit 1d29f53982d3, 2026-10-13.
One implementation’s state machine, not ISO text.
ISO 15118-20 AC messages (XSD) V2G_CI_AC.xsd, ISO’s openly published schema. Ed. 1, last modified 2021-08-23.
The schema carries no annotations: no units, no message order and no service numbers.
EVerest libiso15118 EVerest’s open-source ISO 15118 library in C++ (archived): service numbers and the parameters of the bidirectional services. Commit 5c81c928dada, 2025-11-25.
One implementation’s code, not ISO text.
Everything here is paraphrased from the pinned sources, not quoted. The SAE entries rest on secondary sources, because SAE’s own catalogue could not be opened; an industry body’s reading is labelled as one. Anything illustrative is labelled as such. Where a source is silent the page says so instead of filling the gap.