Open source Linux interface for iCUE LINK Hub and other Corsair AIOs, Hubs.
- This project was created out of own necessity to control fans and pumps on workstations after switching everything to Linux.
- I take no responsibility for this code at all. Use this at your own risk.
- Most of the devices are actually tested on live hardware.
- OpenLinkHub supports multiple devices.
- Take care and have fun!
- This project does not accept any donations.
Device | VID | PID | Sub Devices |
---|---|---|---|
iCUE LINK System Hub | 1b1c |
0c3f |
ShowiCUE LINK QX RGBiCUE LINK RX iCUE LINK RX RGB iCUE LINK RX MAX iCUE LINK RX MAX RGB iCUE LINK LX RGB iCUE LINK H100i iCUE LINK H115i iCUE LINK H150i iCUE LINK H170i XC7 Elite XG7 XD5 Elite XD5 Elite LCD VRM Cooling Module iCUE LINK TITAN H100i iCUE LINK TITAN H150i iCUE LINK TITAN H115i iCUE LINK TITAN H170i LCD Pump Cover iCUE LINK XG3 HYBRID iCUE LINK ADAPTER iCUE LINK LS350 Aurora RGB iCUE LINK LS430 Aurora RGB |
iCUE COMMANDER Core | 1b1c |
0c32 0c1c |
ShowH100i ELITE CAPELLIXH115i ELITE CAPELLIX H150i ELITE CAPELLIX H170i ELITE CAPELLIX H100i ELITE LCD H150i ELITE LCD H170i ELITE LCD H100i ELITE LCD XT H115i ELITE LCD XT H150i ELITE LCD XT H170i ELITE LCD XT H100i ELITE CAPELLIX XT H115i ELITE CAPELLIX XT H150i ELITE CAPELLIX XT H170i ELITE CAPELLIX XT 1x Temperature Probe 4-LED RGB Fan 8-LED RGB Fan QL Fan Series LL Fan Series ML Fan Series Any PWM Fan |
iCUE COMMANDER Core XT | 1b1c |
0c2a |
ShowExternal RGB Hub2x Temperature Probe 4-LED RGB Fan 8-LED RGB Fan QL Fan Series LL Fan Series ML Fan Series Any PWM Fan H55 RGB AIO H100 RGB AIO H150 RGB AIO |
iCUE H100i RGB ELITE | 1b1c |
0c35 0c40 |
|
iCUE H115i RGB ELITE | 1b1c |
0c36 |
|
iCUE H150i RGB ELITE | 1b1c |
0c37 0c41 |
|
iCUE H100i RGB PRO XT | 1b1c |
0c20 |
|
iCUE H115i RGB PRO XT | 1b1c |
0c21 |
|
iCUE H150i RGB PRO XT | 1b1c |
0c22 |
|
H115i RGB PLATINUM | 1b1c |
0c17 |
|
H100i RGB PLATINUM | 1b1c |
0c18 |
|
H100i RGB PLATINUM SE | 1b1c |
0c19 |
|
Lighting Node CORE | 1b1c |
0c1a |
ShowHD RGB Series FanLL RGB Series Fan ML PRO RGB Series Fan QL RGB Series Fan 8-LED Series Fan SP RGB Series Fan |
Lighting Node PRO | 1b1c |
0c0b |
Show2x External RGB HubHD RGB Series Fan LL RGB Series Fan ML PRO RGB Series Fan QL RGB Series Fan 8-LED Series Fan SP RGB Series Fan |
Commander PRO | 1b1c |
0c10 |
Show2x External RGB Hub4x Temperature Probe Any PWM Fan |
XC7 ELITE LCD CPU Water Block | 1b1c |
0c42 |
ShowRGB ControlLCD Control |
VENGEANCE RGB PRO | 1b1c |
DDR4 | |
VENGEANCE RGB PRO SL | 1b1c |
DDR4 | |
VENGEANCE RGB RT | 1b1c |
DDR4 | |
VENGEANCE RGB RS | 1b1c |
DDR4 | |
DOMINATOR PLATINUM RGB | 1b1c |
DDR4 | |
VENGEANCE LPX | 1b1c |
DDR4 | |
DOMINATOR PLATINUM | 1b1c |
DDR4 | |
VENGEANCE | 1b1c |
DDR5 | |
VENGEANCE RGB | 1b1c |
DDR5 | |
DOMINATOR PLATINUM RGB | 1b1c |
DDR5 | |
DOMINATOR TITANIUM RGB | 1b1c |
DDR5 | |
K55 CORE RGB | 1b1c |
1bfe |
|
K65 PRO MINI | 1b1c |
1bd7 |
|
K70 CORE RGB | 1b1c |
1bfd |
|
K70 PRO RGB | 1b1c |
1bc6 |
|
K65 PLUS | 1b1c |
2b10 2b07 |
USB Wireless |
K100 AIR RGB | 1b1c |
1bab 1bdc |
USB Wireless |
KATAR PRO | 1b1c |
1b93 |
DPI Control RGB Control |
IRONCLAW RGB | 1b1c |
1b5d |
DPI Control RGB Control |
ST100 RGB | 1b1c |
0a34 |
RGB |
MM700 RGB | 1b1c |
1b9b |
RGB |
LT100 Smart Lighting Tower | 1b1c |
0c23 |
RGB |
HX1000i | 1b1c |
1c07 1c1e |
Fan Control |
HX1200i | 1b1c |
1c08 1c23 |
Fan Control |
HX1500i | 1b1c |
1c1f |
Fan Control |
HX750i | 1b1c |
1c05 |
Fan Control |
HX850i | 1b1c |
1c06 |
Fan Control |
RM850i | 1b1c |
1c0c |
Fan Control |
RM1000i | 1b1c |
1c0d |
Fan Control |
- Download either .deb or .rpm package from the latest Release, depends on your Linux distribution
- Open terminal
- Navigate to the folder where the package is downloaded
# Debian Based (deb)
$ sudo apt install ./OpenLinkHub_X.X.X_amd64.deb
# RPM based (rpm)
$ sudo rpm -ivh OpenLinkHub-X.X.X-1.x86_64.rpm
- libudev-dev
- go 1.22.2 - https://go.dev/dl/
# Required packages (deb)
$ sudo apt-get install libudev-dev
# Required packages (rpm)
$ sudo dnf install libudev-devel
$ git clone https://github.com/jurkovic-nikola/OpenLinkHub.git
$ cd OpenLinkHub/
$ go build .
$ chmod +x install.sh
$ sudo sh install.sh
# Download latest build from https://github.com/jurkovic-nikola/OpenLinkHub/releases
$ wget https://github.com/jurkovic-nikola/OpenLinkHub/releases/download/0.2.0/OpenLinkHub_0.2.0_amd64.tar.gz
$ tar xvf OpenLinkHub_0.2.0_amd64.tar.gz
$ cd OpenLinkHub/
$ chmod +x install.sh
$ sudo sh install.sh
{
"debug": false,
"listenPort": 27003,
"listenAddress": "127.0.0.1",
"cpuSensorChip": "k10temp",
"manual": false,
"frontend": true,
"metrics": true,
"dbusMonitor": false,
"memory": false,
"memorySmBus": "i2c-0",
"memoryType": 4,
"exclude": [],
"decodeMemorySku": true,
"memorySku": ""
}
- listenPort: HTTP server port.
- listenAddress: Address for HTTP server to listen on.
- cpuSensorChip: CPU sensor chip for temperature.
k10temp
orzenpower
for AMD andcoretemp
for Intel - manual: set to true if you want to use your own UI for device control. Setting this to true will disable temperature monitoring and automatic device speed adjustments.
- frontend: set to false if you do not need WebUI console, and you are making your own UI app.
- metrics: enable or disable Prometheus metrics
- dbusMonitor: enable or disable iCUE Link System Hub suspend / resume via DBus. Set this to true of your hub is not recovering after sleep via normal method
- memory: Enable overview / control over the memory
- memorySmBus: i2c smbus sensor id
- memoryType: 4 for DDR4. 5 for DDR5
- exclude: list of device ids in uint16 format to exclude from program control
- decodeMemorySku: set to false to manually define
memorySku
value. - memorySku: Memory part number, e.g. (CMT64GX5M2B5600Z40)
- You can find memory part number by running the following command:
sudo dmidecode -t memory | grep 'Part Number'
As an alternative, OpenLinkHub can be run in Docker, using the Dockerfile in this repository to build it locally. A configuration file has to be mounted to /opt/OpenLinkHub/config.json
$ docker build . -t openlinkhub
$ # To build a specific version you can use the GIT_TAG build argument
$ docker build --build-arg GIT_TAG=0.1.3-beta -t openlinkhub .
$ docker run --privileged -v ./config.json:/opt/OpenLinkHub/config.json openlinkhub
# For WebUI access, networking is required
$ docker run --network host --privileged -v ./config.json:/opt/OpenLinkHub/config.json openlinkhub
- Device Dashboard is accessible by browser via link
http://127.0.0.1:27003/
- Device Dashboard allows you to control your devices.
- RGB configuration is located at
database/rgb.json
file.
- profiles: Custom RGB mode data
- key: RGB profile name
- speed: RGB effect speed, from 1 to 10
- brightness: Color brightness, from 0.1 to 1
- smoothness: How smooth transition from one color to another is.
- the smoothness is in range of 1 to 40
- start: Custom starting color in (R, G, B, brightness format)
- end: Custom ending color (R, G, B, brightness format)
- If you want random colors, remove data from start and end JSON block.
"start":{}
and"end":{}
- If you want random colors, remove data from start and end JSON block.
- key: RGB profile name
- OpenLinkHub ships with built-in HTTP server for device overview and control.
- Documentation is available at
http://127.0.0.1:27003/docs
- By default, memory overview and RGB control are disabled in OpenLinkHub.
- To enable it, you will need to switch
"memory":false
to"memory":true
and set propermemorySmBus
value. - Things to consider prior:
- If you are using any other RGB software that can control your RAM, do not set
"memory":true
. - Two programs cannot write to the same I2C address at the same time.
- If you do not know what
acpi_enforce_resources=lax
means, do not enable this. - If you're still eager to use this...continue reading
- If you are using any other RGB software that can control your RAM, do not set
# Install tools
$ sudo apt-get install i2c-tools
# Enable loading of i2c-dev at boot and restart
echo "i2c-dev" | sudo tee /etc/modules-load.d/i2c-dev.conf
# List all i2c, this is AMD example! (AM4, X570 AORUS MASTER (F39d - 09/02/2024)
# If everything is okay, you should see something like this, especially first 3 lines.
$ sudo i2cdetect -l
i2c-0 smbus SMBus PIIX4 adapter port 0 at 0b00 SMBus adapter
i2c-1 smbus SMBus PIIX4 adapter port 2 at 0b00 SMBus adapter
i2c-2 smbus SMBus PIIX4 adapter port 1 at 0b20 SMBus adapter
i2c-3 i2c NVIDIA i2c adapter 1 at c:00.0 I2C adapter
i2c-4 i2c NVIDIA i2c adapter 2 at c:00.0 I2C adapter
i2c-5 i2c NVIDIA i2c adapter 3 at c:00.0 I2C adapter
i2c-6 i2c NVIDIA i2c adapter 4 at c:00.0 I2C adapter
i2c-7 i2c NVIDIA i2c adapter 5 at c:00.0 I2C adapter
i2c-8 i2c NVIDIA i2c adapter 6 at c:00.0 I2C adapter
i2c-9 i2c NVIDIA i2c adapter 7 at c:00.0 I2C adapter
# If you do not see any smbus devices, you will probably need to set acpi_enforce_resources=lax
# Before setting acpi_enforce_resources=lax please research pros and cons of this and decide on your own!
# In most of the cases, memory will be registered under SMBus PIIX4 adapter port 0 at 0b00 device, aka i2c-0. Lets validate that.
# DDR4 example:
$ sudo i2cdetect -y 0 # this is i2c-0 from i2cdetect -l command
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 08 -- -- -- -- -- -- --
10: 10 -- -- 13 -- 15 -- -- 18 19 -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: 30 31 -- -- 34 35 -- -- -- -- 3a -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- 4a -- -- -- -- --
50: 50 51 52 53 -- -- -- -- 58 59 -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- 6c -- -- --
70: 70 -- -- -- -- -- -- --
# Lets explain this wall of text. (DDR4)
# DDR4 memory uses i2c addresses from 0x50 to 0x57 for DIMM information.
# In this example, I have 4 DIMMs of DDR4 in the workstation, so addresses 50,51,52 and 53 are populated.
# If you have 2 DIMMs, 50 and 51 will be populated.
# DIMMs with RGB control will have addresses from 58 to 5f. In this example, I have 2 DIMMs with RGB, 2 are without. So 58 and 59 are populated.
# DIMMs with temperature reporting have addresses from 18 to 1f. In this example, I have 2 DIMMs with temperature probe, 2 are without. So 18 and 19 are populated.
# To summarize:
# If you have 1 DIMM, 50 address will be populated, 58 if DIMM has RGB control, 18 if there is temperature probe on the DIMM.
# If you have 2 DIMM, 50,51 address will be populated, 58,59 if DIMM has RGB control, 18,19 if there is temperature probe on the DIMM.
# If you have 3 DIMM, 50,51,52 address will be populated, 58,59,5a if DIMM has RGB control, 18,19,1a if there is temperature probe on the DIMM.
# If you have 4 DIMM, 50,51,52,53 will be populated, 58,59,5a,5b if DIMM has RGB control, 18,19,1a,1b if there is temperature probe on the DIMM.
# If your result looks similar to this, you are on the right i2c sensor. If not, try different SMBus device ID.
# DDR5 example:
$ sudo i2cdetect -y 2 # this is i2c-0 from i2cdetect -l command
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- 19 -- 1b -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- 49 -- 4b -- -- -- --
50: -- 51 -- 53 -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
# Lets explain this wall of text. (DDR5)
# DDR5 memory uses i2c addresses from 0x50 to 0x57 for DIMM information.
# In this example, I have 2 DIMMs of DDR5 in the workstation, so addresses 51 and 53 are populated.
# If you have 4 DIMMs, 50,51,52 and 53 will be populated.
# DIMMs with RGB control will have addresses from 18 to 1f. In this example, I have 2 DIMMs with RGB, so 19 and 1b are populated.
# DIMMs with temperature reporting uses same DIMM info registers, from 50 to 57. Temperature data is stored in 0x31 address.
# To summarize:
# If you have 1 DIMM, 50 address will be populated, 18 if DIMM has RGB control.
# If you have 2 DIMM, 50,51 address will be populated, 18,19 if DIMM has RGB control.
# If you have 3 DIMM, 50,51,52 address will be populated, 18,19,1a if DIMM has RGB control.
# If you have 4 DIMM, 50,51,52,53 will be populated, 18,19,1a,1b if DIMM has RGB control.
# If your result looks similar to this, you are on the right i2c sensor. If not, try different SMBus device ID.
# Set I2C permission
$ echo 'KERNEL=="i2c-0", MODE="0666"' | sudo tee /etc/udev/rules.d/99-corsair-memory.rules
# Reload udev rules
$ sudo udevadm control --reload-rules
$ sudo udevadm trigger
- Modify
"memorySmBus": "i2c-0"
if needed. - Set
"memory":true
in config.json file. - Set
"memoryType"
in config.json4
if you have a DDR4 platform5
if you have a DDR5 platform
- Restart OpenLinkHub service.