Hi all! I’ve created some quick how-to videos to show the build and configuration of my homemade NodeMCU LED Strip controller, which I use for kitchen under-cabinet lighting and holiday lights. The complete project is written up on the Thingiverse site, but I wanted to post the openHAB specific configuration sample files here for easy linking.
The following items/sitemap and rules entries comprise a single strip and a “group” of strips (if more than one strip is defined and they’re required to be controlled as a group). Single strips are defined by their own MQTT topic, but all strips also subscribe to the “group” MQTT topic and react to commands posted to that topic as a group.
ledstrip.items:
Group gLEDStrip_Kitchen "Kitchen LED Strips"
Group gLEDStrip_Kitchen_Power "Kitchen LED Strips Power"
Group gLEDStrip_Kitchen_FX "Kitchen LED Strips FX"
Group gLEDStrip_Kitchen_Color "Kitchen LED Strips Color"
Group gLEDStrip_Kitchen_Speed "Kitchen LED Strips Speed"
Group gLEDStrip_Kitchen_Intensity "Kitchen LED Strips Intensity"
String LEDStrip_FF_Kitchen_Cabinet_1 "Kitchen LED Strip 1 String" (gLEDStrip_Kitchen) {mqtt=">[broker:home/FF_Kitchen_Cabinet_1/set:state:*:default]"}
Switch LEDStrip_FF_Kitchen_Cabinet_1_Power "Kitchen LED Strip 1 Power" (FF_Kitchen,gLEDStrip_Kitchen_Power) {mqtt=">[broker:home/FF_Kitchen_Cabinet_1/set:command:*:MAP(LEDStripEffectJSON.map)]"}
Number LEDStrip_FF_Kitchen_Cabinet_1_FX "Kitchen LED Strip 1 Fx" (FF_Kitchen,gLEDStrip_Kitchen_FX){mqtt=">[broker:home/FF_Kitchen_Cabinet_1/set:command:*:MAP(LEDStripEffectJSON.map)]"}
Color LEDStrip_FF_Kitchen_Cabinet_1_Color "Kitchen LED Strip 1 Color" <rgb> (FF_Kitchen,gLEDStrip_Kitchen_Color)
Number LEDStrip_FF_Kitchen_Cabinet_1_Speed "Kitchen LED Strip 1 Speed [%.0f]" (FF_Kitchen,gLEDStrip_Kitchen_Speed)
Number LEDStrip_FF_Kitchen_Cabinet_1_Intensity "Kitchen LED Strip 1 Intensity [%d]" (FF_Kitchen,gLEDStrip_Kitchen_Intensity)
String LEDStrip_Kitchen_Cabinet "Kitchen Cabinet String" (gLEDStrip_Kitchen) {mqtt=">[broker:home/LEDStrip_Group2/set:state:*:default]"}
Switch LEDStrip_Kitchen_Cabinet_Power "Kitchen Cabinet Power" (FF_Kitchen,gLEDStrip_Kitchen_Power) {mqtt=">[broker:home/LEDStrip_Group2/set:command:*:MAP(LEDStripEffectJSON.map)]"}
Number LEDStrip_Kitchen_Cabinet_FX "Kitchen Cabinet Fx" (FF_Kitchen,gLEDStrip_Kitchen_FX){mqtt=">[broker:home/LEDStrip_Group2/set:command:*:MAP(LEDStripEffectJSON.map)]"}
Color LEDStrip_Kitchen_Cabinet_Color "Kitchen Cabinet Color" <rgb> (FF_Kitchen,gLEDStrip_Kitchen_Color)
Number LEDStrip_Kitchen_Cabinet_Speed "Kitchen Cabinet Speed [%.0f]" (FF_Kitchen,gLEDStrip_Kitchen_Speed)
Number LEDStrip_Kitchen_Cabinet_Intensity "Kitchen Cabinet Intensity [%d]" (FF_Kitchen,gLEDStrip_Kitchen_Intensity)
.sitemap:
Switch item=LEDStrip_FF_Kitchen_Cabinet_1_Power
Selection item=LEDStrip_FF_Kitchen_Cabinet_1_FX mappings=[1="BPM",2="Noise",3="Fire",4="Rainbow",5="Twinkle",6="Glitter",7="Solid",8="Sinelon",9="Juggle",10="Confetti",11="Dots",12="Lightning",13="Candy Cane",14="Cyclon Rainbow",15="Ripple",16="Christmas Alternate",17="Police All",18="Police One",19="Random Stars",20="Sine Hue",21="Christmas",22="St Patty",23="Valentine",24="Turkey Day",25="Thanksgiving",26="USA",27="Independence",28="Halloween",29="Go Lions",30="Hail",31="Touchdown",32="Punkin",33="Lovey Day",34="Holly Jolly",35="Full Hue",36="Breathe",37="Hue Breathe"]
Colorpicker item=LEDStrip_FF_Kitchen_Cabinet_1_Color
Slider item=LEDStrip_FF_Kitchen_Cabinet_1_Speed
Slider item=LEDStrip_FF_Kitchen_Cabinet_1_Intensity
Switch item=LEDStrip_Group_1_Power
Selection item=LEDStrip_Group_1_FX mappings=[1="BPM",2="Noise",3="Fire",4="Rainbow",5="Twinkle",6="Glitter",7="Solid",8="Sinelon",9="Juggle",10="Confetti",11="Dots",12="Lightning",13="Candy Cane",14="Cyclon Rainbow",15="Ripple",16="Christmas Alternate",17="Police All",18="Police One",19="Random Stars",20="Sine Hue",21="Christmas",22="St Patty",23="Valentine",24="Turkey Day",25="Thanksgiving",26="USA",27="Independence",28="Halloween",29="Go Lions",30="Hail",31="Touchdown",32="Punkin",33="Lovey Day",34="Holly Jolly",35="Full Hue",36="Breathe",37="Hue Breathe"]
Colorpicker item=LEDStrip_Group_1_Color
Slider item=LEDStrip_Group_1_Speed
Slider item=LEDStrip_Group_1_Intensity
.rules:
rule "LED Strip Group 1 (Kitchen) JSON Color Single Strip"
when Member of gLEDStrip_Kitchen_Color received update
then
val source = triggeringItem.name.split("_Color").get(0)
logInfo("LED", "Source " + source)
val item = gLEDStrip_Kitchen.members.findFirst[ l | l.name == source ] as StringItem
logInfo("LED", "Item " + item.name)
item.sendCommand("{\"color\": {" +
"\"r\": " + (triggeringItem.state as HSBType).red.intValue.toString + "," +
"\"g\": " + (triggeringItem.state as HSBType).green.intValue.toString + "," +
"\"b\": " + (triggeringItem.state as HSBType).blue.intValue.toString + "}}") end
rule "LED Strip Group 1 (Kitchen) JSON Speed Single Strip"
when Member of gLEDStrip_Kitchen_Speed received update
then
val source = triggeringItem.name.split("_Speed").get(0)
val value = triggeringItem.state as Number
logInfo("LED", "Source " + source)
val item = gLEDStrip_Kitchen.members.findFirst[ l | l.name == source ] as StringItem
item.sendCommand("{\"transition\": \"" + (value / 100 * 240).intValue.toString + "\"}") end
rule "LED Strip Group 1 (Kitchen) JSON Intensity Single Strip"
when Member of gLEDStrip_Kitchen_Intensity received update
then
val source = triggeringItem.name.split("_Intensity").get(0)
val value = triggeringItem.state as Number
logInfo("LED", "Source " + source)
val item = gLEDStrip_Kitchen.members.findFirst[ l | l.name == source ] as StringItem
item.sendCommand("{\"brightness\":" + (value / 100 * 255).intValue.toString + "}") end
LEDStripEffectJSON.map:
1={"effect":"bpm"}
2={"effect":"noise"}
3={"effect":"fire"}
4={"effect":"rainbow"}
5={"effect":"twinkle"}
6={"effect":"glitter"}
7={"effect":"solid"}
8={"effect":"sinelon"}
9={"effect":"juggle"}
10={"effect":"confetti"}
11={"effect":"dots"}
12={"effect":"lightning"}
13={"effect":"candy cane"}
14={"effect":"cyclon rainbow"}
15={"effect":"ripple"}
16={"effect":"christmas alternate"}
17={"effect":"police all"}
18={"effect":"police one"}
19={"effect":"random stars"}
20={"effect":"sine hue"}
21={"effect":"Christmas"}
22={"effect":"St Patty"}
23={"effect":"Valentine"}
24={"effect":"Turkey Day"}
25={"effect":"Thanksgiving"}
26={"effect":"USA"}
27={"effect":"Independence"}
28={"effect":"Halloween"}
29={"effect":"Go Lions"}
30={"effect":"Hail"}
31={"effect":"Touchdown"}
32={"effect":"Punkin"}
33={"effect":"Lovey Day"}
34={"effect":"Holly Jolly"}
35={"effect":"full hue"}
36={"effect":"breathe"}
37={"effect":"hue breathe"}
ON={"state":"ON"}
OFF={"state":"OFF"}
Direct video links:
Part 1: Hardware Build:
Part 2: Arduino firmware setup/load:
Part 3: OpenHAB configuration:
Part 4: Long LED Strip power considerations
-B.K.