-
-
Notifications
You must be signed in to change notification settings - Fork 18
Command Pattern Guide
Smart lights and similar devices often use different ways to communicate, even between models from the same brand.
Hard-coding every possible command for every device makes the app hard to update and extend.
The command pattern subsystem lets you describe how commands are built for your device in a flexible, editable way—no code changes needed.
Benefits:
- Easily support new devices or firmware updates.
- Fix or tweak commands without waiting for an app update.
- See and edit how commands are built, making troubleshooting easier.
Suggest to read Bluetooth-Device-Control-Background before continue.
A command pattern is a recipe that tells the app how to build the ATT command data it sends to your light over Bluetooth.
It’s like a template: you fill in the blanks with the values you want (like brightness, color, or power state), and the app turns that into the exact bytes your light expects.
Example:
Suppose your light expects a command like:
0x78 0x81 0x01 0xFA
A command pattern describes how to build this from pieces like “power on”, “mode”, or “color”.
- You define a pattern for each command (like power on/off, set color, etc.).
- The app fills in the values (like which color or brightness you want).
- The pattern is translated into the exact bytes sent over Bluetooth.
In short:
- You write a pattern.
- The app uses it to build the command.
- Your light gets the right data.
A command pattern is a string made of tokens, each describing a part of the command.
Tokens are separated by spaces.
Each token can be a variable (inside {}), a fixed value (like 0x78), or a special field.
-
Variable:
{name}
Represents a value that changes (like brightness or color). -
Variable with type:
{name:type}
Specifies how the value should be encoded (like as an 8-bit number). -
Variable with type and options:
{name:type:enum(...)}or{name:type:range(min,max)}
Limits the value to certain choices or a range. -
Fixed value:
0xNN
A constant byte (hexadecimal). -
Special fields:
{cmdtag},{powertag},{size},{checksum}
These are handled specially by the app.
{cmdtag} {powertag} {state:uint8:enum(1=on,2=off)} {checksum}
-
{cmdtag}: Command type (fixed for your device) -
{powertag}: Power mode (fixed for your device) -
{state:uint8:enum(1=on,2=off)}: State, encoded as an 8-bit number, only allows 1 (on) or 2 (off) -
{checksum}: Automatically calculated by the app
-
uint8: 8-bit number -
uint16_le: 16-bit number, little-endian -
uint16_be: 16-bit number, big-endian -
hex: Raw hexadecimal value
-
enum(...): List of allowed values, e.g.enum(1=on,2=off) -
range(min,max): Allowed range, e.g.range(0,255)
-
{cmdtag}: The command’s main type (usually fixed for your device) -
{powertag}: Power mode (usually fixed) -
{size}: The total size of the command (auto-calculated) -
{checksum}: A simple sum of all previous bytes (auto-calculated)
- The app reads your pattern and fills in values from your settings.
- Each token is converted to bytes:
- Variables become numbers or codes.
- Fixed values are added as-is.
- Special fields are calculated.
- The final byte array is sent to your light.
Example:
Pattern: {cmdtag} {powertag} {state:uint8:enum(1=on,2=off)} {checksum}
Values: state = 1 (on)
Result: 0x78 0x81 0x01 0xFA
-
0x78and0x81are fixed for your device. -
0x01is the value for "on". -
0xFAis the checksum.
- Always start with
{cmdtag}and end with{checksum}for most commands. - Use types (
uint8,uint16_le, etc.) to match your device’s expectations. - Use
enumorrangeto restrict values and avoid mistakes. - Use fixed values (
0xNN) for bytes that never change. - If you’re not sure, check your device’s documentation or existing patterns.
The command pattern subsystem makes your app flexible and future-proof.
You can easily add, edit, or fix how commands are built for your lights—no coding required.
Just write or tweak the pattern, and the app does the rest!
For more examples and details, visit:
NeewerLite Command Pattern Guide