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
| Check | Pass criteria | Result |
|---|---|---|
| Installed CLI | Version and hash recorded; matches delivery note | ☐ |
| License | Status LIC_OK; edition and packages match the order | ☐ |
| Environment | Doctor has no unexplained non-ok item | ☐ |
| Profiles | Intended profiles exist in the installed catalogue | ☐ |
| Role and local protocol | Dry-run of the intended role validates; loopback completes | ☐ |
| gRPC | Health, session and signal smoke pass | ☐ |
| Evidence | Artifacts under the agreed root; integrity check passes | ☐ |
| Supportability | First-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.

