0xreversed/with.ai
AppsWorksSource available
Target: Philips Color Stream string lights (BLE, GV_RGB)

Decoded Philips Color Stream Bluetooth lights into a local Home Assistant integration, with Claude

Philips Color Stream string lights (BLE, GV_RGB): The string lights now take commands from Home Assistant over Bluetooth.
Image: GitHub (dnikles/ha_color_stream)

What was done

dnikles captured the app Bluetooth traffic, Claude reverse engineered the 23-byte packets and wrote every line, and the result is a local light integration with 27 effects and no cloud.

Philips Color Stream string lights normally need the phone app over Bluetooth. dnikles had Claude reverse engineer the protocol from a capture of the official app and write the whole Home Assistant integration, then tested it on his own strand. The README says plainly that the integration was written by AI and asks users to review the code before relying on it.

How it was done

A Bluetooth capture of the official app gave the frame layout: 23-byte packets written without response to characteristic FFF2 in service FFF0, with the device id taken from the last four hex digits of the Bluetooth name, and a probe plus a time sync sent on connect. Claude mapped the command table for on and off, solid colours, effect modes 01 to 14 and effect speed, and protocol.py documents every command. A Python test script drives the lights straight from the command line without Home Assistant.

Results

Each strand discovered in Bluetooth appears in Home Assistant as a light entity with 27 effects plus an effect speed slider, working through a built-in Bluetooth adapter or an ESPHome Bluetooth proxy. The documented limits stay honest: no brightness or custom colours, stale state because the lights never report it, one connection at a time and independent effects on grouped strands. Everything is local, nothing goes to a cloud, and the work is released under MIT after testing on one strand of the GV_RGB_0 kind.