ChargeLink Native

Quick Recipes

Starting points for the most common tasks. Every recipe assumes the path block below and uses only commands that exist in the documented binary. Replace angle-bracket values.

$CL   = 'C:\ChargeLink\0.5.0-rc2\pc1\bin\chargelink.exe'
$Data = 'C:\ChargeLinkData'
$IfIndex   = <INTERFACE_INDEX>
$Advertise = 'fe80::<ADDRESS>%' + $IfIndex
$Pki       = "$Data\pki"

Installation health in 30 seconds

chargelink --version
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json doctor
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json license status
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc local-loopback-smoke --protocol iso15118-20 --profile-id iso15118_20_dc --peer-ipv6 '::1' --tcp-port 50118 --max-steps 6

ISO 15118-20 DC EVSE, dry-run

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse start --dry-run --protocol iso15118-20 --profile-id iso15118_20_dc
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse stop

ISO 15118-20 EVSE for an external vehicle (TLS 1.3 mutual)

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse start --external-evcc-session --run-id iso20-<DATE> `
  --protocol iso15118-20 --profile-id iso15118_20_dc `
  --host '::' --udp-port 15118 --tcp-port 50118 --advertise-ipv6 $Advertise --interface-index $IfIndex `
  --tls --tls-cert "$Pki\secc-chain.pem" --tls-key "$Pki\secc-key.pem" --tls-cafile "$Pki\v2g-root-ca.pem" --require-ca `
  --max-runtime-ms 1800000 --heartbeat-interval-ms 1000

ISO 15118-2 DC EVSE for an external vehicle (plain)

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse start --external-evcc-session --run-id iso2-<DATE> `
  --protocol iso15118-2 --profile-id iso15118_2_dc_evse_reference `
  --host '::' --udp-port 15118 --tcp-port 50118 --advertise-ipv6 $Advertise --interface-index $IfIndex `
  --max-runtime-ms 1800000 --heartbeat-interval-ms 1000

ISO 15118-2 DC EVSE with Windows SChannel TLS 1.2

$env:CHARGELINK_PFX_PASSWORD = Read-Host 'PFX password'
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse start --external-evcc-session --run-id iso2tls-<DATE> `
  --protocol iso15118-2 --profile-id iso2-dc-eim-tls-schannel `
  --host '::' --udp-port 15118 --tcp-port 50118 --advertise-ipv6 $Advertise --interface-index $IfIndex `
  --tls --external-evcc-windows-tls --tls-pfx "$Pki\secc-identity.pfx" --tls-pfx-password-env CHARGELINK_PFX_PASSWORD `
  --max-runtime-ms 1800000

DIN 70121 DC EVSE for an external vehicle

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse start --external-evcc-session --run-id din-<DATE> `
  --protocol din70121 --profile-id din70121_dc_evse_reference `
  --host '::' --udp-port 15118 --tcp-port 50118 --advertise-ipv6 $Advertise --interface-index $IfIndex `
  --max-runtime-ms 1800000 --heartbeat-interval-ms 1000

Watch, stop and evaluate any EVSE run

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse status --run-id <RUN_ID>
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse stop --run-id <RUN_ID>
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts integrity --run-id <RUN_ID>
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse live-closure-gate --run-id <RUN_ID> --source external-evcc --require-sdp --require-tcp-peer --require-v2gtp --require-exi

Probe a real charger's TLS from the vehicle side

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::<SECC>%' + $IfIndex) --tcp-port 50118 `
  --tls --tls-cert "$Pki\vehicle-chain.pem" --tls-key "$Pki\vehicle-key.pem" --tls-cafile "$Pki\v2g-root-ca.pem" --require-ca

ISO 15118-20 DC EIM session from the vehicle side (EV case files required)

$env:CHARGELINK_ISO20_LIVE_SEMANTIC_CASE        = 'C:\ChargeLink\0.5.0-rc2\pc2\cases\nominal.json'
$env:CHARGELINK_ISO20_FULL_WIRE_SESSION_MANIFEST = 'C:\ChargeLink\0.5.0-rc2\pc2\cases\full-wire-session-manifest.json'
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc activate-profile --protocol iso15118-20 --profile-id iso15118_20_dc_evcc_reference `
  --use-sdp --interface-index $IfIndex --tcp-port 50118 --exi-mode chargelink-exi `
  --tls --tls-cert "$Pki\vehicle-chain.pem" --tls-key "$Pki\vehicle-key.pem" --tls-cafile "$Pki\v2g-root-ca.pem" --require-ca `
  --max-steps 14 --requested-power-kw 80

Scripted DC-CAN lanes

Fixed fixture frames on a virtual bus for test development; not a protocol implementation (Scripted DC-CAN Lanes).

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json dc-can virtual-run --protocol chademo --profile dc_can_virtual_evse --frame-count 50 --sample-period-ms 50
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json dc-can chademo-live-run --run-id dc-can-live-<DATE>
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json dc-can chademo-can-adapter-loop --run-id dc-can-loop-<DATE> --adapter-kind peak-pcan --adapter-mode loopback --channel PCAN_USBBUS1 --bitrate-kbps 500

Deterministic simulation and replay

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json sim paired --protocol iso15118-20 --scenario dc-bpt-nominal --seed 42 --run-id sim-<DATE> --write-artifacts --output "$Data\tests\sim-<DATE>.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json sim replay --trace "$Data\tests\sim-<DATE>.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json sim legacy-scenario --protocol iso15118-2 --scenario iso2-dc-eim-nominal --seed 1 --run-id iso2-sim-<DATE> --write-artifacts
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json sim tls-campaign --campaign iso20-pnc-expired-contract --seed 1 --run-id tls-<DATE> --write-artifacts

Protocol-first campaign plan

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test protocols list
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test areas list --protocol iso15118-20 --sut-role evse --charging-mode dc
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json test plan --protocol iso15118-20 --sut-role evse --charging-mode dc --test-area SessionSetup --evidence dry-run --output "$Data\tests\plan-<DATE>"

Licensed conformance package, dry-run

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json conformance package execute --package iso15118-2-evse --role evse `
  --pics "$Data\tests\pics.json" --pixit "$Data\tests\pixit.json" --out "$Data\tests\iso2-evse-<DATE>" `
  --evidence-mode dry-run --executable-only --max-cases 10

gRPC server and smoke

# window 1
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" integration serve --listen 127.0.0.1:50051 --state-root "$Data\runtime\integration"
# window 2
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json integration health --endpoint http://127.0.0.1:50051
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json integration session-smoke --endpoint http://127.0.0.1:50051 --protocol iso15118-20 --role evse
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json signals read --endpoint http://127.0.0.1:50051 --signal Vehicle.SocPct --signal Charger.PresentVoltageV
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json signals write --endpoint http://127.0.0.1:50051 --signal Vehicle.SocPct=35

Stop everything and recover locks

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse stop
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc stop
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json runtime list
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json runtime recover --stale-only