Skip to content

tomasrch/STREAM-VISION-AIO-DISPLAY-SERVICE

Repository files navigation

Stream Vision AIO Display Service

An IVNS product. A free, open-source Windows service that streams live system stats to the Thermalright Stream Vision AIO-cooler USB LCD (the "USBDISPLAY" screen) and optionally drives a temperature/load‑based fan curve — all controlled from a secure web panel.

It exists because the factory software (TR‑VISION HOME) talks to the screen over ADB and may fail to detect it, leaving the LCD dark. This service drives the panel directly over WinUSB instead, so the screen works regardless — and it adds real CPU/GPU temperatures and fan control the factory app never had.

Display preview


Features

  • Live system monitor on the 640×480 LCD: hostname, clock/date, CPU load, CPU temp, GPU temp, RAM, and fan RPMs.
  • Multiple modes: system monitor, custom text, an uploaded image, or a solid color.
  • Real sensors via LibreHardwareMonitor (CPU package temp, per‑GPU core temp, fan tachometers).
  • Temperature/load fan curve driving the motherboard Super‑I/O fan headers, with hard safety rails (see below).
  • Secure web control panel (token‑authenticated) reachable from the PC or any device on your LAN/phone.
  • Runs as a proper Windows service under LocalSystem, auto‑starts on boot, auto‑restarts on failure.
  • Settings persist across restarts.

⚠️ Safety & disclaimer

This software can override your motherboard's BIOS fan curve. Read this before enabling fan control:

  • Fan control is OFF by default. Nothing is changed until you enable it in the panel.
  • Your AIO pump header is pinned to 100% and can never be placed on a curve.
  • A minimum‑PWM floor prevents fans from stopping, and a critical‑temperature failsafe forces 100%.
  • When the service stops (or crashes), all controlled fans are released back to BIOS control.
  • Still, you use this at your own risk. Verify your fan/pump headers and curve, and watch temperatures after enabling. The software is provided "as is" with no warranty (see LICENSE).
  • Not affiliated with or endorsed by Thermalright. Product names and trademarks belong to their respective owners.

Hardware / requirements

  • Windows 10/11 (x64).
  • A Thermalright Stream Vision–class USB LCD that enumerates as WinUSB device VID 87AD/PID 70DB (ChiZhu Tech "USBDISPLAY", model SSCRM-V1, 640×480, JPEG frames). The screen must be bound to the WinUSB driver (it self‑registers its device interface GUID, so Windows usually does this automatically).
  • Fan control additionally requires a motherboard whose Super‑I/O chip is supported by LibreHardwareMonitor (developed/tested on ASRock B550 / Nuvoton NCT6796D). The fan‑header identifiers and the pump header are configurable.
  • To build from source: the .NET 9 SDK. To run a published build: the .NET 9 Runtime (the Install-Service.ps1 deploys a framework‑dependent build that uses the shared runtime; SYSTEM can access it).

The screen is driven by the SSCRM bulk protocol, so other coolers in the same family (GrandVision, Mjolnir Vision, Wonder Vision Pro, etc.) may also work. Fan‑header IDs differ per board — adjust them in the panel.


Install

Option A — build and install from source

git clone https://github.com/tomasrch/STREAM-VISION-AIO-DISPLAY-SERVICE.git
cd STREAM-VISION-AIO-DISPLAY-SERVICE
dotnet publish -c Release -o publish
# then, in an elevated PowerShell:
powershell -ExecutionPolicy Bypass -File .\Install-Service.ps1

Install-Service.ps1 (run as Administrator) copies the build to C:\Program Files\IVNS\Stream Vision AIO Display Service\, registers the StreamVisionDisplay service as LocalSystem with auto‑start + auto‑restart, and starts it.

First run

On start the service prints (to the Windows Event Log) and writes the control‑panel URL with its API key. The key is stored at:

C:\ProgramData\StreamVisionDisplay\api.key

Open the panel:

http://localhost:8770/?key=<the key from api.key>

From another device on your network, replace localhost with the PC's LAN IP. The browser remembers the key after the first visit.

Uninstall

Run as Administrator:

powershell -ExecutionPolicy Bypass -File .\Uninstall-Service.ps1

User manual

The control panel

  • Display section — pick a mode and tune it live:
    • Monitor: set the title (defaults to the PC name), toggle Clock, CPU load, CPU temp, GPU temp, RAM, and Fan RPM; choose background/text/accent colors.
    • Text: show any multi‑line text at a chosen size.
    • Image: upload a picture (centered and scaled to fit).
    • Color: a solid fill.
    • FPS and Rotate (0/90/180/270) apply to every mode.
  • Fan curve section — see below. A live preview of exactly what's on the LCD is shown top‑left, alongside service status (display connected, frame count, admin, temp source, fan state).

