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.
Output discipline
Section titled “Output discipline”- 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.
| Flag | Description |
|---|---|
--quiet | Bare values only, one per line. Also skips confirmation prompts. |
--json | JSON output. Supported on status, ign, dio, and version. |
--yes, -y | Skip write confirmation prompts. |
--version, -V | Print version info and exit. Runs without elevation. |
-h, --help, /? | Print command help and exit. |
Notes:
--quietimplies--yes: quiet writes never prompt.--jsonon its own still prompts before a write. Add--yesfor unattended writes.--jsonand--quiethave no effect ondriver; its output is always the text form.pcu-clireads no environment variables and no configuration files. Everything is passed on the command line.
JSON output
Section titled “JSON output”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}Timer keys on a CQ40N
Section titled “Timer keys on a CQ40N”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"}Reading and setting the delay unit
Section titled “Reading and setting the delay unit”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" ]}JSON field notes
Section titled “JSON field notes”- Fields that do not apply are omitted, not set to null. On a CQ40,
status --jsonhas noignitionblock; on a CQ20 it has noinputsoroutputs; on a CQ40N there is nomode. On Linux,version --jsonomits thepawnio_*,smbus_module_date, andlpcio_*fields. - A platform that has not been validated on hardware yet carries no
tested_oslist and contributes nothing tovalidated_configs. Treat an absenttested_osas “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_oslists only the operating systems, one entry per validated configuration. The matching BIOS and date are not in the JSON; see Supported Platforms for those.featuresreports only the capabilities pcu exposes as features. The CQ40N’s selectable delay unit is not one of them, so itsfeaturesstring isIgnition timerseven thoughign unitworks there.- Boolean channel values are
truefor High (inputs and outputs) andtruefor On (the ignition line). - On a write, the exit code mirrors the
verifiedfield: 0 when the readback matches, 1 when it does not. A script can check either. git_commit,build_date, andbuild_configinversion --jsonare stamped at build time and will differ from the example above.
Quiet mode
Section titled “Quiet mode”--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:
$ pcu-cli ign get sw-off-delay --quiet300$ pcu-cli dio get di1 --quiet0Writes print the value read back, and still set the exit code from the readback:
$ pcu-cli dio set do1 1 --quiet1Examples
Section titled “Examples”Assert a digital output at boot. On Linux, run this from a systemd unit or an @reboot cron job:
pcu-cli dio set do1 1 --yesOn Windows, run the same command from a Task Scheduler task set to trigger “At startup”:
pcu-cli.exe dio set do1 1 --yesCollect a fleet inventory without touching the hardware bus:
pcu-cli version --json > inventory.jsonChange the shutdown delay across a fleet and fail loudly if the write did not verify:
pcu-cli ign set sw-off-delay 120 --yes --quietif ($LASTEXITCODE -ne 0) { Write-Error "write not verified" }Extract a single value with jq:
pcu-cli ign get sw-off-delay --json | jq '.value'Cancelling
Section titled “Cancelling”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.
Thread and process safety
Section titled “Thread and process safety”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.
