Files
lianli-wireless/README.md
T
mangavalkandClaude Opus 5.5 35240e5dfc Add Lian Li SL-INF wireless tools and SignalRGB plugin
Proof-of-concept tools for the UNI FAN SL-INF Wireless kit (SLV3 TX/RX
dongles 0416:8040/8041): a Python scan/colour script, tinyuz helpers, a
JavaScript tinyuz encoder, the SignalRGB plugin and tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 00:12:23 +01:00

2.0 KiB

Lian Li wireless fan tools

Proof-of-concept tools for the Lian Li UNI FAN SL-INF Wireless kit (SLV3 TX 0416:8040, RX 0416:8041). Protocol from sgtaziz/lian-li-linux (MIT); compression is tinyuz (MIT).

Only one program can use a dongle at a time: quit SignalRGB (it holds the TX) and L-Connect before running anything that opens the TX.

File What it does
lianli_poc.py scan / color RRGGBB / demo. Needs pip install --user pyusb libusb-package.
tuzc.exe tinyuz compressor used by lianli_poc.py (stdin to stdout, round-trip checked).
tuzd.exe reference tinyuz decoder, tuzd <size>, used by the tests.
tuz.js JavaScript tinyuz encoder (same code is inlined in the plugin).
LianLi_Wireless_SLINF_PoC.js SignalRGB plugin source. Installed copy: Documents\WhirlwindFX\Plugins.
test/tuz_test.js node test/tuz_test.js: JS encoder vs reference decoder, no hardware.
test/js_tuz_on_fan.py sends JS-compressed frames to the fan (needs TX free).
test/watch_rx.py python test/watch_rx.py [seconds]: watches the fan's effect id via the RX only; works while SignalRGB runs.
build-src/ sources for tuzc.exe / tuzd.exe.

The plugin hardcodes the fan MAC e8:b5:62:62:32:e1 and RX slot 1 (from lianli_poc.py scan).

Rebuilding tuzc.exe / tuzd.exe

Clone https://github.com/sisong/tinyuz and https://github.com/sisong/HDiffPatch into build-src/, then with MinGW g++:

cd build-src
F="-O2 -DNDEBUG -D_HPATCH_IS_USED_MULTITHREAD=0 -D_IS_USED_MULTITHREAD=0 -IHDiffPatch/libParallel"
gcc $F -c tinyuz/decompress/tuz_dec.c -o tuz_dec.o
g++ $F -static -o ../tuzc.exe tuzc_main.cpp tuz_wrapper.cpp tuz_dec.o tinyuz/compress/tuz_enc.cpp tinyuz/compress/tuz_enc_private/*.cpp HDiffPatch/libHDiffPatch/HDiff/private_diff/libdivsufsort/divsufsort.cpp -x c HDiffPatch/libHDiffPatch/HPatch/patch.c
gcc -O2 -D_IS_RUN_MEM_SAFE_CHECK=1 -o ../tuzd.exe tuzd_main.c tinyuz/decompress/tuz_dec.c