Skip to content

Repository files navigation

OpenDS360 — an unofficial Windows tray app that drives the 3½-digit display on the PCCooler CPS DS360 pump head over USB HID

OpenDS360

CI release downloads Windows 10 | 11 license: MIT

(日本語: 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.


Does this fit your cooler?

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

The CPS DS360 WH pump head reading 157 on its seven-segment display, photographed inside a running system with the cooler and tubes visible

Identifying the device

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.


Install

  1. Download the installer from Releases and run it.
  2. Install PawnIO if you want CPU temperature or power:
    winget install namazso.PawnIO
  3. 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.

Why PawnIO

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.


What you see

The pump head running the OpenDS360 startup sequence: every segment lit, a fast sweep, deceleration, an overshoot past the target, and a settle onto the measured temperature

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 0199 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.


Settings

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.

Starting with Windows

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.


Design decisions

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 / 0xF1 are never written to. They appear to be the firmware update channel, and a wrong write there could brick the cooler.

The protocol

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 200 and the display shows 99.
  • Convert to Fahrenheit on the PCfloor(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 0x20 was scanned before concluding that.

Build

# Self-contained single executable
dotnet publish src/OpenDS360 -c Release -o dist/app

# Installer (requires Inno Setup 6)
ISCC.exe installer/OpenDS360.iss

Trimming stays off: LibreHardwareMonitorLib resolves hardware implementations through reflection, and a trimmer silently removes sensors that only some machines need.


Report your hardware

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

Notes

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.


License

MIT. Bundled third-party components are listed in THIRD-PARTY-NOTICES.md.

About

Show CPU temperature or live CPU power draw on the PCCooler CPS DS360 pump head. Free offline Windows tray app with five startup movements and a measured USB HID protocol.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages