Skip to content

Add driver for Enermax Liqtech XTR pump-head LCD (USB 2e3c:0a12)#903

Open
sungwookson wants to merge 1 commit into
liquidctl:mainfrom
sungwookson:add-enermax-liqtech-xtr-v2
Open

Add driver for Enermax Liqtech XTR pump-head LCD (USB 2e3c:0a12)#903
sungwookson wants to merge 1 commit into
liquidctl:mainfrom
sungwookson:add-enermax-liqtech-xtr-v2

Conversation

@sungwookson

Copy link
Copy Markdown

Summary

The Enermax Liqtech XTR AIO cooler has a numeric LCD on the pump head that accepts live data over USB HID. No vendor documentation or prior Linux/liquidctl support existed; the protocol was fully reverse-engineered by iterative black-box probing of the HID interface on a Proxmox Linux host (the Windows companion app could not be used as a reference because GPU temperatures were passed through to a VM, leaving the screen blank).

Protocol (reverse-engineered):

  • HID report ID 0x20, 64 data bytes

  • Values are 16-bit big-endian, displayed verbatim (no unit conversion by device)

  • Three writable display fields:

    Field Command Byte offset Display capacity
    CPU temp 0x01 5–6 4 digits
    GPU temp 0x04 8–9 4 digits
    Pump RPM 0x10 11–12 4 digits
  • A secondary CPU field (0x02 @6–7) exists but its hardware renders only ~2 digits; the driver mirrors the primary CPU value there silently.

  • Screen blanks if any field is not refreshed within ~2 seconds.

  • No sensor data is readable from the device over USB (get_status returns []).

New file: liquidctl/driver/enermax_liqtech_xtr.py

Exposes three channels via set_screen:

liquidctl set cpu screen temperature 45
liquidctl set gpu screen temperature 2065   # GPU #2 at 65 °C  (id × 1000 + temp_c)
liquidctl set pump screen rpm 2900

The id × 1000 + temp_c convention for the GPU field encodes which GPU is currently shown in the leading digit, enabling multiple-GPU cycling from a daemon without needing a separate field.

set_color, set_fixed_speed, and set_speed_profile raise NotSupportedByDriver — the device has no USB-controlled LEDs and pump speed is PWM-controlled via the motherboard header.

New file: tests/test_enermax_liqtech_xtr.py

30 unit tests covering all channels, byte offsets, report length, boundary values, validation errors, and unsupported-method errors.

Tested on

  • Proxmox VE 9 / Linux 6.x, Enermax Liqtech XTR 360 (USB 2e3c:0a12)
  • All three display fields confirmed working at 1 s refresh cadence

The Enermax Liqtech XTR AIO cooler has a numeric LCD on the pump head
that accepts live data over USB HID.  No vendor documentation or prior
Linux/liquidctl support existed; the protocol was fully reverse-engineered
by iterative black-box probing of the HID interface on a Proxmox Linux host
(the Windows companion app could not be used as a reference because GPU
temperatures were passed through to a VM, leaving the screen blank).

Protocol: HID report ID 0x20, 64 data bytes, values 16-bit big-endian,
displayed verbatim.  Three writable fields: CPU temp (cmd 0x01, @bytes
5-6), GPU temp (cmd 0x04, @8-9, 4-digit), pump RPM (cmd 0x10, @11-12).
Screen blanks if any field is not refreshed within ~2 s.  No sensor data
is readable from the device over USB.

Exposes three channels via set_screen: cpu, gpu, pump.  The gpu field
supports an id*1000+temp_c encoding to identify which GPU is shown while
cycling multiple GPUs.

Adds 30 unit tests covering all channels, report structure, byte offsets,
boundary values, and unsupported-method errors.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant