NEWS
MiLight Ansteuerung per node-red
-
Hallo,
da der Adapter für die Anbindung des MiLight Systems (RGBW LED System, limitlessled.com) an ioBroker noch im Alpha-Stadium hängt und ich (noch) nicht fit genug für die Adapterprogrammierung bin, habe ich mir als Umgehungslösung einen Flow in node-red gebastelt.
Das Ganze ist angelehnt an diesen Flow für den Zugriff via MQTT: http://flows.nodered.org/flow/b2cb3bdc5a81ac881d4b
In meiner Version dient dem Flow ein String-Objekt als Input, das ich nach Belieben aus verschiedenen Scripts und auch direkt aus iobroker.vis heraus befülle. Nach folgender Syntax:
[power].[group].[whitemode].[hue].[brightness]
Dabei können die einzelnen Segmente folgende Werte annehmen:
- power = on / off
group = 1-4 whitemode = yes / no hue = 0-255 brightness = 1-100
Für die Aufschlüsselung der Farbwerte hier noch eine kleine Übersicht in 16 Farben. Natürlich liegen dazwischen noch ein paar mehr:
- 0x00 = 0 = Violet
0x10 = 16 = Royal_Blue 0x20 = 32 = Baby_Blue 0x30 = 48 = Aqua 0x40 = 64 = Mint 0x50 = 80 = Seafoam_Green 0x60 = 96 = Green 0x70 = 112 = Lime_Green 0x80 = 128 = Yellow 0x90 = 144 = Yellow_Orange 0xA0 = 160 = Orange 0xB0 = 176 = Red 0xC0 = 192 = Pink 0xD0 = 208 = Fusia 0xE0 = 224 = Lilac 0xF0 = 240 = Lavendar
Beispiel: on.1.no.176.25
Als nächste Schritte sind noch die Integration des Disco-Mode bzw. der weiteren Standardprogramme inkl. Speed up bzw. down geplant.
Für den Moment bin ich mit dem was der Flow kann aber noch zufrieden.
Hier das Bild zum Flow:
Und hier der Code zum Importieren:! ````
[{"id":"145baf34.e77fd1","type":"udp out","z":"3d5c0b33.6637a4","name":"UDP send to MiLight","addr":"192.168.0.14","iface":"","port":"8899","ipv":"udp4","outport":"","base64":false,"multicast":"false","x":753.6111450195312,"y":364.27777099609375,"wires":[]},{"id":"973ad97f.4647b8","type":"delay","z":"3d5c0b33.6637a4","name":"","pauseType":"rate","timeout":"100","timeoutUnits":"milliseconds","rate":"10","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"x":632.5277709960938,"y":308.02777099609375,"wires":[["145baf34.e77fd1"]]},{"id":"371dd5b5.3155ca","type":"function","z":"3d5c0b33.6637a4","name":"Translate to MiLight","func":"//translates single commands to MiLight commands\n\nvar commandCode = [];\nswitch ( msg.payload.command ) {\n\tcase "on":\n\t\tcommandCode = [[0x42,0x45,0x47,0x49,0x4B][msg.payload.value],0x00]; \n\t\tbreak;\n\tcase "off":\n\t\tcommandCode = [[0x41,0x46,0x48,0x4A,0x4C][msg.payload.value],0x00];\n\t\tbreak;\n\tcase "hue": //0-255\n\t\tvar hex = msg.payload.value.toString(16);\n\t\thex = (hex.length < 2) ? '0x0'+hex : '0x'+hex;\n\t\tcommandCode = [0x40,hex];\n\t\tbreak;\n\tcase "whitemode":\n\t\tcommandCode = [[0xC2,0xC5,0xC7,0xC9,0xCB][msg.payload.value],0x00];\n\t\tbreak;\n\tcase "brightness": //1-100 => 2 to 27\n\t\tvar hex = Math.max(2,(Math.ceil((msg.payload.value-1)/99*25))+2).toString(16);\n\t\thex = (hex.length < 2) ? '0x0'+hex : '0x'+hex;\n\t\tcommandCode= [0x4E,hex];\n\t\tbreak;\n\tcase "discoMode":\n\t\tcommandCode = [0x4D,0x00];\n\t\tbreak;\n\tcase "discoSpeedUp":\n\t\tcommandCode = [0x44,0x00];\n\t\tbreak;\n\tcase "discoSpeedDown":\n\t\tcommandCode = [0x43,0x00];\n\t\tbreak;\n}\n//commandCode[2]=0x55;\nmsg.payload = new Buffer(commandCode);\nreturn msg;","outputs":1,"noerr":0,"x":524.861083984375,"y":246.111083984375,"wires":[["973ad97f.4647b8"]]},{"id":"611b7953.5769e8","type":"inject","z":"3d5c0b33.6637a4","name":"power.group.whitemode.hue.brightness","topic":"","payload":"off.2.no.176.50","payloadType":"string","repeat":"","crontab":"","once":false,"x":190,"y":41,"wires":[["d0ff40fd.18216"]]},{"id":"d0ff40fd.18216","type":"function","z":"3d5c0b33.6637a4","name":"Parse light commands from input","func":"// split input command [power.group.hue.whithemode.brightness] to single commands\n\nvar newMsg = [];\nvar action = msg.payload.split(".");\n\nvar power = action[0];\nvar group = parseInt(action[1]);\nvar whitemode = action[2];\nvar hue = parseInt(action[3]);\nvar brightness = parseInt(action[4]);\n\nif (power == "on") {\n\t\tif (whitemode == "yes") {\n\t\t\tnewMsg=[{payload:{command:"on",value:group}},{payload:{command:"whitemode",value:group}},{payload:{command:"brightness",value:brightness}}];\n\t\t\t} else {\n\t\t\t\tnewMsg=[{payload:{command:"on",value:group}},{payload:{command:"hue",value:hue}},{payload:{command:"brightness",value:brightness}}];\t\t\t\n\t\t}\n\t} else {\n\t\tnewMsg={payload:{command:power,value:group}};\n}\nreturn [newMsg];","outputs":1,"noerr":0,"x":354,"y":182,"wires":[["371dd5b5.3155ca"]]},{"id":"6134c55d.cc712c","type":"ioBroker in","z":"3d5c0b33.6637a4","name":"ioBroker Objekt","topic":"javascript.0.display.mode","payloadType":"value","onlyack":"","func":"rbe","gap":"","x":115,"y":100,"wires":[["d0ff40fd.18216"]]}]Für Verbesserungsvorschläge, speziell im Code-Bereich des Flows, bin ich immer offen. :) MfG, André