Integration basics
Common rules for all DzenTech devices. Device-specific details live on each device’s page.
Typical sequence:
- start a BLE scan;
- pick the device by name and a stable identifier;
- establish a GATT connection;
- locate the required service and characteristic;
- enable notifications if the device replies asynchronously;
- send a liveness/status query;
- consider the device ready only after a valid protocol-level reply;
- serialize all write operations to a single device;
- on disconnect, stop issuing commands, cancel pending waits and close the GATT objects.
All controllers use:
- service UUID:
0000FFE0-0000-1000-8000-00805F9B34FB; - characteristic UUID:
0000FFE1-0000-1000-8000-00805F9B34FB.
Common serial-port parameters:
- 8 data bits;
- no parity;
- 1 stop bit;
- flow control disabled.
Baud rate depends on the device:
- GlamBot: 115200;
- Spinner360: 9600.
ASCII commands end with the byte 0D (\r). No LF is appended.
Connection state
Section titled “Connection state”An open BLE or COM transport does not yet mean the device is ready. Distinguish:
transportConnected— the channel is open;protocolReady— a valid device reply has been received;desiredState— the requested state;actualState— the state confirmed by a reply.
A successful GATT/COM write confirms delivery to the transport, not execution of the command by the device.
This gap is not theoretical — it is the most common cause of commands that “were sent but did nothing”. Two shapes of it show up on hardware:
- Right after subscribing. Queries fired immediately after enabling notifications, or as a tight burst, can be dropped before the parser is running. Pace the opening queries — roughly 400–500 ms apart on Spinner360 — and repeat the one whose reply never arrived.
- Between repeated commands. Relative step commands need real spacing: MixUp Pixel v1 loses steps below 120 ms between writes, even though every write was acknowledged.
Per-device figures are on each device page. When in doubt, gate the next command on a reply rather than on the write acknowledgement.
Retry and reconnect
Section titled “Retry and reconnect”Recommended baseline policy:
- at most three attempts for an idempotent command;
- a 300–500 ms interval;
- after the attempts are exhausted, close the transport;
- reconnect;
- re-read the status;
- do not retry non-idempotent commands without checking the actual state.
Troubleshooting
Section titled “Troubleshooting”Device never appears in the scan
Section titled “Device never appears in the scan”- don’t filter the scan by service UUID — advertised and GATT UUIDs differ (see BLE);
- match every known name alias, not just the primary mask: MixUp Backlight v2 also appears as
SPStellar; - a silent
V?on Spinner360 doesn’t mean the controller is incompatible — only that its version and acceleration support are unconfirmed. Probe the basic commands separately.
BLE connected, characteristic not found
Section titled “BLE connected, characteristic not found”Check:
- the right device identifier is selected;
- the service and characteristic UUIDs match;
- service discovery has completed;
- the GATT object hasn’t been closed by a parallel operation;
- a stale GATT cache isn’t in use;
- notifications are enabled before any command with a fast reply.
Write succeeds, device doesn’t change
Section titled “Write succeeds, device doesn’t change”- check the characteristic write mode (with/without response);
- serialize writes;
- space repeated commands — an acknowledged write is not an applied one;
- read the status after the command;
- MixUp Pixel v1: always read power before a toggle; keep ≥ 120 ms between speed steps; expect an unsolicited status after a toggle, and a duplicate if you then query;
- MixUp Backlight v2: re-select the RGB/white mode before sending a value; effect speed is a
0…10scale and the firmware clamps above0A; - Spinner360: check the decimal/hex interpretation — set commands take decimal, replies come back
hexadecimal with a
P(speed) orC(acceleration) prefix; - MixUp White: check the percent →
0..255conversion.
USB not responding
Section titled “USB not responding”Check:
- the right COM port;
- the baud rate;
- 8N1;
- flow control disabled;
- the
0Dterminator; - no other process holding the port.
Fast disconnect
Section titled “Fast disconnect”On disconnect:
- block new commands;
- cancel pending waits;
- end the notification subscription;
- close the characteristic, service and device;
- do not reuse old GATT objects after a reconnect.
Close/unsubscribe operations must not run as a synchronous blocking wait on a UI/STA thread.