Skip to content
Support

Scripting & Automation

pcu-cli is built to be scripted. Data goes to stdout; prompts, warnings, and errors go to stderr; and every command sets a meaningful exit code. This page covers the flags and output formats you need for unattended use. For the full command list, see the Command Reference.

  • stdout carries the data: the status table, timer values, channel states, and all JSON.
  • stderr carries confirmation prompts, warnings, and error messages.

Because prompts and warnings never touch stdout, you can capture clean data with pcu-cli ... > out.txt while any prompt still appears on the terminal.

FlagDescription
--quietBare values only, one per line. Also skips confirmation prompts.
--jsonJSON output. Supported on status, ign, dio, and version.
--yes, -ySkip write confirmation prompts.
--version, -VPrint version info and exit. Runs without elevation.
-h, --help, /?Print command help and exit.

Notes:

  • --quiet implies --yes: quiet writes never prompt.
  • --json on its own still prompts before a write. Add --yes for unattended writes.
  • --json and --quiet have no effect on driver; its output is always the text form.
  • pcu-cli reads no environment variables and no configuration files. Everything is passed on the command line.

status, ign, dio, and version emit a single indented JSON object on stdout. Errors still go to stderr, and the exit code is unchanged, so a script can branch on either.

status --json on a CQ20:

{
"platform": "In-CarPC CQ20",
"cpu": "Intel Atom x6425E",
"mcu_identity": "CQ20 MCU",
"hardware_rev": "DTB-IGN-MCU VER:10",
"firmware": 12,
"ignition": {
"mode": 1,
"ign_on_delay_s": 6,
"sw_on_delay_s": 4,
"sw_off_delay_s": 300,
"pw_off_delay_s": 120
}
}

ign --json is the timer summary on its own:

{
"mode": 1,
"ign_on_delay_s": 6,
"sw_on_delay_s": 4,
"sw_off_delay_s": 300,
"pw_off_delay_s": 120
}

A single ign get read is { timer, value }, with the value in seconds:

{
"timer": "sw-off-delay",
"value": 300
}

A write reports the requested value, the value read back, and whether they match:

{
"timer": "sw-off-delay",
"requested": 120,
"actual": 120,
"verified": true
}

Every timer key carries the unit it is counted in as a suffix: _s for seconds, _m for minutes. On a CQ20 every timer is always in seconds, so the keys are always _s and the shapes above never change.

On a CQ40N four of the five timers follow the delay unit, so their key names change with it. The same machine reports ign_off_delay_m while the unit is minutes and ign_off_delay_s after pcu-cli ign unit seconds. Only ign_on_delay_s is fixed, because that timer is always in seconds.

ign --json on a CQ40N with the unit on minutes:

{
"ign_on_delay_s": 7,
"ign_off_delay_m": 1,
"pw_off_delay_m": 15,
"ups_off_delay_m": 5,
"ups_pw_off_delay_m": 2
}

There is no mode key: the CQ40N has no ignition mode setting, and fields that do not apply are omitted rather than set to null.

ign get and ign set gain a unit property on a timer counted in minutes. It is omitted entirely when the timer is in seconds, so the CQ20 shapes above are unchanged:

{
"timer": "pw-off-delay",
"value": 15,
"unit": "m"
}

ign unit --json reports the current setting:

{
"unit": "minutes"
}

Changing it mirrors the ign set shape, but the key is setting rather than timer, because the delay unit applies to the whole device rather than to one timer:

{
"setting": "delay-unit",
"requested": "seconds",
"actual": "seconds",
"verified": true
}

A write still prompts for confirmation unless you pass --yes. Remember that the stored timer values are not converted, so a script that changes the unit should re-read and re-write the timers it cares about.

dio --json on a CQ40 series reports each channel as a boolean (true = High for a channel, On for the ignition line):

{
"platform": "In-CarPC CQ40 series",
"inputs": {
"di1": false,
"di2": false
},
"outputs": {
"do1": false,
"do2": false
},
"ignition": true
}

A dio set write mirrors the ign set shape, with booleans:

{
"channel": "do1",
"requested": true,
"actual": true,
"verified": true
}

version --json is the full inventory record: build stamp, driver and module versions, and the supported-platform catalogue. Use it for fleet inventory without touching the hardware bus.

