Skip to content

Determining Device Type

The Type() export tells SignalRGB which USB communication protocol to use for your plugin. Choosing the wrong type is one of the most common reasons a plugin fails to communicate with a device.

export function Type() { return "hid"; }

Type stringProtocolTypical devices
"hid"HID (Human Interface Device)Keyboards, mice, headsets, most consumer peripherals
"rawusb"Raw USB bulk/interrupt transfers via libusbAIO coolers, LCD screens, custom hardware, lighting controllers
"hybrid"Both HID and raw USB simultaneouslyDevices that use HID for control commands but bulk USB for large data (e.g. Alienware monitors, ASUS Ryuo AIOs)
"serial"Serial/COM portArduino-based controllers, Hyte CNVS
"smbus"SMBus / I²CRAM sticks, GPUs, motherboard headers accessed via SMBus
"network"Network socket (TCP or UDP)Wi-Fi or Ethernet connected controllers

Type strings are case-insensitive — "HID", "Hid", and "hid" all work, but lowercase is the convention.


HID is the most common type. The operating system gives SignalRGB direct access to the device without requiring a custom driver. Use this for keyboards, mice, headsets, and most consumer peripherals.

export function Type() { return "hid"; }

With HID you use device.write() / device.send_report() for writes, and device.read() / device.get_report() for reads. See Writes and Reads for details.


Raw USB bypasses the HID layer and communicates directly with the device using libusb. You need this when:

  • The device is not a HID-class device
  • You need bulk transfers larger than the HID packet size limit
  • The device requires libusb-level access (e.g. for LCD image streaming)
export function Type() { return "rawusb"; }

With raw USB you use the same device.write() and device.read() functions, but they now map to libusb bulk/interrupt transfers rather than HID. You may also use device.bulk_transfer() and device.control_transfer() for more control. See Advanced Communication.


Use "hybrid" when a device uses HID for some commands (e.g. authentication or configuration) and raw USB bulk transfers for others (e.g. streaming image data to an LCD). Both HID endpoints and raw USB endpoints are opened simultaneously.

export function Type() { return "hybrid"; }

For devices connected via a COM port. Import @SignalRGB/serial and use its read/write methods. See Advanced Communication for the full serial API.

import { serial } from "@SignalRGB/serial";
export function Type() { return "serial"; }

If you’re not sure which type your device needs, start here:

Does Windows enumerate it as a HID device?
├─ Yes → start with "hid"
│ If write commands fail → try "rawusb"
│ If the device also needs large bulk transfers → use "hybrid"
├─ No, it's a COM/serial port → "serial"
├─ No, it's on the network → "network"
└─ No, it's an SMBus device (RAM, GPU) → "smbus"

The most reliable way to check is to open USBDeview or Device Manager and look at the device class. A class of HID means "hid". A class of USB or libusb means "rawusb". If you see both, "hybrid" may be needed.

When in doubt, try "hid" first. If device.write() returns an error or the device doesn’t respond, switch to "rawusb".