In this update, I cover the hacking of the iLumi Br30 BLE LED Light and controlling it from OpenHAB via BlueZ and the EnOcean Rocker switch. My plan is to use the iLumi BR30 Outdoor LED Flood and wanted something that was remote controlled and not tied to a hub.
Hardware used:
- Raspberry PI 3 and B+
- Pi Cam Noir
- EnOcean PTM Rocker Switch
- EnOcean Pi 902 MHz TCM310 Receiver
- Wi-Pi Wireless module
Scanning for BLE devices
I will not cover the install of BlueZ on the Raspberry Pi since it has been cover multiple times in other posts, however BlueZ 5.40 was used in this example.
- Ensure the BLE device is up on the Raspberry Pi
$ hcitool dev
Devices:
hci0 B8:27:EB:0A:18:49
- Scan for available BLE devices in range
$ sudo hcitool lescan
LE Scan ...
C5:0B:A1:81:44:DB (unknown)
B0:B4:48:C9:A1:02 (unknown)
B0:B4:48:C9:A1:02 CC2650 SensorTag
C5:0B:A1:81:44:DB Nrdic8144DB
NOTE: Here both a TI SensorTag and a Nordic Semiconductor device have been detected.
Since the CC2650 SensorTag is a known device, the Nrdic8144DB must be the device for the iLumi BR30
- Create a connection to the iLumi Device
$ sudo ~/bluez-5.40/tools/hcitool -i hci0 lecc C5:0B:A1:81:44:DB
Connection handle 64
// Once the device is added to the list of items, reconnect and get the list of characteristics
- Using the gatttool from BlueZ, try grabbing the list of Handles and Characteristics from the Nordic device.
$ sudo /home/pi/bluez-5.40/attrib/gatttool -i hci0 -b C5:0B:A1:81:44:DB -I
[C5:0B:A1:81:44:DB][LE]> connect
Attempting to connect to C5:0B:A1:81:44:DB
Connection successful
NOTE: The iLumi BLE device will quickly kick out the connection, so getting the list of characteristics must be done quickly.
[C5:0B:A1:81:44:DB][LE]> connect
Attempting to connect to C5:0B:A1:81:44:DB
Connection successful
[C5:0B:A1:81:44:DB][LE]> characteristics
Command Failed: Disconnected
[C5:0B:A1:81:44:DB][LE]> connect
Attempting to connect to C5:0B:A1:81:44:DB
Connection successful
[C5:0B:A1:81:44:DB][LE]> characteristics
handle: 0x0002, char properties: 0x0a, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, char properties: 0x02, char value handle: 0x0007, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x0009, char properties: 0x20, char value handle: 0x000a, uuid: 00002a05-0000-1000-8000-00805f9b34fb
handle: 0x000d, char properties: 0x02, char value handle: 0x000e, uuid: 00002a29-0000-1000-8000-00805f9b34fb
handle: 0x000f, char properties: 0x02, char value handle: 0x0010, uuid: 00002a24-0000-1000-8000-00805f9b34fb
handle: 0x0011, char properties: 0x02, char value handle: 0x0012, uuid: 00002a27-0000-1000-8000-00805f9b34fb
handle: 0x0013, char properties: 0x02, char value handle: 0x0014, uuid: 00002a26-0000-1000-8000-00805f9b34fb
handle: 0x0015, char properties: 0x02, char value handle: 0x0016, uuid: 00002a28-0000-1000-8000-00805f9b34fb
handle: 0x0018, char properties: 0x1e, char value handle: 0x0019, uuid: f000f0c1-0451-4000-b000-000000000000
[C5:0B:A1:81:44:DB][LE]>
(gatttool:19161): GLib-WARNING **: Invalid file descriptor.
The GLib warning will pop up when the list is complete which kills the connection.
Notice, one of the listings looks a bit different so it is a good chance that this is the one to control the LED with.
handle: 0x0018, char properties: 0x1e, char value handle: 0x0019, uuid: f000f0c1-0451-4000-b000-000000000000
- I created a python script that collects some basic data from the BLE device, creates a connection and sends an Initialization command to the iLumi BR30 via handle 0x0019.
$ sudo python ble_scan4.py
Here be the file
['LE Scan ...', 'C5:0B:A1:81:44:DB (unknown)', 'C5:0B:A1:81:44:DB Nrdic8144DB']
Length of len(new_list): 2
NewList = ['C5:0B:A1:81:44:DB', 'Nrdic8144DB']:
Mac Address: C5:0B:A1:81:44:DB
Model: Nrdic8144DB
Nrdic8144DB found
Connection handle 64
Command to send = sudo gatttool -i hci0 -b C5:0B:A1:81:44:DB --char-write-req --handle=0x0019 —value=3235352c302c302c3130302c2c2c2c2c2c2c
- The gatttool can be used to read from the iLumi to grab some info from the device:
- Thus far, I have found I can only get the BLE Model and Vendor info from the iLumi.
$ sudo sudo /home/pi/bluez-5.40/attrib/gatttool -i hci0 -b C5:0B:A1:81:44:DB --char-read --handle=0x000e
Characteristic value/descriptor: 69 4c 75 6d 69 20 53 6f 6c 75 74 69 6f 6e 73
NOTE: The value that come back is in hex so it would have to be converted into a readable format.
- I created another python script that does the conversion on values that are readable from a BLE device. With the iLumi this was handles 0x000e and 0x0003
$ sudo python ./get_bleASCII.py iLumiBR30 0x000e
The name = iLumiBR30
getName: sudo gatttool -i hci0 -b C5:0B:A1:81:44:DB --char-read --handle=0x000e
ASCII DATA: Characteristic value/descriptor: 69 4c 75 6d 69 20 53 6f 6c 75 74 69 6f 6e 73
ASCII String to convert: 694c756d6920536f6c7574696f6e73
iLumi Solutions
$ sudo python ./get_bleASCII.py iLumiBR30 0x0003
The name = iLumiBR30
getName: sudo gatttool -i hci0 -b C5:0B:A1:81:44:DB --char-read --handle=0x0003
ASCII DATA: Characteristic value/descriptor: 4e 72 64 69 63 38 31 34 34 44 42
ASCII String to convert: 4e72646963383134344442
Nrdic8144DB
- Now the device has been identified and can be communicated with, its time to attempt to send commands to it.
- From what I have gathered in my search on the web and looking at other BLE LED examples, I ended up using the following code to initialize the iLumi BR30:
3235352c302c302c3130302c2c2c2c2c2c2c
And the following to change the intensity of the colors on the device.
0xff010301ff00000000
- This is what I ended up with to change the colors on the iLumi:
- Initialize BLE Device
$ sudo /home/pi/bluez-5.40/attrib/gatttool -i hci0 -b C5:0B:A1:81:44:DB --char-write-req --handle=0x0019 --value=3235352c302c302c3130302c2c2c2c2c2c2c
Characteristic value was written successfully
- Set to Darker color
$ sudo gatttool -i hci0 -b C5:0B:A1:81:44:DB --char-write-req --handle=0x0019 --value=0xff010301ff00000000
Characteristic value was written successfully
- Set LED to Blue
$ sudo /home/pi/bluez-5.40/attrib/gatttool -i hci0 -b C5:0B:A1:81:44:DB --char-write-req --handle=0x0019 —-value=58010301ff000000ff
Characteristic value was written successfully
- Set LED to Green
$ sudo /home/pi/bluez-5.40/attrib/gatttool -i hci0 -b C5:0B:A1:81:44:DB --char-write-req --handle=0x0019 --value=58010301ff0000ff00
Characteristic value was written successfully
- Set LED to RED
$ sudo /home/pi/bluez-5.40/attrib/gatttool -i hci0 -b C5:0B:A1:81:44:DB --char-write-req --handle=0x0019 —value=58010301ff00ff0000
Characteristic value was written successfully
- Set LED to OFF
$ sudo /home/pi/bluez-5.40/attrib/gatttool -i hci0 -b C5:0B:A1:81:44:DB --char-write-req --handle=0x0019 --value=58010301ff00000000
Characteristic value was written successfully
- Now that the device can be written to, its time to add it to OpenHAB. This uses a Python script I created that handles the reading and writing to a BLE device.
- OpenHAB iLumi sitemap config:
Frame label="iLumi" {
Switch item=iLumi1_Stall label="iLumi LED1" icon="slider-80"
Colorpicker item=iLumi1_Color label="iLumiBR30" icon="slider"
}
- OpenHAB iLumi item config:
Group iLumi
Switch iLumi1_Stall "Stall Light1" (iLumi) icon="settings"
Color iLumi1_Color "Color" {exec=">[OFF:sudo /usr/bin/python /usr/share/openhab/configuration/test2.py "iLumi1" 0 0 0] >[ON:sudo /usr/bin/python /usr/share/configuration/test2.py "iLumi1" 255 255 255]”}
- OpenHAB ilumi rules config:
import org.openhab.core.library.types.*
import org.openhab.model.script.actions.*
var String iLumiTest = "python@@/opt/openhab/configurations/scripts/test.py@@"
rule "Set iLumi"
when
Item iLumi1_Stall received command
then
logInfo("Set iLumi", "Trying to run python script")
if (receivedCommand == ON) {
executeCommandLine (String::format(iLumiTest))
}
end
rule "Set iLumi Color"
when
Item iLumi1_Color changed
then
val hsbValue = iLumi1_Color.state as HSBType
val brightness = hsbValue.brightness.intValue
val redValue = ((((hsbValue.red.intValue * 255) / 100) * brightness) / 100).toString
val greenValue = ((((hsbValue.green.intValue * 255) / 100) * brightness) / 100).toString
val blueValue = ((((hsbValue.blue.intValue * 255) / 100) * brightness) / 100).toString
logWarn("Red", redValue)
logWarn("Green", greenValue)
logWarn("Blue", blueValue)
var String cmd = 'sudo /usr/bin/python /opt/openhab/configurations/scripts/test2.py ' + 'iLumi1' + ' ' + redValue + ' ' + greenValue + ' ' + blueValue
executeCommandLine(cmd)
end
- For the EnOcean Pi and Rocker switch, I added the following to the OpenHAB config:
- OpenHAB EnOcean Rocker Switch sitemap config:
Frame label="EnOcean" {
Text label="EnOcean Switches" icon="smiley" {
Frame label="EnOcean Switches" {
Switch item=EnOcean_sensor_002BA820_A label="Switch1"
Switch item=EnOcean_sensor_002BA820_B label="Switch2"
}
}
}
- OpenHAB EnOcean Rocker Switch items config:
Group EnOcean
Switch EnOcean_sensor_002BA820_A "Master A" <switch> (EnOcean) {enocean="{id=00:2B:A8:20, eep=F6:02:01, channel=A}"}
Switch EnOcean_sensor_002BA820_B "Master B" <switch> (EnOcean) {enocean="{id=00:2B:A8:20, eep=F6:02:01, channel=B}"}
- OpenHAB EnOcean Rocker Switch rules config (channel A):
import org.openhab.core.library.types.*
import org.openhab.model.script.actions.*
var String iLumiTest = "python@@/opt/openhab/configurations/scripts/test2.py@@"
rule "EnOcean On"
when
Item EnOcean_sensor_002BA820_A received command
then
logInfo("EnOcean On", "Trying to run python script")
if (receivedCommand == ON) {
var String cmd = 'sudo /usr/bin/python /opt/openhab/configurations/scripts/test2.py ' + 'iLumi1' + ' ' + 255 + ' ' + 255 + ' ' + 255
//executeCommandLine (String::format(iLumiTest))
executeCommandLine (cmd)
logInfo("EnOcean On", "Send on")
}
else if (receivedCommand == OFF) {
var String cmd = 'sudo /usr/bin/python /opt/openhab/configurations/scripts/test2.py ' + 'iLumi1' + ' ' + 0 + ' ' + 0 + ' ' + 0
executeCommandLine (cmd)
logInfo("EnOcean On", "Send off")
}
end
- With all of this set, I was able to control the iLumi BR30 via OpenHAB and turn it on or off using the EnOcean Rocker Switch.
- NOTE: The image of the BR30 is from a Raspberry Pi B+ which has a Pi CAM Noir connected to it and viewed remotely from OpenHAB thus the refresh rate is a bit slow
- The attached video is the end result of this.