{
"app": "pcu-cli",
"version": "1.1.0",
"git_commit": "a1b2c3d",
"build_date": "2026-07-01 09:15:32 UTC",
"build_config": "Release",
"os": "Windows",
"pawnio_version": "2.2.0",
"pawnio_date": "2026-03-15",
"smbus_module_date": "2025-05-05",
"lpcio_version": "0.2.7",
"lpcio_date": "2026-06-03",
"platforms": [
{
"model": "CQ20",
"description": "In-CarPC CQ20",
"cpu": "Intel Atom x6425E",
"cpu_codename": "Elkhart Lake",
"bus": "PCH SMBus",
"features": "Ignition timers",
"tested_os": [
"Windows 11 25H2 (x64)",
"Ubuntu 24.04 LTS (x64)"
]
},
{
"model": "CQ40",
"description": "In-CarPC CQ40 series",
"cpu": "Intel (CQ41/CQ43/CQ47)",
"cpu_codename": "Haswell",
"bus": "SuperIO GPIO ports",
"features": "Digital I/O",
"tested_os": [
"Windows 10 22H2 (x64)"
]
},
{
"model": "CQ40N",
"description": "In-CarPC CQ40N series",
"cpu": "Intel (CQ41N/CQ43N/CQ47N)",
"cpu_codename": "Skylake",
"bus": "PCH SMBus",
"features": "Ignition timers",
"tested_os": [
"Ubuntu 24.04 LTS (x64)"
]
}
],
"validated_configs": [
"Windows 11 25H2 (x64) - CQ20",
"Ubuntu 24.04 LTS (x64) - CQ20",
"Windows 10 22H2 (x64) - CQ40",
"Ubuntu 24.04 LTS (x64) - CQ40N"
]
}
  • Fields that do not apply are omitted, not set to null. On a CQ40, status --json has no ignition block; on a CQ20 it has no inputs or outputs; on a CQ40N there is no mode. On Linux, version --json omits the pawnio_*, smbus_module_date, and lpcio_* fields.
  • A platform that has not been validated on hardware yet carries no tested_os list and contributes nothing to validated_configs. Treat an absent tested_os as “not validated”, not as a parsing error. Every platform in this release has at least one entry, but a newly added model may not.
  • tested_os lists only the operating systems, one entry per validated configuration. The matching BIOS and date are not in the JSON; see Supported Platforms for those.
  • features reports only the capabilities pcu exposes as features. The CQ40N’s selectable delay unit is not one of them, so its features string is Ignition timers even though ign unit works there.
  • Boolean channel values are true for High (inputs and outputs) and true for On (the ignition line).
  • On a write, the exit code mirrors the verified field: 0 when the readback matches, 1 when it does not. A script can check either.
  • git_commit, build_date, and build_config in version --json are stamped at build time and will differ from the example above.

--quiet prints just the value, with no labels or headers, one per line. It is the simplest form to parse and it never prompts. Reads:

Terminal window
$ pcu-cli ign get sw-off-delay --quiet
300
Terminal window
$ pcu-cli dio get di1 --quiet
0

Writes print the value read back, and still set the exit code from the readback:

Terminal window
$ pcu-cli dio set do1 1 --quiet
1

Assert a digital output at boot. On Linux, run this from a systemd unit or an @reboot cron job:

Terminal window
pcu-cli dio set do1 1 --yes

On Windows, run the same command from a Task Scheduler task set to trigger “At startup”:

Terminal window
pcu-cli.exe dio set do1 1 --yes

Collect a fleet inventory without touching the hardware bus:

Terminal window
pcu-cli version --json > inventory.json

Change the shutdown delay across a fleet and fail loudly if the write did not verify:

Terminal window
pcu-cli ign set sw-off-delay 120 --yes --quiet
if ($LASTEXITCODE -ne 0) { Write-Error "write not verified" }

Extract a single value with jq:

Terminal window
pcu-cli ign get sw-off-delay --json | jq '.value'

pcu-cli handles Ctrl+C gracefully: an in-flight bus transfer is allowed to finish and the transport is cleaned up before the tool exits, so a cancel never leaves a transfer half-done.

pcu accesses the hardware bus directly. To avoid clashing with other low-level tools, every transfer is serialized on the standard system-wide bus mutexes also used by tools like HWiNFO (Access_SMBUS.HTP.Method for SMBus, Access_ISABUS.HTP.Method for SuperIO port I/O). Each access waits up to 5 seconds for the bus, then fails cleanly.