Skip to content

About

Community reverse-engineering notes for the Ulanzi D100H Dial Creative Controller: HID protocol, Ulanzi Studio internals, and plugin SDK gotchas.

Topics

Resources

Stars

13 stars

Watchers

0 watching

Forks

Latest commit

 

History

35 Commits

Folders and files

Repository files navigation

ulanzi-d100h-homebrew

Community reverse-engineering notes for the Ulanzi D100H Dial Creative Controller — how it actually works at the HID level, how Ulanzi Studio stores its config, and the gotchas you'll hit building your own integration. Unofficial; gathered by poking at a real unit on Windows 11.

Ulanzi D100H — top view Ulanzi D100H — angled view Ulanzi D100H — knob Ulanzi D100H in action — knob spins, keys flash

▶  Try the live interactive dial
Spin the knob, light the keys, or connect your real D100H over WebHID and watch it sync.
To drive it from the real dial, close Ulanzi Studio first — while it's running the dial is in online mode (Studio handles the input) and the page won't see it.

Layout + full specs confirmed against the official Ulanzi manual.

🌀 Also in this repo — an on-screen D100H you can drop into your own app. A picture of the dial that moves like the real one — turn the knob and the on-screen knob spins; press a key and it lights up. The image layers + how-to are in docs/dial-skin.md. (The dial images + GIF above were built from those layers with rembg for background removal + Pillow.)

▶ Try it live: interactive dial viewer — drag the knob, click keys, or hit Connect to drive it from your real D100H over WebHID (Chrome/Edge; close Ulanzi Studio first so it isn't holding the dial).

The device & official links

More — including the related D200 reverse-engineering projects — in docs/resources.md.

Why this exists

The D100H is a cheap, genuinely nice Bluetooth dial + 7-button macro pad. If you want to drive your own software with it instead of Ulanzi Studio's built-in presets, you run into a wall of undocumented behavior. This repo collects everything I found the hard way so you don't have to.

TL;DR — the things that'll save you hours

  1. It's Bluetooth-only (USB-C charges only, no data) and enumerates over HID as KEHWIN / Dial_Lite, VID 0xfff1 PID 0x0082 — not an obvious "Ulanzi" ID.
  2. Offline = fixed defaults. You cannot save a custom layout to the device. Any remap you make in Ulanzi Studio only works while Studio is running. Close Studio and the dial reverts to volume/media/copy-paste. (Tested directly — see docs/ulanzi-studio.md.)
  3. The defaults are standard HID: dial = volume up/down/mute (Consumer page, readable); 3 buttons = media prev/play/next (readable); 4 buttons = Ctrl+C/V/Z/Y (Keyboard page — Windows blocks apps from reading this, so those 4 are invisible to node-hid).
  4. So a no-app, HID-only homebrew tops out at: the dial + 3 buttons, and it'll move your volume. For all 7 buttons cleanly you need Studio running (a plugin, or a hotkey remap + a listener).
  5. Plugins work. A third-party UlanziDeck plugin's actions show up in Studio's action list and bind to the D100H's dial + keys fine. That's the clean path to custom behavior. This repo ships one — D100H Mirror — that mirrors the dial + all 7 keys to the on-screen viewer while Studio is running, and still replays each control's real function.
  6. The dial press only registers while plugged into USB (charging or not — a full battery doesn't help). Rotation works fine wirelessly; the click sends nothing over Bluetooth alone. So don't build a battery-only homebrew around knob-press. (Observed on one unit — see docs/hardware.md.)

Contents

Assets

The transparent dial PNGs shown at the top (knob spins, keys flash white) live in docs/images/. The interactive spin/press method + layered assets are in docs/dial-skin.md (from chumthesizer).

More from the author

Other Ulanzi projects by @brendanwelsh:

  • chumthesizer (CHUM-1) — a browser/Electron groovebox synth you play with real hardware: the D100H dial warps the sound (turn = FX macro, press = play/stop) and its 7 keys switch the sounds, alongside an Apple Magic Trackpad and a Stream Deck pedal. A fun, musical example of driving software from the dial.
  • ulanzi-camera-switcher — drive a live security-camera viewer from a hardware dial: rotate = next/prev camera, press = open/close a maximized mpv viewer, keys jump to a specific camera. Works with any RTSP/HTTP camera (UniFi Protect, Reolink, Frigate, ONVIF…) and ships as both a UlanziDeck plugin and a standalone HID daemon — a working example of the dial-driving approach these notes enable.
  • ulanzi-pixel-clock-awtrix — guide + curated resources for the Ulanzi TC001 Pixel Clock on AWTRIX firmware: hardware, flashing, the MQTT/HTTP API, and Home Assistant integrations.

Disclaimer

Unofficial; no affiliation with Ulanzi. Findings are from one D100H on Windows 11 — firmware or app updates may change behavior, and macOS may differ. Corrections and additions welcome via PR/issue.

About

Community reverse-engineering notes for the Ulanzi D100H Dial Creative Controller: HID protocol, Ulanzi Studio internals, and plugin SDK gotchas.

Topics

Resources

Stars

13 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages