ChargeLink

ChargeLink as Vehicle

In the vehicle role ChargeLink is the vehicle-side communication controller (EV/EVCC), and your device under test (DUT) is the charger: a charger, an SECC or a charger simulator. ChargeLink discovers your charger through SDP or connects directly to a known IPv6 address and TCP port, negotiates the application protocol, runs the session with a simulated battery, and records every frame. This page covers what the vehicle role does and where its limits are.

The vehicle session per standard

StandardVehicle session for your DUTCommandRunbook
ISO 15118-20Full DC EIM session against your charger, with SDP or direct TCP and TLS 1.3 mutual authentication. A transport and TLS probe checks your charger first.evcc activate-profile with the EV case files from the kit; evcc tls-handshake-probeISO 15118-20
MCS (ISO 15118-20 over 10BASE-T1S)ISO 15118-20 DC session with the MCS energy service. In this release, the MCS vehicle connects to a ChargeLink charger: it waits for the CE/ID signals on the coupler link, a ChargeLink interface.evcc activate-profile --energy-service mcs --mcs-coupler-link ...MCS
ISO 15118-2One standards-encoded DC EIM session over TCP or TLS 1.2. In this release, it connects to a ChargeLink charger. Against your charger, the TLS probe checks transport and TLS.iso2-evcc; evcc tls-handshake-probeISO 15118-2
DIN 70121One standards-encoded DC session over TCP. In this release, it connects to a ChargeLink charger.din-evccDIN 70121
IEC 61851-23/-24 System A (CHAdeMO)EV role on the CAN bus. In this release, the EV connects to a ChargeLink station, which tells it over the plant link which case to run.dc-can chademo evCHAdeMO

The evcc start reference profiles for ISO 15118-2 and DIN 70121 do not send standards-encoded EXI, so a charger cannot decode them; use them only for dry-runs and simulation. To run this vehicle against ChargeLink as charger instead of a DUT, see Self-test without a device under test; for seeded offline simulations, see Deterministic Simulation.

Commands at a glance

UseCommandNotes
Validate configurationevcc start --dry-runOpens no socket.
Probe your charger's transport and mutual TLSevcc tls-handshake-probeTransport and TLS only; no SDP, V2GTP or EXI.
Full ISO 15118-20 DC EIM session against your chargerevcc activate-profileRequires the EV case files (see below) and a charger that accepts TLS 1.3 mutual.
Integrate a third-party vehicle simulator into the evidence flowevcc external-smoke, evcc external-regression-packSee below.

Backends and battery models

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc backends
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc battery-models
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc profiles

Backends accepted by evcc start: native, loopback, direct-tcp. The other names listed (external-hlc, external-evcc-smoke, external-evcc-ipv6-regression, local-executable-loopback) identify the dedicated commands evcc external-smoke, evcc external-regression-pack and evcc local-loopback-smoke. There is no ethernet backend; using it fails with CL-CONFIG-001.

Battery modelBehaviourInputs
constant_power_reference (default)Charges at the requested power until the target SoC--battery-capacity-kwh (77), --initial-soc-pct (32), --target-soc-pct (80), --requested-power-kw (150), --battery-step-seconds (30)
ramp_referenceTapers requested power near the target SoC

Both models are simulation references only; they do not model cell chemistry or thermal behaviour.

Discovery: SDP or direct TCP

  • SDP (standard flow). --use-sdp --interface-index N on activate-profile, or the default transport mode of evcc start. ChargeLink multicasts an SDP request to ff02::1 on UDP 15118 through the given interface and connects to the address and port in your charger's response.
  • Direct TCP. --peer-ipv6 fe80::...%N --tcp-port P without --use-sdp on activate-profile (on evcc start add --no-sdp). Bypasses discovery; useful to isolate transport problems. Add --probe-peer to TCP-probe first and --connect-timeout-ms (default 250) for slow links.

The zone index after % is always the index of the adapter on this machine. Copying your charger's own zone index produces "unreachable network".

Transport and TLS probe

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc tls-handshake-probe `
  --protocol iso15118-20 --profile-id iso15118_20_dc_evcc_reference `
  --peer-ipv6 ('fe80::<DUT_ADDRESS>%' + $IfIndex) --tcp-port 50118 --connect-timeout-ms 1000 `
  --tls --tls-cert "$Pki\vehicle-chain.pem" --tls-key "$Pki\vehicle-key.pem" --tls-cafile "$Pki\v2g-root-ca.pem" --require-ca `
  --tls-server-name chargelink-secc.local

The probe connects, completes the TLS 1.3 handshake, waits a bounded settlement time and closes. It sends no SDP, no V2GTP and no EXI. The status field reports what your charger decided; the process exit code only reports whether the probe itself ran. Negative probes (untrusted vehicle certificate, untrusted root, missing client certificate) are the fastest way to prove your charger's certificate policy.

Live ISO 15118-20 DC EIM session

The live session runs the 14-step DC EIM vector with real SDP, TLS 1.3 mutual authentication, V2GTP and standards-encoded EXI against your charger. The vehicle role refuses to run without two files that name every operating value explicitly; both are delivered in the vehicle folder of the kit (vehicle\cases), and their EV values are test values, not a vehicle implementation. The kit has a charger\ and a vehicle\ folder.

  1. Set CHARGELINK_ISO20_LIVE_SEMANTIC_CASE to an EV case JSON, for example vehicle\cases\nominal.json (vehicle identity and electrical parameters).
  2. Set CHARGELINK_ISO20_FULL_WIRE_SESSION_MANIFEST to the full-wire session manifest vehicle\cases\full-wire-session-manifest.json.
  3. Run evcc activate-profile with profile iso15118_20_dc_evcc_reference, TLS material and --max-steps 14.

The exact command lines are in the ISO 15118-20 runbook. The live case file contains: evcc_id (ISO 15118-20 Annex C format with check digit), present/precharge/target voltage, target current, power, EV maximum and minimum power, current and voltage, profile duration, maximum supporting points, tolerances, emergency safe limits, precharge and charge-loop timeouts. Any non-positive electrical value or an invalid EVCCID check digit is rejected before the first packet is sent. The values of the case you choose must fit your charger's operating range.

External simulator harness

evcc external-smoke starts a third-party vehicle simulator process you name with --simulator-command and --simulator-arg, waits for it, and records the outcome against the given charger. evcc external-regression-pack runs the standards-oriented IPv6 regression set (--profile-set standards-ipv6-core, an optional diagnostic IPv4 case). Both integrate an external simulator into your evidence flow.

Lifecycle

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc status
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc list-state
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc stop
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json runtime list --role evcc

The vehicle role uses the same session directory layout and role lock (active\evcc.lock.json) as the charger role. One vehicle session per runtime root.

Evidence produced by the vehicle role

session.json (backend, peer, port, TLS, protocol stack, status), summary.json (required versus observed states), protocol_session.json (executed steps, battery snapshot), protocol_summary.json (sdp/tcp/tls/v2gtp observed flags), expected_sequence.json and observed_live_sequence.json, conformance_traceability.json (blocked claims), diagnostics.json (missing states and operator action), traces\evcc-loopback.jsonl, traces\live-v2gtp-frames.jsonl, evcc_message_trace.jsonl, manifest.json. Certificate and key paths are recorded in protocol_session.json; key material is never copied. How to read the run folder is in Trace, Evidence and Reports.