Skip to content

techniker/MQTTBusyPy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MQTT Busylight Controller for Kuando HID Busylights

Overview

This project provides a simple MQTT-based controller for Kuando HID-based Busylights (Alpha and Omega). It allows controlling colors, blinking, fading effects, rainbow cycling, and ringtones by sending plain text MQTT payloads.

It supports:

  • Opening the device by VID/PID, autodetect by VID, or explicit HID device path
  • A keep-alive loop to prevent the Busylight from going idle
  • Periodic status output to the console
  • Optional daemon mode on POSIX systems (Linux)

Features

  • Control Kuando Busylights via MQTT.
  • Solid colors (color_*)
  • Blinking (blink_color_*)
  • Fade effect (fade_*, fade_off)
  • Rainbow effect (rainbow_on, rainbow_off)
  • Ringtones (ring_*, stop_ringtone)
  • Raw RGB payloads (raw_color R,G,B)
  • Device control (reset_device, device_bootloader)
  • Keep-alive thread (configurable interval/timeout)
  • Status logging (device/mqtt/effect/last command)
  • CLI options for all settings
  • Daemon option with pidfile (POSIX only)

Hardware Requirements

  • Kuando Busylight UC Omega or Alpha (HID USB device)

USB-IDs include:

  • 27bb:3bca (PLENOM/Kuando devices)
  • 27bb:3bcf, 27bb:3bcd (other variants)
  • Some Alpha devices may use different VID/PID combinations

Software Requirements

  • Linux/OSX (recommended) or other OS supported by hidapi
  • Python 3.x
  • Python packages:
    • hid (python-hidapi wrapper)
    • paho-mqtt

Installation

Create and activate a virtual environment, then install dependencies:

python3 -m venv .venv
source .venv/bin/activate
pip install hid paho-mqtt

Permissions (Linux / Debian)

If the HID device only opens as root, you likely need a udev rule for /dev/hidraw*.

Example rule for Kuando/Plenom (VID 27bb):

sudo tee /etc/udev/rules.d/99-busylight.rules >/dev/null <<'RULE'
SUBSYSTEM=="hidraw", ATTRS{idVendor}=="27bb", MODE="0660", GROUP="plugdev", TAG+="uaccess"
RULE

sudo udevadm control --reload-rules
sudo udevadm trigger
sudo usermod -aG plugdev "$USER"

Usage

List HID devices:

Use this to verify VID/PID and to get a usable HID path:

python3 busylight_mqtt_v1.py --list-devices

Print supported MQTT commands:

python3 busylight_mqtt_v1.py --print-commands

Run the controller (example with explicit VID/PID):

python3 busylight_mqtt_v1.py \
  --vendor-id 0x27bb --product-id 0x3bca \
  --mqtt-host mqtt.sixtopia.net --mqtt-port 1883 \
  --mqtt-user mqtt --mqtt-password 'YOUR_PASSWORD'

Run with autodetect (VID only):

If you omit --product-id, the program will pick the first device matching the vendor ID:

python3 busylight_mqtt_v1.py \
  --vendor-id 0x27bb \
  --mqtt-host mqtt.sixtopia.net --mqtt-port 1883 \
  --mqtt-user mqtt --mqtt-password 'YOUR_PASSWORD'

Run by HID path (most deterministic)

python3 busylight_mqtt_v1.py --list-devices

Then copy the PATH=... value and run:

python3 busylight_mqtt_v1.py \
  --device-path "b'...your path bytes...'" \
  --mqtt-host mqtt.sixtopia.net --mqtt-port 1883 \
  --mqtt-user mqtt --mqtt-password 'YOUR_PASSWORD'
Daemon mode (POSIX)
python3 busylight_mqtt_v1.py --daemon --pidfile /run/busylight_mqtt.pid \
  --vendor-id 0x27bb --product-id 0x3bca \
  --mqtt-host mqtt.sixtopia.net --mqtt-port 1883 \
  --mqtt-user mqtt --mqtt-password 'YOUR_PASSWORD'

MQTT Control

Topic

Default topic:

busylight/control


Override with:

--mqtt-topic <topic>

Payload format

Payload is plain UTF-8 text

One command per message

No JSON required

Example Commands
Solid colors

color_red

color_green

color_blue

color_yellow

color_cyan

color_magenta

color_white

color_orange

color_purple

color_pink

color_brown

Blinking

blink_color_red

blink_color_green

blink_color_blue

blink_color_yellow

blink_color_cyan

blink_color_magenta

blink_color_white

blink_color_orange

blink_color_purple

blink_color_pink

blink_color_brown

Fade:

Accepted forms:

fade_red, fade_green, fade_blue, ...

fade_color_red, fade_color_green, ...

Stop fade:

fade_off

Fade behavior is controlled by:

--fade-step

--fade-delay

Rainbow effect:

rainbow_on

rainbow_off

Rainbow speed is controlled by:

--rainbow-delay

Raw RGB color:

Format:

raw_color R,G,B

Example:

raw_color 255,0,0

Ringtones:


ring_off

ring_open_office

ring_quiet

ring_funky

ring_fairy_tale

ring_kuando_train

ring_telephone_nordic

ring_telephone_original

ring_telephone_pick_me_up

ring_buzz

Stop ringtone:

stop_ringtone

Ringtone volume is controlled by:

--ringtone-volume (0..7)

Other device commands:


off — stop effects and turn LEDs off

reset_device — send reset opcode

device_bootloader — switch device into bootloader mode

Status Output

  • The program periodically logs a line like:

  • device state (opened or not)

  • VID/PID

  • mqtt connection state

  • current effect (none/rainbow/fade)

  • last received command payload

Control the interval with:

--status-interval 5

Key options:

  • HID:

--vendor-id 0x27bb

--product-id 0x3bca

--device-path

--list-devices

  • MQTT:

--mqtt-host

--mqtt-port

--mqtt-topic

--mqtt-client-id

--mqtt-user

--mqtt-password

--mqtt-keepalive

  • Effects:

--rainbow-delay

--fade-step <1..255>

--fade-delay

--ringtone-volume <0..7>

  • Keep-alive:

--ka-timeout <0..15>

--ka-interval

  • Logging/status:

--log-level DEBUG|INFO|WARNING|ERROR

--status-interval

  • Daemon:

--daemon

--pidfile

  • Daemon mode: optional POSIX daemonization with pidfile.

License

This project is licensed under the MIT License. See the LICENSE file for details.

About

MQTT Busylight Controller for Kuando HID Busylights

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages