ChargeLink

First 60 Minutes: From Installation to a Supportable Run

This is the recommended first-launch checklist for a new ChargeLink workstation. The goal is not only to prove that the software starts, but to leave the machine in a state that another engineer can understand, repeat and support before you connect your device under test (DUT). Do not skip a failed step and continue: a later protocol error with your DUT is much harder to diagnose if installation, licensing, networking or the gRPC service was never proven first.

What you will prove

  • the installed CLI can be located and executed, and its version is recorded;
  • the license state is known and the entitlements match the order;
  • the environment doctor passes or has understood warnings;
  • the profile for the role you will play against your DUT exists in the installed catalogue;
  • the role configuration validates, and a local protocol flow generates evidence;
  • the gRPC Integration API starts and answers;
  • artifacts are written to the agreed root and can be integrity-checked;
  • the workstation can produce a support bundle.

0–10 minutes — establish the installation identity

$CL   = 'C:\Program Files\DEVlink\ChargeLink\<VERSION>\charger\bin\chargelink.exe'
$Data = "$env:ProgramData\DEVlink\ChargeLink\data"

Test-Path $CL
chargelink --version
Get-FileHash $CL -Algorithm SHA256
foreach ($d in 'runtime','artifacts','pki','tests','support') { New-Item -ItemType Directory -Force "$Data\$d" | Out-Null }

The installation has a charger\ and a vehicle\ folder, depending on the role chosen in the setup; the chargelink.exe in either folder runs either role.

Expected: True, chargelink 0.5.0, and a hash you can compare with the delivery note. If Test-Path is false, return to Install and Activate. Do not copy an executable from another machine.

10–20 minutes — prove licensing and environment health

chargelink --json license status
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json env doctor
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json env doctor --strict

Expected: license status shows "code": "LIC_OK", this PC's machine ID and the installed licence. If it shows LIC_NONE, install the .dlic file you received now (chargelink license install <FILE>.dlic); any other state is explained in Licensing. Check that the edition and packages in entitlement match your order.

The doctor has four checks: runtime_root, artifact_root, license and product_boundary. Its license check is skipped; the licence is shown by license status. Record why each other non-ok item is acceptable.

20–30 minutes — discover profiles before starting a protocol

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json profile list | Out-File -Encoding utf8 "$Data\support\profiles.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json profile connectors
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json profile show iso15118_20_dc
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

Never assume a profile ID from an old procedure. The Profile Catalog lists the built-in profiles; the installed list is authoritative. A profile fixes protocol, role, connector family and EXI mode. Network addresses, ports, certificates and CAN channels are supplied on the command line.

30–40 minutes — validate the role and run a local protocol proof

Validate the role you will play against your DUT without opening sockets. Charger role:

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 status
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evse stop

Vehicle role:

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json evcc start --dry-run --protocol iso15118-20 --profile-id iso15118_20_dc_evcc_reference

Then prove the protocol stack on this PC with the loopback self-test, which runs both roles on this PC over ::1 (Self-test without a device under test):

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 `
  --battery-capacity-kwh 80 --initial-soc-pct 20 --target-soc-pct 80 --requested-power-kw 50 --battery-step-seconds 1

Expected: dry-run validated; loopback completed with SessionSetup and ServiceDiscovery processed. These are software proofs; they do not prove PLC hardware, a physical CAN bus, high-voltage behaviour or the behaviour of your DUT.

40–50 minutes — start and prove the gRPC agent

Window 1 (leave open):

chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" `
  integration serve --listen 127.0.0.1:50051 --state-root "$Data\runtime\integration"

Expected on the console: ChargeLink Integration API v1 starting on 127.0.0.1:50051; state_root=C:/ProgramData/DEVlink/ChargeLink/data/runtime/integration. Before the port opens, the server writes a new random access token to $Data\runtime\integration\api-token (readable only by your account and SYSTEM). Every client call must carry that token; the CLI reads it from CHARGELINK_API_TOKEN_FILE or, when that variable is unset, from <runtime-root>\integration\api-token. With the state root chosen above the default path matches, so no variable is needed. A non-loopback --listen address is refused (exit 40).

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 capabilities --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 list --endpoint http://127.0.0.1:50051
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json signals smoke --endpoint http://127.0.0.1:50051

Expected: health "status": "passed", health_status serving, product_version 0.5.0, api_version 1.8.0; capabilities with 19 entries, max_page_size 1000, max_signal_batch_size 512; the session smoke passes through session_state_created, session_state_running and session_state_completed and deletes its session; the signal list reports signal_count 94; the signal smoke writes and reads back Vehicle.SocPct (write_read_roundtrip true). A call without a readable token fails locally with CL-RUNTIME-001 and the text "The request does not have valid authentication credentials"; see gRPC Integration Agent. If health fails, do not continue to VeriStand or external automation; resolve the gRPC service first (Troubleshooting).

50–60 minutes — prove evidence and supportability

$Stamp = Get-Date -Format yyyyMMdd-HHmmss
$Out = "$Data\support\first-60-minutes-$Stamp"
New-Item -ItemType Directory -Force $Out | Out-Null

chargelink --version                    | Out-File -Encoding utf8 "$Out\version.txt"
chargelink --json license status                                                                       | Out-File -Encoding utf8 "$Out\license-status.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json env doctor               | Out-File -Encoding utf8 "$Out\doctor.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json runtime list             | Out-File -Encoding utf8 "$Out\runtime.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts index          | Out-File -Encoding utf8 "$Out\artifact-index.json"
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json integration health --endpoint http://127.0.0.1:50051 | Out-File -Encoding utf8 "$Out\grpc-health.json"
Get-ComputerInfo | Out-File -Encoding utf8 "$Out\windows.txt"
Get-NetAdapter | Format-Table -AutoSize | Out-File -Encoding utf8 "$Out\network-adapters.txt"

# integrity of the last loopback run
$Last = ((chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json runtime list | ConvertFrom-Json).sessions | Where-Object { $_.health.role -eq 'evcc' } | Select-Object -Last 1).health.run_id
chargelink --runtime-root "$Data\runtime" --artifact-root "$Data\artifacts" --json artifacts integrity --run-id $Last | Out-File -Encoding utf8 "$Out\integrity.json"

Each entry of sessions carries health, heartbeat, lock and pid objects; the run ID and role are in health.

First-hour sign-off

CheckPass criteriaResult
Installed CLIVersion and hash recorded; matches delivery note☐
LicenseStatus LIC_OK; edition and packages match the order☐
EnvironmentDoctor has no unexplained non-ok item☐
ProfilesIntended profiles exist in the installed catalogue☐
Role and local protocolDry-run of the intended role validates; loopback completes☐
gRPCHealth, session and signal smoke pass☐
EvidenceArtifacts under the agreed root; integrity check passes☐
SupportabilityFirst-hour evidence directory complete☐

Next: Environment and Bench Preflight for the protocol and hardware of your DUT, then First Session with Your Device Under Test.