One evening of messages between car and wallbox
When the car was plugged in at 5 PM, a conversation started that stops 03 to 05 described in words. This is the conversation itself: the messages of ISO 15118-20 between the car's and the wallbox's controllers, decoded from their binary encoding into readable form.
Message names, field names and the order of the messages follow the standard's schema, as the open-source stack EVerest implements it and as CharIN's guide for DC bidirectional transfer in dynamic mode walks through it. Values are composed for the household of this path: 70 kWh battery at 80%, floor 50%, departure 7 AM.
The questionWhere in the messages does bidirectional transfer get switched on, where do the owner's limits travel, and what tells the car whether it gives or takes?
Guess firstThe car and the wallbox exchange the same loop message for charging and for discharging. What distinguishes the two?RevealHide
The sign of the current the wallbox reports. Negative means current out of the battery into the house, positive means in. The car sends no target; the wallbox drives the current within the limits both have stated.
What you are looking at
ISO 15118-20 is the second generation of the car-to-charger protocol, with bidirectional power transfer built into its services and messages. On the wire the messages travel as compact binary; the log below shows them decoded, the way a developer's tool prints them, one line per message with the time, the sender and the fields that matter. The message pairs and their fields are those of the standard's schema, which the open-source stack EVerest implements line for line, and the order of the pairs is the one CharIN's interoperability guide for exactly this service and control mode walks through.
Select the lines to see what each step decides.
EV is the car's controller, EVSE the wallbox's. Energy in watt-hours, power in watts, current in amperes; in the loop, negative current flows out of the car. Repeated loop messages are left out.
- Line 1The car opens the session
Over the charging cable, the car's communication controller introduces itself and asks for a session. Everything below rides on the same connection, encrypted with TLS; the session ID the wallbox assigns travels in the header of every message that follows.
17:02:04 EVSE SessionSetupRes { ResponseCode: "OK",EVSEID: "DE*HOM*E000001*1" } 17:02:05 EV AuthorizationSetupReq { }17:02:06 EV AuthorizationReq { PnC_AReqAuthorizationMode: { Id: "id1",GenChallenge: "…", ContractCertificateChain: "…" } } 17:02:06 EVSE AuthorizationRes { ResponseCode: "OK",EVSEProcessing: "Finished" } 17:02:07 EV ServiceDiscoveryReq { }17:02:07 EV ServiceDetailReq { ServiceID: 6 }17:02:08 EV ServiceSelectionReq { SelectedEnergyTransferService: { ServiceID: 6,ParameterSetID: 1 } } 17:02:08 EVSE ServiceSelectionRes { ResponseCode: "OK" }17:02:09 EVSE DC_ChargeParameterDiscoveryRes { ResponseCode: "OK",BPT_DC_CPDResEnergyTransferMode: { EVSEMaximumChargePower: 11000, EVSEMinimumChargePower: 500, EVSEMaximumChargeCurrent: 30, EVSEMinimumChargeCurrent: 1, EVSEMaximumVoltage: 500, EVSEMinimumVoltage: 150, EVSEMaximumDischargePower: 10000, EVSEMinimumDischargePower: 500, EVSEMaximumDischargeCurrent: 28, EVSEMinimumDischargeCurrent: 1 } } 17:02:11 … DC_CableCheckReq/Res and DC_PreChargeReq/Res: insulation test,then the wallbox raises its voltage to the battery's 17:02:18 EVSE PowerDeliveryRes { ResponseCode: "OK" }19:00:02 EVSE DC_ChargeLoopRes { ResponseCode: "OK",EVSEPresentCurrent: -7.6, EVSEPresentVoltage: 395, …, BPT_Dynamic_DC_CLResControlMode: { unchanged } } 06:58:39 EVSE PowerDeliveryRes { ResponseCode: "OK" }06:58:40 … DC_WeldingDetectionReq/Res: contactors open,the car checks that none has welded shut 06:58:41 EV SessionStopReq { ChargingSession: "Terminate" }06:58:41 EVSE SessionStopRes { ResponseCode: "OK" }
iso15118-20-session-A1B2C3D4.log: the whole file, to copy
17:02:04 EV SessionSetupReq { EVCCID: "EVCC7A3F9B2C" }
17:02:04 EVSE SessionSetupRes { ResponseCode: "OK", EVSEID: "DE*HOM*E000001*1" }
17:02:05 EV AuthorizationSetupReq { }
17:02:05 EVSE AuthorizationSetupRes { AuthorizationServices: ["PnC"], CertificateInstallationService: false, PnC_ASResAuthorizationMode: { GenChallenge: "…" } }
17:02:06 EV AuthorizationReq { PnC_AReqAuthorizationMode: { Id: "id1", GenChallenge: "…", ContractCertificateChain: "…" } }
17:02:06 EVSE AuthorizationRes { ResponseCode: "OK", EVSEProcessing: "Finished" }
17:02:07 EV ServiceDiscoveryReq { }
17:02:07 EVSE ServiceDiscoveryRes { ServiceRenegotiationSupported: false, EnergyTransferServiceList: [ { ServiceID: 6, FreeService: true } ] }
17:02:07 EV ServiceDetailReq { ServiceID: 6 }
17:02:08 EVSE ServiceDetailRes { ServiceID: 6, ServiceParameterList: [ { ParameterSetID: 1, Connector: 2 (Extended), ControlMode: 2 (Dynamic), MobilityNeedsMode: 1 (provided by EVCC), Pricing: 0 (NoPricing), BPTChannel: 1 (Unified), GeneratorMode: 1 (GridFollowing) } ] }
17:02:08 EV ServiceSelectionReq { SelectedEnergyTransferService: { ServiceID: 6, ParameterSetID: 1 } }
17:02:08 EVSE ServiceSelectionRes { ResponseCode: "OK" }
17:02:09 EV DC_ChargeParameterDiscoveryReq { BPT_DC_CPDReqEnergyTransferMode: { EVMaximumChargePower: 11000, EVMinimumChargePower: 1000, EVMaximumChargeCurrent: 30, EVMinimumChargeCurrent: 2, EVMaximumVoltage: 420, EVMinimumVoltage: 300, EVMaximumDischargePower: 10000, EVMinimumDischargePower: 500, EVMaximumDischargeCurrent: 28, EVMinimumDischargeCurrent: 2 } }
17:02:09 EVSE DC_ChargeParameterDiscoveryRes { ResponseCode: "OK", BPT_DC_CPDResEnergyTransferMode: { EVSEMaximumChargePower: 11000, EVSEMinimumChargePower: 500, EVSEMaximumChargeCurrent: 30, EVSEMinimumChargeCurrent: 1, EVSEMaximumVoltage: 500, EVSEMinimumVoltage: 150, EVSEMaximumDischargePower: 10000, EVSEMinimumDischargePower: 500, EVSEMaximumDischargeCurrent: 28, EVSEMinimumDischargeCurrent: 1 } }
17:02:10 EV ScheduleExchangeReq { MaximumSupportingPoints: 12, Dynamic_SEReqControlMode: { DepartureTime: 50280, EVTargetEnergyRequest: 0, EVMaximumEnergyRequest: 14000, EVMinimumEnergyRequest: -21000, EVMaximumV2XEnergyRequest: 0, EVMinimumV2XEnergyRequest: -21000 } }
17:02:10 EVSE ScheduleExchangeRes { ResponseCode: "OK", EVSEProcessing: "Finished", Dynamic_SEResControlMode: { } }
17:02:11 … DC_CableCheckReq/Res and DC_PreChargeReq/Res: insulation test, then the wallbox raises its voltage to the battery's
17:02:18 EV PowerDeliveryReq { EVProcessing: "Finished", ChargeProgress: "Start" }
17:02:18 EVSE PowerDeliveryRes { ResponseCode: "OK" }
17:02:19 EV DC_ChargeLoopReq { EVPresentVoltage: 398, BPT_Dynamic_DC_CLReqControlMode: { EVTargetEnergyRequest: 0, EVMaximumEnergyRequest: 14000, EVMinimumEnergyRequest: -21000, EVMaximumChargePower: 11000, EVMinimumChargePower: 1000, EVMaximumChargeCurrent: 30, EVMaximumVoltage: 420, EVMinimumVoltage: 300, EVMaximumDischargePower: 10000, EVMinimumDischargePower: 500, EVMaximumDischargeCurrent: 28 } }
17:02:19 EVSE DC_ChargeLoopRes { ResponseCode: "OK", EVSEPresentCurrent: -7.8, EVSEPresentVoltage: 398, EVSEPowerLimitAchieved: false, EVSECurrentLimitAchieved: false, EVSEVoltageLimitAchieved: false, BPT_Dynamic_DC_CLResControlMode: { EVSEMaximumChargePower: 11000, EVSEMinimumChargePower: 500, EVSEMaximumChargeCurrent: 30, EVSEMaximumVoltage: 500, EVSEMaximumDischargePower: 10000, EVSEMinimumDischargePower: 500, EVSEMaximumDischargeCurrent: 28, EVSEMinimumVoltage: 150 } }
19:00:02 EVSE DC_ChargeLoopRes { ResponseCode: "OK", EVSEPresentCurrent: -7.6, EVSEPresentVoltage: 395, …, BPT_Dynamic_DC_CLResControlMode: { unchanged } }
23:00:04 EVSE DC_ChargeLoopRes { ResponseCode: "OK", EVSEPresentCurrent: -2.0, EVSEPresentVoltage: 391, …, BPT_Dynamic_DC_CLResControlMode: { unchanged } }
00:10:03 EVSE DC_ChargeLoopRes { ResponseCode: "OK", EVSEPresentCurrent: 27.6, EVSEPresentVoltage: 390, …, BPT_Dynamic_DC_CLResControlMode: { unchanged } }
06:58:39 EV PowerDeliveryReq { EVProcessing: "Finished", ChargeProgress: "Stop" }
06:58:39 EVSE PowerDeliveryRes { ResponseCode: "OK" }
06:58:40 … DC_WeldingDetectionReq/Res: contactors open, the car checks that none has welded shut
06:58:41 EV SessionStopReq { ChargingSession: "Terminate" }
06:58:41 EVSE SessionStopRes { ResponseCode: "OK" }A composed session in the message sequence of ISO 15118-20 for DC bidirectional power transfer in dynamic control mode. Message and field names as in the standard's schema; service parameters, energy fields and the message order as in CharIN's guide for this service; negative current and power for discharging as in the logs of a documented ISO 15118-20 discharge test. Towards a backend, the wallbox would report the same session over OCPP 2.1.
Four moments that make it bidirectional
- The service. The wallbox offers service 6, DC with bidirectional transfer, and the car selects it. A car or a wallbox without the service would never get past this line.
- The limits. The car states what it can give as well as take: maximum discharge power and current. The wallbox answers with its own.
- The frame. Departure time, target and floor travel as energy: how far the battery is from full, from the target and from the floor. These are the owner's settings from stop 01, turned into watt-hours.
- The sign. In the loop nobody sends a target. The wallbox drives the current within the limits both sides stated and reports it; a negative value is discharge.
What the log does not show
The house's load, the price of the hour and the grid operator's rules sit in the energy manager behind the wallbox, not in the cable conversation. The car only ever sees the current the wallbox drives and the limits it holds itself to. Whether that current came from a cheap hour, a full solar roof or a grid signal is decided elsewhere (Energy and grid integration, deep dive). Nor does the log show money: who gains from the evening is the subject of stop 07.
Check your understanding
3 questions. Answer all of them to complete this stop. Each answer explains itself.
Which line switches the session to bidirectional transfer?
ISO 15118-20 offers energy transfer services; DC with bidirectional power transfer is service 6. Selecting it is what makes the rest possible.
EVMinimumEnergyRequest reads -21000 in the schedule exchange. What does the car say with it?
The energy fields say how far the battery is from a level. Minus 21,000 Wh to the floor means the battery stands 21 kWh above it; 30% of a 70 kWh battery.
At 00:10 the reported current turns from -2.0 to 27.6 A. What happened?
The sign is the direction. Negative current left the battery for the house all evening; positive current refills it in the cheap hours (stop 07).
- ISO: ISO 15118-20:2022 and Amendment 1:2026 (AC DER service, MCS service, improved security). https://www.iso.org/standard/77845.html. Checked 09 Oct 2026.
- EVerest (LF Energy): libiso15118: ISO 15118-20 message definitions, DC charge loop, schedule exchange and service parameters, generated from the standard's schema. https://github.com/EVerest/libiso15118/blob/main/include/iso15118/message/dc_charge_loop.hpp. Checked 11 Oct 2026.
- CharIN e.V.: Interoperability Guide 2.0: Minimum scope for implementation of ISO 15118-20 DC bidirectional power transfer in dynamic control mode, version 1.0, 4 September 2024. https://www.charin.global/media/pages/technology/knowledge-base/04e4f443ae-1731074296/charin_interop_guide_2.0_dc_bpt_iso_15118-20_v1.0_publication.pdf. Checked 11 Oct 2026.
- ISO: ISO 15118-20:2022 and Amendment 1:2026 (AC DER service, MCS service, improved security). https://www.iso.org/standard/77845.html. Checked 09 Oct 2026.
- EVerest (LF Energy): libiso15118: ISO 15118-20 message definitions, DC charge loop, schedule exchange and service parameters, generated from the standard's schema. https://github.com/EVerest/libiso15118/blob/main/include/iso15118/message/dc_charge_loop.hpp. Checked 11 Oct 2026.
- CharIN e.V.: Interoperability Guide 2.0: Minimum scope for implementation of ISO 15118-20 DC bidirectional power transfer in dynamic control mode, version 1.0, 4 September 2024. https://www.charin.global/media/pages/technology/knowledge-base/04e4f443ae-1731074296/charin_interop_guide_2.0_dc_bpt_iso_15118-20_v1.0_publication.pdf. Checked 11 Oct 2026.
- Sevdari, Knudsen, Fabbri, Pedersen, Alami and Marinelli (DTU): Demonstration of bidirectional charging using ISO 15118-20, 38th International Electric Vehicle Symposium (EVS38), 2025. https://orbit.dtu.dk/en/publications/d64a7ba2-6860-4006-be7a-d43f9a7a45f1. Checked 11 Oct 2026.
- Open Charge Alliance: Open Charge Point Protocol (OCPP): versions 1.6, 2.0.1 and 2.1. https://openchargealliance.org/protocols/open-charge-point-protocol/. Checked 09 Oct 2026.
- Sevdari, Knudsen, Fabbri, Pedersen, Alami and Marinelli (DTU): Demonstration of bidirectional charging using ISO 15118-20, 38th International Electric Vehicle Symposium (EVS38), 2025. https://orbit.dtu.dk/en/publications/d64a7ba2-6860-4006-be7a-d43f9a7a45f1. Checked 11 Oct 2026.