Controlling WLED

A few scenarios how to control WLED form Node-Red. WLED is a individually addressable LED driver firmware for ESPs.

  • Control WLED from Dashboard
  • Auto brightness control based on ambient light
  • Timers using bigtimer
  • Use WLED for Visual alerts
  • Google Assistant integration.

Details on how to use this flow covered in this video: https://youtu.be/dVLjEoUlpls

[{"id":"f4af994c.fd20d8","type":"tab","label":"WLED","disabled":false,"info":""},{"id":"77db8a5f.4bb384","type":"function","z":"f4af994c.fd20d8","name":"Convert NORA to WLED","func":"msg.template = {\"on\":true,\"bri\":128,\"transition\":7,\"mainseg\":0,\"seg\":[{\"id\":0,\"start\":0,\"stop\":100,\"grp\":1,\"spc\":0,\"on\":true,\"bri\":255,\"col\":[[255,25,41],[0,0,0],[0,0,0]],\"fx\":0,\"sx\":128,\"ix\":128,\"pal\":0,\"sel\":true,\"rev\":false,\"mi\":false},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0},{\"stop\":0}]};\n\n/**\n* HSV to RGB color conversion\n*\n* H runs from 0 to 360 degrees\n* S and V run from 0 to 100\n*\n* Ported from the excellent java algorithm by Eugene Vishnevsky at:\n* http://www.cs.rit.edu/~ncs/color/t_convert.html\n*/\nfunction hsvToRgb(h, s, v) {\n    var r, g, b;\n    var i;\n    var f, p, q, t;\n     \n    // Make sure our arguments stay in-range\n    h = Math.max(0, Math.min(360, h));\n    s = Math.max(0, Math.min(100, s));\n    v = Math.max(0, Math.min(100, v));\n     \n    // We accept saturation and value arguments from 0 to 100 because that's\n    // how Photoshop represents those values. Internally, however, the\n    // saturation and value are calculated from a range of 0 to 1. We make\n    // That conversion here.\n    s /= 100;\n    v /= 100;\n     \n    if(s === 0) {\n        // Achromatic (grey)\n        r = g = b = v;\n        return [\n            Math.round(r * 255), \n            Math.round(g * 255), \n            Math.round(b * 255)\n        ];\n    }\n     \n    h /= 60; // sector 0 to 5\n    i = Math.floor(h);\n    f = h - i; // factorial part of h\n    p = v * (1 - s);\n    q = v * (1 - s * f);\n    t = v * (1 - s * (1 - f));\n     \n    switch(i) {\n        case 0:\n            r = v;\n            g = t;\n            b = p;\n            break;\n     \n        case 1:\n            r = q;\n            g = v;\n            b = p;\n            break;\n     \n        case 2:\n            r = p;\n            g = v;\n            b = t;\n            break;\n     \n        case 3:\n            r = p;\n            g = q;\n            b = v;\n            break;\n     \n        case 4:\n            r = t;\n            g = p;\n            b = v;\n            break;\n     \n        default: // case 5:\n            r = v;\n            g = p;\n            b = q;\n    }\n     \n    return [\n        Math.round(r * 255), \n        Math.round(g * 255), \n        Math.round(b * 255)\n    ];\n}\n\n\nmsg.template.on = msg.payload.on;\nmsg.template.bri = Math.floor(msg.payload.brightness*255/100);\n\nlet rgb = hsvToRgb(msg.payload.color.spectrumHsv.hue, msg.payload.color.spectrumHsv.saturation*100, msg.payload.color.spectrumHsv.value*100);\nmsg.template.seg[0].col[0][0]=rgb[0];\nmsg.template.seg[0].col[0][1]=rgb[1];\nmsg.template.seg[0].col[0][2]=rgb[2];\n\n\nmsg.payload = msg.template;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":970,"y":1200,"wires":[[]]},{"id":"76ef57e3.f92cc8","type":"nora-light","z":"f4af994c.fd20d8","devicename":"WLED","lightcolor":true,"brightnesscontrol":true,"turnonwhenbrightnesschanges":true,"passthru":false,"statepayload":true,"brightnessoverride":"","roomhint":"Study","name":"","nora":"8a827188.1bfbc","topic":"","onvalue":"true","onvalueType":"bool","offvalue":"false","offvalueType":"bool","x":730,"y":1200,"wires":[["77db8a5f.4bb384","3b41d05d.c79a5"]]},{"id":"f12e85b6.464828","type":"inject","z":"f4af994c.fd20d8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":130,"y":1200,"wires":[["9411952a.bd6e98"]]},{"id":"9411952a.bd6e98","type":"http request","z":"f4af994c.fd20d8","name":"WLED status","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://192.168.1.71/json/state","tls":"","persist":false,"proxy":"","authType":"","x":310,"y":1200,"wires":[["e374c753.5b7088"]]},{"id":"e374c753.5b7088","type":"function","z":"f4af994c.fd20d8","name":"Check for changes","func":"let on = context.get(\"on\") || false;\nlet bri = context.get(\"bri\") || 0;\n\n// This is the message NORA expects for a RGB light\nmsg.template = {\"on\": false, \"brightness\": 100, color: { spectrumHsv: { hue: 0, saturation: 1, value: 1 } } };\n\n// There was no response from WLED, probably powered off\nif (msg.statusCode===\"EHOSTUNREACH\") {\n    msg.payload = msg.template;\n    return msg;\n}\n\nif ((on!==msg.payload.on)||(bri!==msg.payload.bri)) {\n    msg.template.on = msg.payload.on;\n    msg.template.brightness = Math.floor(msg.payload.bri*100/255);\n    context.set(\"on\",msg.payload.on);\n    context.set(\"bri\",msg.payload.bri);\n    msg.payload = msg.template;\n    return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","x":510,"y":1200,"wires":[["76ef57e3.f92cc8"]]},{"id":"754e3df1.6e4e74","type":"ui_switch","z":"f4af994c.fd20d8","name":"","label":"Power","tooltip":"","group":"c9b4bb29.ad7398","order":0,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","x":200,"y":60,"wires":[["2e9b9fbd.00324"]]},{"id":"557b0f9e.dc267","type":"ui_slider","z":"f4af994c.fd20d8","name":"","label":"Brightness","tooltip":"","group":"c9b4bb29.ad7398","order":1,"width":0,"height":0,"passthru":false,"outs":"end","topic":"","min":0,"max":"255","step":1,"x":200,"y":120,"wires":[["2e9b9fbd.00324"]]},{"id":"1e0bc3cd.c2db2c","type":"ui_dropdown","z":"f4af994c.fd20d8","name":"","label":"Effects","tooltip":"","place":"Select option","group":"c9b4bb29.ad7398","order":2,"width":0,"height":0,"passthru":true,"multiple":false,"options":[{"label":"Running","value":"Running","type":"str"},{"label":"Sparkle","value":"Sparkle","type":"str"},{"label":"Stream","value":"Stream","type":"str"}],"payload":"","topic":"","x":190,"y":180,"wires":[["2e9b9fbd.00324"]]},{"id":"81fc976a.004fb8","type":"ui_dropdown","z":"f4af994c.fd20d8","name":"","label":"Presets","tooltip":"","place":"Select option","group":"c9b4bb29.ad7398","order":2,"width":0,"height":0,"passthru":true,"multiple":false,"options":[{"label":"Preset 1","value":"1","type":"str"},{"label":"Preset 2","value":"2","type":"str"},{"label":"Preset 3","value":"3","type":"str"}],"payload":"","topic":"","x":200,"y":240,"wires":[["2e9b9fbd.00324"]]},{"id":"868c66fe.aecf28","type":"wled2","z":"f4af994c.fd20d8","address":"192.168.1.71","brightness":128,"delay":0,"color1":"#ffffff","color2":"#ffffff","color3":"#ffffff","effect":0,"effectIntensity":128,"effectSpeed":128,"name":"QuinLED-Dig-UNO","palette":"0","preset":0,"state":"on","x":1250,"y":1140,"wires":[[]]},{"id":"2e9b9fbd.00324","type":"wled","z":"f4af994c.fd20d8","name":"QuinLED-Dig-UNO","address":"192.168.1.71","interval":0,"x":800,"y":120,"wires":[]},{"id":"3b41d05d.c79a5","type":"function","z":"f4af994c.fd20d8","name":"Convert NORA to WLED2","func":"msg.template = {\"state\":\"on\",\"brightness\":128,\"effect\":0,\"color1\":[255,255,255]};\n\n/**\n* HSV to RGB color conversion\n*\n* H runs from 0 to 360 degrees\n* S and V run from 0 to 100\n*\n* Ported from the excellent java algorithm by Eugene Vishnevsky at:\n* http://www.cs.rit.edu/~ncs/color/t_convert.html\n*/\nfunction hsvToRgb(h, s, v) {\n    var r, g, b;\n    var i;\n    var f, p, q, t;\n     \n    // Make sure our arguments stay in-range\n    h = Math.max(0, Math.min(360, h));\n    s = Math.max(0, Math.min(100, s));\n    v = Math.max(0, Math.min(100, v));\n     \n    // We accept saturation and value arguments from 0 to 100 because that's\n    // how Photoshop represents those values. Internally, however, the\n    // saturation and value are calculated from a range of 0 to 1. We make\n    // That conversion here.\n    s /= 100;\n    v /= 100;\n     \n    if(s === 0) {\n        // Achromatic (grey)\n        r = g = b = v;\n        return [\n            Math.round(r * 255), \n            Math.round(g * 255), \n            Math.round(b * 255)\n        ];\n    }\n     \n    h /= 60; // sector 0 to 5\n    i = Math.floor(h);\n    f = h - i; // factorial part of h\n    p = v * (1 - s);\n    q = v * (1 - s * f);\n    t = v * (1 - s * (1 - f));\n     \n    switch(i) {\n        case 0:\n            r = v;\n            g = t;\n            b = p;\n            break;\n     \n        case 1:\n            r = q;\n            g = v;\n            b = p;\n            break;\n     \n        case 2:\n            r = p;\n            g = v;\n            b = t;\n            break;\n     \n        case 3:\n            r = p;\n            g = q;\n            b = v;\n            break;\n     \n        case 4:\n            r = t;\n            g = p;\n            b = v;\n            break;\n     \n        default: // case 5:\n            r = v;\n            g = p;\n            b = q;\n    }\n     \n    return [\n        Math.round(r * 255), \n        Math.round(g * 255), \n        Math.round(b * 255)\n    ];\n}\n\n\nmsg.template.state = (msg.payload.on ? \"on\": \"off\");\nmsg.template.brightness = Math.floor(msg.payload.brightness*255/100);\n\nlet rgb = hsvToRgb(msg.payload.color.spectrumHsv.hue, msg.payload.color.spectrumHsv.saturation*100, msg.payload.color.spectrumHsv.value*100);\nmsg.template.color1[0]=rgb[0];\nmsg.template.color1[1]=rgb[1];\nmsg.template.color1[2]=rgb[2];\n\nmsg.payload = msg.template;\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":970,"y":1140,"wires":[["868c66fe.aecf28"]]},{"id":"1424a18b.c2ce4e","type":"comment","z":"f4af994c.fd20d8","name":"Google Assistant integration with NORA","info":"Allows WLED to be turned on/off, set brightness and colors from Google Assistant. There is also feedback of state, brightness and color to Google Assistant so the home app always show the actual state of the WLED.\nDo not forget to set the inject node to automatically execute periodically (e.g. every minute)","x":200,"y":1140,"wires":[]},{"id":"c6f0f72c.4625e8","type":"wled2","z":"f4af994c.fd20d8","address":"192.168.1.71","brightness":128,"delay":"0","color1":"#ff0000","color2":"#002aff","color3":"#ffffff","effect":"1","effectIntensity":128,"effectSpeed":"205","name":"Red-Blue blink","palette":"0","preset":0,"state":"on","x":760,"y":920,"wires":[[]]},{"id":"1d560968.2f1bc7","type":"ui_button","z":"f4af994c.fd20d8","name":"","group":"c9b4bb29.ad7398","order":4,"width":0,"height":0,"passthru":false,"label":"Blink warning","tooltip":"","color":"","bgcolor":"","icon":"","payload":"","payloadType":"str","topic":"","x":120,"y":920,"wires":[["e7e0cd08.f320e"]]},{"id":"126b5fe8.a301b","type":"delay","z":"f4af994c.fd20d8","name":"","pauseType":"delay","timeout":"10","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":540,"y":980,"wires":[["8954fa5e.c1db98"]]},{"id":"e7e0cd08.f320e","type":"http request","z":"f4af994c.fd20d8","name":"WLED status","method":"GET","ret":"obj","paytoqs":"ignore","url":"http://192.168.1.71/json/state","tls":"","persist":false,"proxy":"","authType":"","x":310,"y":920,"wires":[["d91a9860.8dd368","126b5fe8.a301b","9b3b22c7.e0ad4"]]},{"id":"d91a9860.8dd368","type":"function","z":"f4af994c.fd20d8","name":"Remember last state","func":"if (msg.topic===\"recall\") {\n    msg.payload = context.get(\"laststate\");\n    return msg;\n} else {\n    context.set(\"laststate\",msg.payload);\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","x":580,"y":1040,"wires":[["8815da7a.7a26b8"]]},{"id":"8815da7a.7a26b8","type":"wled","z":"f4af994c.fd20d8","name":"QuinLED-Dig-UNO","address":"192.168.1.71","interval":0,"x":870,"y":1040,"wires":[]},{"id":"9b3b22c7.e0ad4","type":"change","z":"f4af994c.fd20d8","name":"Empty payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":920,"wires":[["c6f0f72c.4625e8"]]},{"id":"8954fa5e.c1db98","type":"change","z":"f4af994c.fd20d8","name":"Recall","rules":[{"t":"set","p":"topic","pt":"msg","to":"recall","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":680,"y":980,"wires":[["d91a9860.8dd368"]]},{"id":"cca8428a.05fe7","type":"comment","z":"f4af994c.fd20d8","name":"Visual warning","info":"Changing the WLED to a redefined effect and restoring the original state after 10 seconds","x":120,"y":860,"wires":[]},{"id":"afcf9ae.eac0668","type":"bigtimer","z":"f4af994c.fd20d8","outtopic":"","outpayload1":"on","outpayload2":"off","name":"Evening lights","comment":"","lat":0,"lon":0,"starttime":5001,"endtime":1425,"starttime2":0,"endtime2":0,"startoff":0,"endoff":0,"startoff2":0,"endoff2":0,"offs":0,"outtext1":"","outtext2":"","timeout":1440,"sun":true,"mon":true,"tue":true,"wed":true,"thu":true,"fri":true,"sat":true,"jan":true,"feb":true,"mar":true,"apr":true,"may":true,"jun":true,"jul":true,"aug":true,"sep":true,"oct":true,"nov":true,"dec":true,"day1":0,"month1":0,"day2":0,"month2":0,"day3":0,"month3":0,"day4":0,"month4":0,"day5":0,"month5":0,"day6":0,"month6":0,"day7":0,"month7":0,"day8":0,"month8":0,"day9":0,"month9":0,"day10":0,"month10":0,"day11":0,"month11":0,"day12":0,"month12":0,"d1":0,"w1":0,"d2":0,"w2":0,"d3":0,"w3":0,"d4":0,"w4":0,"d5":0,"w5":0,"d6":0,"w6":0,"xday1":0,"xmonth1":0,"xday2":0,"xmonth2":0,"xday3":0,"xmonth3":0,"xday4":0,"xmonth4":0,"xday5":0,"xmonth5":0,"xday6":0,"xmonth6":0,"xd1":0,"xw1":0,"xd2":0,"xw2":0,"xd3":0,"xw3":0,"xd4":0,"xw4":0,"xd5":0,"xw5":0,"xd6":0,"xw6":0,"suspend":false,"random":false,"randon1":false,"randoff1":false,"randon2":false,"randoff2":false,"repeat":false,"atstart":false,"odd":false,"even":false,"x":460,"y":680,"wires":[["c4c7b01.722b45"],[],[]]},{"id":"d5073d4c.4aeb6","type":"inject","z":"f4af994c.fd20d8","name":"Test","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"test","payloadType":"str","x":190,"y":660,"wires":[["afcf9ae.eac0668"]]},{"id":"3c67adff.54f632","type":"inject","z":"f4af994c.fd20d8","name":"On","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"on","payloadType":"str","x":190,"y":700,"wires":[["afcf9ae.eac0668"]]},{"id":"ff0b929f.066e5","type":"inject","z":"f4af994c.fd20d8","name":"Off","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"off","payloadType":"str","x":190,"y":740,"wires":[["afcf9ae.eac0668"]]},{"id":"f5c1caa6.441bb8","type":"inject","z":"f4af994c.fd20d8","name":"Scheduler","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"auto","payloadType":"str","x":200,"y":780,"wires":[["afcf9ae.eac0668"]]},{"id":"c4c7b01.722b45","type":"switch","z":"f4af994c.fd20d8","name":"On or Off","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":700,"y":680,"wires":[["baab5bbe.1165b8"],["7212ec63.49b844"]]},{"id":"baab5bbe.1165b8","type":"change","z":"f4af994c.fd20d8","name":"Turn on to a preset","rules":[{"t":"set","p":"payload","pt":"msg","to":"1","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":930,"y":660,"wires":[["2e9b9fbd.00324"]]},{"id":"7212ec63.49b844","type":"change","z":"f4af994c.fd20d8","name":"Turn off","rules":[{"t":"set","p":"payload","pt":"msg","to":"false","tot":"bool"}],"action":"","property":"","from":"","to":"","reg":false,"x":900,"y":700,"wires":[["2e9b9fbd.00324"]]},{"id":"a36dce15.96085","type":"comment","z":"f4af994c.fd20d8","name":"Evening lights","info":"Turning WLED on/off using bigtimer","x":110,"y":620,"wires":[]},{"id":"3e2e36e2.0ef38a","type":"range","z":"f4af994c.fd20d8","minin":"0","maxin":"1023","minout":"60","maxout":"255","action":"clamp","round":true,"property":"payload","name":"Scale brightness","x":430,"y":400,"wires":[["265272b0.7bcb8e"]]},{"id":"7e680428.33c7ec","type":"inject","z":"f4af994c.fd20d8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"num","x":160,"y":360,"wires":[["3e2e36e2.0ef38a"]]},{"id":"87415f35.78036","type":"inject","z":"f4af994c.fd20d8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"500","payloadType":"num","x":150,"y":400,"wires":[["3e2e36e2.0ef38a"]]},{"id":"f9e83267.219b8","type":"inject","z":"f4af994c.fd20d8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"1023","payloadType":"num","x":150,"y":440,"wires":[["3e2e36e2.0ef38a"]]},{"id":"c373754f.e6f1d8","type":"inject","z":"f4af994c.fd20d8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"3","payloadType":"str","x":360,"y":280,"wires":[["2e9b9fbd.00324"]]},{"id":"b1cffc25.dd3bb","type":"comment","z":"f4af994c.fd20d8","name":"Auto adjust brightness","info":"In this flow a value comes from an ambient light\nsensor which is converted to the 0-255 brighness\nlevel for WLED by the range node.\n\nFeed your On/Off control signal into the function node so it stops sending brightness values to WLED when the LED is turned off (otherwise the WLED will turn on)","x":140,"y":320,"wires":[]},{"id":"265272b0.7bcb8e","type":"function","z":"f4af994c.fd20d8","name":"On/Off","func":"// this node enabled or blocks messages going through\n// it accepts \"on\"/\"off\", \"0\"/\"1\", 0/1, true/false\n\nlet state = context.get(\"state\");\nif (state===undefined) {\n    state = false;\n    context.set(\"state\",state);\n    node.status({fill:\"red\",shape:\"dot\",text:\"Off\"});\n}\nif ((msg.topic.toLowerCase()===\"on\")||(msg.topic===\"1\")||(msg.topic===1)||(msg.topic)) {\n    state = true;\n    context.set(\"state\",state);\n    node.status({fill:\"green\",shape:\"dot\",text:\"On\"});\n    \n}\nif ((msg.topic.toLowerCase()===\"off\")||(msg.topic===\"0\")||(msg.topic===0)||(!msg.topic)) {\n    state = false;\n    context.set(\"state\",state);\n    node.status({fill:\"red\",shape:\"dot\",text:\"Off\"});\n    \n}\nif (state) {\n    return msg;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","x":610,"y":400,"wires":[["2e9b9fbd.00324"]]},{"id":"d5872cf2.c03fd","type":"inject","z":"f4af994c.fd20d8","name":"On","props":[{"p":"payload","v":"","vt":"date"},{"p":"topic","v":"on","vt":"string"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"on","payload":"","payloadType":"date","x":470,"y":480,"wires":[["265272b0.7bcb8e"]]},{"id":"e63ece2b.f1948","type":"inject","z":"f4af994c.fd20d8","name":"Off","props":[{"p":"payload","v":"","vt":"date"},{"p":"topic","v":"off","vt":"string"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"off","payload":"","payloadType":"date","x":470,"y":520,"wires":[["265272b0.7bcb8e"]]},{"id":"8a827188.1bfbc","type":"nora-config","z":"","name":"NORA config","group":"","notify":false},{"id":"c9b4bb29.ad7398","type":"ui_group","z":"","name":"WLED","tab":"156af96f.f8fd27","order":10,"disp":true,"width":"6","collapse":false},{"id":"156af96f.f8fd27","type":"ui_tab","z":0,"name":"Home","icon":"home","order":1}]

Flow Info

Created 4 years, 8 months ago
Rating: 5 2

Owner

Actions

Rate:

Node Types

Core
  • change (x4)
  • comment (x4)
  • delay (x1)
  • function (x5)
  • http request (x2)
  • inject (x11)
  • range (x1)
  • switch (x1)
Other

Tags

  • wled
Copy this flow JSON to your clipboard and then import into Node-RED using the Import From > Clipboard (Ctrl-I) menu option