ChargeLink Native
Developed byDEVlink

ISO 15118-20 Operator Runbook

Use this runbook for AC, DC, bidirectional power transfer, EIM and Plug & Charge sessions.

1. Choose a profile


$CL = "C:\Program Files\ChargeLink Native\chargelink.exe"
& $CL profile list --json | Out-File C:\ProgramData\ChargeLink\profiles.json

Common profiles include iso15118_20_dc, iso15118_20_dc_evcc_reference, iso15118_20_ac_evcc_reference, abb_iso20_ac_eim_realistic_continuous, abb_iso20_dc_bpt_eim, abb_iso20_ac_bpt_eim, and the *_pnc_tls variants.

2. Find the IPv6 interface


Get-NetIPInterface -AddressFamily IPv6 | Where-Object ConnectionState -eq Connected |
  Format-Table ifIndex,InterfaceAlias,ConnectionState
Get-NetIPAddress -AddressFamily IPv6 | Where-Object IPAddress -like 'fe80::*' |
  Format-Table InterfaceIndex,InterfaceAlias,IPAddress

Record the interface index and link-local address. Use the scoped form fe80::...%<index>.

3. EVSE: first non-TLS DC session


$IFINDEX = 19
$LOCAL = "fe80::1234:5678:9abc:def0%$IFINDEX"
$RUN = "iso20-dc-$(Get-Date -Format yyyyMMdd-HHmmss)"

& $CL evse start `
  --foreground `
  --external-evcc-session `
  --run-id $RUN `
  --artifact-root C:\ProgramData\ChargeLink\runs `
  --protocol iso15118-20 `
  --profile-id iso15118_20_dc `
  --host :: `
  --udp-port 15118 `
  --tcp-port 50118 `
  --advertise-ipv6 $LOCAL `
  --interface-index $IFINDEX `
  --max-runtime-ms 1800000 `
  --heartbeat-interval-ms 1000 `
  --exi-mode chargelink-exi `
  --json

Keep this window open. In a second elevated PowerShell window:


& $CL evse status --json
& $CL evse list-state --json

4. EVCC: direct TCP laboratory connection

Use direct TCP only when the EVSE address and port are known. For a standards-oriented discovery test, use SDP instead of --no-sdp.


$PEER = "fe80::abcd:ef01:2345:6789%19"
& $CL evcc start `
  --protocol iso15118-20 `
  --backend ethernet `
  --profile-id iso15118_20_dc_evcc_reference `
  --no-sdp `
  --peer-ipv6 $PEER `
  --tcp-port 50118 `
  --probe-peer `
  --connect-timeout-ms 5000 `
  --max-steps 50 `
  --battery-model constant_power_reference `
  --battery-capacity-kwh 80 `
  --initial-soc-pct 20 `
  --target-soc-pct 80 `
  --requested-power-kw 50 `
  --battery-step-seconds 1 `
  --json

5. AC operation

Select an AC profile. The network startup is otherwise identical.


& $CL evse start --foreground --external-evcc-session `
  --protocol iso15118-20 --profile-id abb_iso20_ac_eim_realistic_continuous `
  --host :: --udp-port 15118 --tcp-port 50118 `
  --advertise-ipv6 $LOCAL --interface-index $IFINDEX `
  --max-runtime-ms 1800000 --heartbeat-interval-ms 1000 --json

6. Plug & Charge / TLS

Store the PFX password in an environment variable instead of shell history.


$env:CHARGELINK_PFX_PASSWORD = Read-Host "PFX password" -AsSecureString |
  ConvertFrom-SecureString -AsPlainText

& $CL evse tls-pki-doctor `
  --tls --tls-cert C:\ProgramData\ChargeLink\pki\secc-chain.pem `
  --tls-key C:\ProgramData\ChargeLink\pki\secc-key.pem `
  --tls-cafile C:\ProgramData\ChargeLink\pki\v2g-root-ca.pem `
  --require-ca --protocol iso15118-20 --profile-id abb_iso20_dc_pnc_tls --json

& $CL evse start --foreground --external-evcc-session `
  --protocol iso15118-20 --profile-id abb_iso20_dc_pnc_tls `
  --host :: --udp-port 15118 --tcp-port 50118 `
  --advertise-ipv6 $LOCAL --interface-index $IFINDEX `
  --tls --external-evcc-windows-tls `
  --tls-pfx C:\ProgramData\ChargeLink\pki\secc-identity.pfx `
  --tls-pfx-password-env CHARGELINK_PFX_PASSWORD `
  --tls-cafile C:\ProgramData\ChargeLink\pki\v2g-root-ca.pem --require-ca `
  --max-runtime-ms 1800000 --json

7. Stop and preserve evidence


& $CL evse status --json | Out-File C:\ProgramData\ChargeLink\runs\$RUN-status.json
& $CL evse stop --json