Skip to main content

Control Daybetter RGB LED strips over BLE

Project description

daybetter-led-strip

Python package to control Daybetter RGB LED strips over BLE. Uses bleak.

Installation

daybetter-led-strip is on PyPI

$ pip install daybetter-led-strip

Usage

The DaybetterLedStrip constructor only requires the device MAC address. After that, the actual underlying device and advertisment data can be updated any number of times using .update_device. If the device disconnects for any reason, it will not reconnect.

from bleak import BleakScanner
from daybetter_led_strip import DaybetterLedStrip
from daybetter_led_strip.const import SERVICE_DISCOVERY

device = await BleakScanner.find_device_by_filter(lambda _device, data: SERVICE_DISCOVERY in data.service_uuids)
    
led_strip = DaybetterLedStrip(device.address)
await led_strip.update_device(device, None)

# turn on
await led_strip.set_power(True)

await asyncio.sleep(1)

await led_strip.set_color((255, 0, 0))

await led_strip.set_power(False)
# Must be called when done using
await led_strip.disconnect()

A complete example program is provided in examples/test.py.

This package was created for use in Home Assistant, which may explain some of the API choices.

Protocol

Communication with the LED strip is done over BLE.

The light strip exposes two services: the generic access profile w/ the device name, and a custom "LED control service" (0xe031).

During discovery, the device also advertises itself with a third service (0xc031) for identification.

The LED control service has a read characteristic (0xf031) and a write characteristic (0xa031). As far as I can tell, the read characteristic cannot actually be read directly. Rather, if notifications are enabled on this service, the device will push updates about its state at various times.

Write Data Format

Commands written to the write characteristic have the following format.

  1. The byte 0xA0 (referred to in the app source code as "APP_TO_DEVICE")
  2. The command ID. (1 byte)
  3. The length of the entire message, not including the checksum. (1 byte) = len(payload) + 3
  4. The payload for this command
  5. The little-endian CRC16 MODBUS checksum of the rest of the message.

Commands

Command ID Payload Description
Get status 0x10 0x00
Results in status payload below being sent on notify
Set power 0x11 0x01 (on) or 0x00 (off)
Show effect 0x12 One of the effect bytes listed below
Set brightness 0x13 A byte representing the brightness, from 0 (0x00) to 100 (0x64). Brightness 0 still has the LEDs slightly on
Set color 0x15 3 bytes, in RGB order

Example command (set to red): A0 15 06 FF 00 00 25 C0

Notify/read data format

The payloads received over notify have a similar structure as the write commands:

  1. The byte 0xA1 ("DEVICE_TO_APP")
  2. Command ID
  3. Length of entire message excluding checksum
  4. Payload
  5. LE Checksum

Received "commands"

When any of the above write commands are written to the characteristic successfully, the device responds with a message with the same command ID and 0x01 for the payload.

For instance, the above color command would result in A1 15 04 01 F1 1C

When the strip is turned on/off from the IR remote, a message with command ID 0x10 and the payload 00 01 01 64 32 32 ff 31 2d f0 00 00 00 00 (off) or 01 01 01 64 32 32 ff 31 2d f0 00 00 00 00. The first byte indicates the on/off status, but I don't know what the rest means. It seems unrelated to the color of the light.

Running the "get status" command also results in this being sent.

Effects

Note: the brightness can be changed during the following effects. Lower brightnesses result in blinking happening faster, likely because there is a smaller range of brightnesses to interpolate between.

RGB: just red/green/blue All preset colors: red/green/blue/yellow/teal/purple/white

0x02..0x08: show preset colors 0x09: switch RGB abruptly, no transition 0x0A: switch all preset colors 0x0B: fade between colors quickly 0x0C: fade between colors slowly 0x0D..0x13: blink individual preset colors 0x14: fade red/green 0x15: fade red/blue 0x16: fade green/blue 0x17: flash all preset colors 0x18..0x1E: flash individual preset colors 0x1F: strobe RGB 0x20: strobe all colors

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

daybetter_led_strip-0.2.0.tar.gz (7.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

daybetter_led_strip-0.2.0-py3-none-any.whl (8.2 kB view details)

Uploaded Python 3

File details

Details for the file daybetter_led_strip-0.2.0.tar.gz.

File metadata

  • Download URL: daybetter_led_strip-0.2.0.tar.gz
  • Upload date:
  • Size: 7.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for daybetter_led_strip-0.2.0.tar.gz
Algorithm Hash digest
SHA256 268d4bdd92b6ba025546777b2a1b47988eefcccbf7793ed4eb381d32b8607d6b
MD5 0f464d8ac90b7560818f8f87a9cebad6
BLAKE2b-256 e524f0f5b2a210055ce96dc95d72ecdaa837173f2290c6081d7624c54caa4bc4

See more details on using hashes here.

Provenance

The following attestation bundles were made for daybetter_led_strip-0.2.0.tar.gz:

Publisher: release.yml on grimsteel/daybetter-led-strip

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file daybetter_led_strip-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for daybetter_led_strip-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 27bb442788c42a958fa0b90f669d793fd6af9dbec54cab932d140a36cd389d9f
MD5 280d4c3883ebaf4b2a053bf4463e65c2
BLAKE2b-256 3ee50374890d8d0d79d19d0482dc801e168139fd1f61f106d351dfea08f36952

See more details on using hashes here.

Provenance

The following attestation bundles were made for daybetter_led_strip-0.2.0-py3-none-any.whl:

Publisher: release.yml on grimsteel/daybetter-led-strip

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page