Unofficial Linux driver for ID-COOLING FX series LCD AIO liquid coolers. The vendor software is Windows-only. This tool speaks the cooler's native USB HID protocol directly, so you can put any picture on your AIO's LCD from Linux — no Wine, no VM.
- Send any image to the LCD (auto-resized to 240x240)
- Clockwise rotation: 0 / 90 / 180 / 270
- Video mode and temperature overlay — on the roadmap
- ID-COOLING FX 240 / FX 360 LCD series
- Known USB IDs: VID
0x2000, PID0x3000 - Tested on: FX 240 LCD
Your VID/PID may differ! Other batches or regional versions may use different USB IDs. Find your device with:
lsusbOn my system the cooler shows up as CMX Systems HOTSPOTEKUSB HID DEMO, ID 2000:3000 — yours may be listed differently. Not sure which line is your cooler? Unplug it, run lsusb, plug it back in and run lsusb again: the new line is your device. (Or paste the lsusb output into an AI assistant and ask which entry is your AIO.)
If your IDs differ, update them in two places:
- In the code. Open
core.pyand edit the constants at the top (example values for ID1234:abcd):
VID = 0x1234
PID = 0xabcd- In the udev rule. Create
/etc/udev/rules.d/99-fx-lcd.ruleswith your IDs, written without the0xprefix:
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="abcd", MODE="0666"
Then apply the rule and replug the cooler:
sudo udevadm control --reload-rules && sudo udevadm triggerPython 3.9+
hidapi and Pillow:
- Arch:
sudo pacman -S python-hidapi python-pillow- pip:
pip install hidapi pillowgit clone https://github.com/w1n-ror/fx_lcd_software-for-linux.git
cd fx_lcd_software-for-linuxThe tool writes to /dev/hidraw*. Without permissions you will get Permission denied. Either run as root, or (recommended) add a udev rule.
Create /etc/udev/rules.d/99-fx-lcd.rules:
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="2000", ATTRS{idProduct}=="3000", MODE="0666"
(adjust idVendor/idProduct if your device differs)
Apply without reboot:
sudo udevadm control --reload-rules && sudo udevadm triggerYou may need to replug the cooler afterwards.
chmod +x main.py
ln -s "$PWD/main.py" ~/.local/bin/fx_softwareMake sure ~/.local/bin is in your PATH (e.g. fish_add_path ~/.local/bin or add it to your shell profile). The symlink's name becomes the command name — call it whatever you like.
fx_software --mode image ~/wallpaper.png
fx_software --mode image --rotate 90 ~/wallpaper.png| Argument | Description |
|---|---|
--mode {image,video} |
Required. video is coming soon |
path |
Required positional, path to your image |
--rotate {0,90,180,270} |
Clockwise rotation, default 0 |
-h, --help |
Show help |
The image is converted to a baseline JPEG (4:2:0), resized to 240x240 and streamed to the display in a loop. Press Ctrl+C to stop.
Run in background (no visible terminal):
fx_software --mode image ~/wallpaper.png &
disownStop it later with:
pkill -f fx_software- Permission denied — udev rule not applied, see Installation Step 2 (or run with
sudo). - Device not found / nothing happens — check
lsusbfor VID/PID; if yours differ, see Supported devices above. - Image is upside down or sideways — use
--rotate. - Screen stays black — make sure no other software (VM, Wine instance of the vendor tool) is holding the device.
Reverse-engineered by observing the vendor software over USB HID. All transfers are HID writes with report id 0x00.
Frame packet (32-byte header, then the JPEG):
43 52 54 00 00 "CRT"
44 52 41 00 00 "DRA"
LL LL payload length = 32 + JPEG size, big-endian
B1 magic byte
00 * 19 padding
FF D8 ... FF D9 baseline JPEG, 4:2:0 subsampling
Payload is sent in 1024-byte chunks, each prefixed with report id 0x00.
Pacing between chunks ~2.5–3 ms; faster writes overflow the device.
Other commands:
DIS(44 49 53 00 00+ zeros) — disconnect/clear. Sent at session start, the display clears when the stream stops; without it the last frame persists in the buffer.LIG(4C 49 47 00 00+ brightness byte) — brightness,0x64= 100%. The vendor sends it twice per session; once is enough.
- Video mode
- Temperature overlay
- EXIF orientation auto-fix
- GUI
Not affiliated with ID-COOLING. Use at your own risk. This tool only sends display frames; it does not touch fan or pump control.
Issues and PRs are welcome. For device-compatibility reports please attach lsusb output and, if possible, a strace capture of the vendor software.