Fan control

  1. Check the Curve box next to each fan header you want the curve to drive. (Headers that aren't spinning show - RPM.)
  2. The pump (Fan #2 / WP) is in the 100% column by default — leave it there.
  3. Choose what drives the curve (CPU temp, CPU load, or GPU temp), set the min PWM, the critical °C → 100% threshold, and the curve as temp:pwm pairs (e.g. 30:30, 45:35, 65:60, 85:100).
  4. Flip Enable software fan control. Watch RPMs change live. Turn it off (or stop the service) to hand control back to BIOS.

Where things live

Path Purpose
C:\Program Files\IVNS\Stream Vision AIO Display Service\ Installed binaries
C:\ProgramData\StreamVisionDisplay\config.json Saved display + fan settings
C:\ProgramData\StreamVisionDisplay\api.key Web API key
C:\ProgramData\StreamVisionDisplay\uploads\ Uploaded images

Managing the service

sc.exe stop  StreamVisionDisplay
sc.exe start StreamVisionDisplay
sc.exe query StreamVisionDisplay

Web API

All endpoints except GET / require the API key, supplied as an X-Api-Key header or a ?key= query parameter. The bare GET / returns only the (data‑free) HTML shell.

Method Endpoint Description
GET / Control‑panel HTML
GET /api/state { config, fan, status, fans }
POST /api/config Patch display config (JSON of changed keys)
POST /api/fan Patch fan config (JSON of changed keys)
POST /api/upload?name=<file> Upload an image (raw body) and switch to image mode
GET /preview.jpg The current rendered frame (JPEG)

The server binds LAN‑wide (http://+:8770/) but every data/control/preview route is gated by a constant‑time key check. To restrict it to localhost only, change the bind prefix in WebServer.cs.


How it works (code information)

A single .NET 9 Worker Service (Microsoft.NET.Sdk.Worker + AddWindowsService) runs three things: a render/stream loop, a fan loop, and the web server.

File Responsibility
Program.cs Host bootstrap; registers the Windows service + Worker.
Worker.cs BackgroundService: the stream loop (render → send at FPS) and the fan loop (read sensors → apply curve every 2 s). Releases fans to BIOS on stop.
WinUsbDisplay.cs WinUSB device access via P/Invoke (setupapi + winusb). Finds the screen by its device‑interface GUID, handshakes, and bulk‑writes frames.
Hardware.cs LibreHardwareMonitor wrapper: CPU/GPU/RAM reads and Super‑I/O fan PWM control.
Renderer.cs Draws the 640×480 frame with SixLabors.ImageSharp and encodes JPEG.
WebServer.cs HttpListener server: API‑key auth + JSON endpoints.
Html.cs The embedded control‑panel page.
AppState.cs Shared config/status + JSON persistence.

Display protocol (SSCRM bulk)

The screen is a vendor‑specific WinUSB device (interface class 0xFF) with two bulk endpoints: 0x01 OUT, 0x81 IN.

  • Handshake: write a 64‑byte packet 12 34 56 78 … with the command type 1 (DEV_INFO) at byte 56; read the device‑info response. The model string (SSCRM-V1) and panel code are in the reply.
  • Frame: a 64‑byte header followed by a 640×480 JPEG. Header layout: bytes 0–3 = 12 34 56 78; byte 4 (uint32 LE) = 2 (JPEG); bytes 8/12 = width/height; byte 56 (uint32 LE) = 2 (PICTURE command); byte 60 (uint32 LE) = payload length. A zero‑length packet is sent when the frame length is a multiple of 512.
  • The firmware does not latch a frame, so the service streams continuously (default 5 fps).

Protocol details were derived from the open reverse‑engineering work in Lexonight1/thermalright-trcc-linux.


Build from source

dotnet build   -c Release          # compile
dotnet publish -c Release -o publish   # framework-dependent deployment

Dependencies (NuGet): LibreHardwareMonitorLib, SixLabors.ImageSharp, SixLabors.ImageSharp.Drawing, Microsoft.Extensions.Hosting(.WindowsServices).


Troubleshooting

  • Panel says "Display: not found". Confirm the LCD enumerates as VID_87AD&PID_70DB and is on the WinUSB driver (Device Manager → Details → Driver = winusb.inf).
  • CPU temp shows n/a / fans missing. The service must run with administrator/SYSTEM rights (it does as an installed service). Running the exe directly as a normal user can't access the sensor driver.
  • Can't open the panel. Get the key from C:\ProgramData\StreamVisionDisplay\api.key and use …/?key=<key>.
  • Two services after upgrading. The installer removes a previous StreamVisionDisplay/TomasDisplayService before reinstalling.

Credits


License & contact

Released under the MIT License. Copyright © 2026 IVNS.