(日本語: README.ja.md)
Put CPU temperature on the pump head — then switch to live CPU power when you want to see the workload react.
What it is: a Windows tray app that drives the 3½-digit display on the pump head of the CPS DS360 liquid cooler. It reads CPU temperature every half second, can switch to CPU package power or GPU temperature, and writes the value over USB HID. At startup, the display picks one of five instrument-like movements before settling on the live reading.
Where the protocol came from: the manufacturer does not publish one. The USB traffic was captured and replayed against the real cooler until every byte was accounted for. The result is written down in docs/PROTOCOL.md — measured values only, with anything unverified marked as such.
What runs on your machine stays on your machine. OpenDS360 opens no sockets, contacts no server, and collects nothing. The only device it writes to is the cooler.
Built and maintained by Quo at kitepon.dev.
Two different coolers are sold under the name "DS360." They share a name and nothing else.
| Your pump head shows | This is |
|---|---|
| Digits only, in white seven-segment style | A match. Read on |
| Images, animations, or a colour dashboard | A 2.4-inch LCD model, speaking a completely different protocol |
| Status | Model | Notes |
|---|---|---|
| ✅ Verified | PCCooler CPS DS360 WH | Tested on real hardware. Distributed in Japan by Scythe as DS360-WH |
| 🟡 Likely, unverified | CPS DS360 BK and other 3½-digit seven-segment siblings | Same ODM and control board, as far as can be determined. Reports welcome |
| 🟡 Likely, unverified | Seven-segment AIO coolers from other brands built by APALTEK | APALTEK does not publish its customer list |
| ❌ Not supported | CPS DS360 Display, DC360 Pro, and other 2.4-inch LCD models | Different protocol entirely |
| ❌ Not supported | PCCooler GT360 | CDC-ACM at 640×480. A separate project covers it |
VID 0x2E3C / PID 0x0A15
Product string: LIQUID COOLER DIGITAL DISPLAY - PCC
0x2E3C belongs to ARTERY Technology, a microcontroller vendor — not to the cooler. APALTEK reuses the VID of the MCU it ships, so unrelated products (USB testers, radios) answer to the same VID. OpenDS360 matches the product string as well before it writes anything, so it will not talk to a device that merely shares the VID.
- Download the installer from Releases and run it.
- Install PawnIO if you want CPU temperature or power:
winget install namazso.PawnIO
- OpenDS360 starts in the tray. Right-click or double-click the icon to open settings.
The .NET runtime ships inside the installer, so there is nothing else to install.
CPU temperature and package power are read through privileged hardware interfaces that an ordinary program cannot access. Reaching them needs a kernel driver.
PawnIO is open source and signed, and it works with HVCI left enabled — your machine's protections stay exactly as they are. The older WinRing0 driver is on Microsoft's blocklist over CVE-2020-14979 and fails on current systems.
GPU temperature works without PawnIO. Without it, CPU temperature and power readings come back as 0 and everything else keeps running.
The startup sequence (StartupEffect.cs) opens the same way every time — 188 lights every segment and blinks, the way a bench instrument announces it woke up — and then picks one of five movements at random.
| Movement | What happens |
|---|---|
| Needle | Sweeps 0 → 199 twice at 10 ms a frame, decelerates, passes the target, and the swing decays — an analogue needle settling |
| Climb | Starts from rest, accelerates upward, overshoots once, and drops back |
| Descend | Falls from 199, slowing as it goes, and lands from above |
| Stagger | Stops just short, waits — then closes the remaining distance |
| Overrun | Runs all the way to 199, blinks there, then walks down. Roughly 1 start in 40 |
It lands on the value it just measured, so it finishes somewhere different every time. Between that and the random movement, no two starts look alike.
The display keeps up with 10 ms updates without dropping frames, which is what makes any of this possible. That is a measured number, not an assumed one.
You can replay one from the tray menu. It re-rolls the movement, so it is also how you go looking for the rare one.
Blink above a threshold. Set a temperature or wattage and the display blinks whenever the reading reaches it. Byte [3] of the report drives a blink in hardware; the bundled software leaves that byte at zero and never uses it.
| Setting | Options |
|---|---|
| What to display | CPU package temperature / CPU CCD maximum / GPU temperature / CPU power draw |
| Unit | Celsius / Fahrenheit |
| Blink threshold | Blink at or above this value (0 disables it) |
| Startup sequence | On / off |
| Start with Windows | Register a logon task |
CPU CCD maximum is for chips whose CCDs run far apart — on a Ryzen 9 9950X3D, CCD1 at 70 °C alongside CCD2 at 48 °C is ordinary. The package figure averages that away; the CCD maximum shows the hot one.
CPU power draw reads package power in watts, and 0–199 W lands inside the display range without scaling. It is worth trying because power moves far faster than temperature: launch a game and the reading jumps from 30 to 140 at once, while the temperature is still crawling upward seconds later.
Two things about power mode are worth knowing before you switch to it:
- The degree dot stays lit. Byte
[2]only chooses between Celsius and Fahrenheit — there is no "no unit" option — so the display keeps showing a degree mark next to a wattage. The protocol has no way around it - The blink threshold is stored separately from the temperature one, because 85 means something entirely different in °C and in W. Switching back and forth keeps both
Settings are stored in %APPDATA%\OpenDS360\settings.json.
OpenDS360 needs administrator rights, and an entry under HKCU\...\Run would raise a UAC prompt at every logon. It registers a Task Scheduler task set to run with highest privileges instead, which starts without a prompt.
The cooler ships with DeviceMonitorPcc. Reading that binary settled several questions about how OpenDS360 should behave.
| Observed in the bundled software | What OpenDS360 does |
|---|---|
| FTP credentials sit in plain text inside the executable, and a plain FTP connection is attempted at every start | Opens no network connections at all |
A logon entry is written to HKLM\...\Run, a location that requires administrator rights |
Registers a Task Scheduler task under the current user |
| The About dialog reports a Hardware and Firmware Version that is never requested from the device | Shows only values read from the device |
A debug CRT (ucrtbased.dll) ships with the release build |
Ships a release build |
| The code-signing certificate expired on 2025-02-27 | Distributed unsigned, with published sources and a SHA-256 digest on every release asset |
Two more rules hold throughout:
- Failures surface. A corrupt settings file starts the app on defaults; a failed save is reported to you rather than swallowed.
- Report IDs
0xF0/0xF1are never written to. They appear to be the firmware update channel, and a wrong write there could brick the cooler.
docs/PROTOCOL.md documents the whole thing — report layout, byte semantics, measured limits, and the parts that stayed unknown. It is published so that the next person taking apart a display like this starts further along than an empty capture window.
[0] 0x20 report ID
[1] 0x01 command: update
[2] unit — 0 = Celsius, 1 = Fahrenheit
[3] blink — 0 = steady, non-zero = blink
[6] the number on the display
Four findings decide whether an implementation works at all:
- Send every 0.5 s, without gaps. A watchdog blanks the display when the stream stops. Nearly every "the display randomly turns off" report traces back to this.
- Clamp to 0–199. The hundreds digit is a half-digit. Send
200and the display shows99. - Convert to Fahrenheit on the PC —
floor(C * 9 / 5 + 32). Byte[2]selects the label, not a conversion. - Per-segment control does not exist. Every channel in the report descriptor and every byte of
0x20was scanned before concluding that.
# Self-contained single executable
dotnet publish src/OpenDS360 -c Release -o dist/app
# Installer (requires Inno Setup 6)
ISCC.exe installer/OpenDS360.issTrimming stays off: LibreHardwareMonitorLib resolves hardware implementations through reflection, and a trimmer silently removes sensors that only some machines need.
Whether it worked or not, the report is useful. The compatibility table above grows from what people send in — open an issue with:
- the cooler's model name
- what the pump head shows (digits only, or a colour screen)
- the VID / PID from Device Manager
Do not run OpenDS360 and DeviceMonitorPcc at the same time. The device accepts writes from both processes, and the display flickers between two sources. OpenDS360 detects the other program at startup and asks you to close it.
This is unofficial software. It has no connection to PCCooler or APALTEK, and neither company has endorsed or supported it. Use it at your own risk.
MIT. Bundled third-party components are listed in THIRD-PARTY-NOTICES.md.


