HA Hub for UlanziDeck — control Home Assistant from your stream deck

I’ve been building an open-source plugin for the **UlanziDeck D200X** (stream deck with 14 LCD keys + 3 rotary encoders) that integrates with Home Assistant. Sharing in case anyone here also has one of these decks and wants live HA control surface on it.

GitHub: https://github.com/weemaba999/ha-hub-ulanzi

License: AGPL-3.0

Status: 0.11.13-beta (used daily on my own setup, real-world testing on diverse setups still in progress)

## What you get

Eight action types, all driven by HA’s WebSocket API:

  • HA Toggle — switches, lights, plugs, fans, covers, climate, media players. Custom on/off text. Pulse animation when in a configured state.
  • HA Smart Toggle — display state from one entity (e.g. `binary_sensor.washer_running`), tap toggles a different entity (e.g.`input_boolean.deferrable_wm_forced`). Optional :high_voltage: FORCED badge.
  • HA Aggregate — watch multiple entities, show “active count / total” on a single key, pulse when count > 0.
  • HA Scene** / **HA Service Call** / **HA Sensor** / **HA Encoder** — the obvious ones, with the things you’d expect (entity picker with friendly-name search, threshold colors on Sensor, mode selector on Encoder).
  • HA Smart Dialer — universal dial. Long-press any light/climate/cover/media_player/fan key for 700ms, then turn the dial to adjust brightness/temperature/volume/etc. Auto-power-on if device is off. One encoder controls every variable entity in your home.

## What it looks like in practice

I have an Aggregate key on the home page watching four `binary_sensor.*` sensors for EV / washing machine / dishwasher / airco. When one of them turns on, the key pulses orange and shows “1/4”. A folder right next to it contains four Smart Toggle keys (one per device) showing live state plus tap-to-force-override.

For lighting: HA Toggle keys for office/desk lamps. Long-press any of them, the Smart Dialer encoder takes over and shows live brightness while I rotate. Press the dial to turn the light fully off. Tap the source key to confirm.

## Setup

  1. Long-lived access token from HA → Profile → Security
  2. Drop the plugin into Ulanzi Studio’s plugins folder
  3. First key you configure: enter your HA URL (use IP, e.g.`http://192.168.1.10:8123`) and the token
  4. Click “Test connection” — instant ✓ feedback with entity count
  5. URL + token cached globally for all subsequent keys

## CORS note

For the in-PI “Test connection” button to work, you need to add to your `configuration.yaml`:

http:

cors_allowed_origins:

- “null”

- “file://”

This is only for the test button. The runtime WebSocket connection works without CORS adjustments.

## Limitations

  • Ulanzi’s plugin SDK doesn’t currently expose folder/page navigation,

    so an Aggregate key can’t programmatically jump to its detail folder.

    I’ve requested this from Ulanzi; for now it’s a separate “Folder” key

    next to the Aggregate.

  • Tested only on D200X and HA Core 2026.x. macOS support is in the

    README but I haven’t personally verified it.

## Feedback welcome

Issues, PRs, pattern ideas — all welcome on GitHub. Especially interested in hearing from people with EMHASS / dynamic pricing / solar setups whose Smart Dialer use cases differ from mine.

— Bart