From 0662354ec3face7a7d0effff14b07e925573b168 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Sat, 2 Jan 2016 12:27:57 +0000 Subject: [PATCH] Update blink1 node to allow multiple blink1s --- hardware/blink1/77-blink1.html | 36 +++++++++++++--- hardware/blink1/77-blink1.js | 79 ++++++++++++++++++++-------------- hardware/blink1/README.md | 14 +++--- hardware/blink1/package.json | 2 +- 4 files changed, 85 insertions(+), 46 deletions(-) diff --git a/hardware/blink1/77-blink1.html b/hardware/blink1/77-blink1.html index 23d2867a..a65d4036 100644 --- a/hardware/blink1/77-blink1.html +++ b/hardware/blink1/77-blink1.html @@ -1,5 +1,5 @@ diff --git a/hardware/blink1/77-blink1.js b/hardware/blink1/77-blink1.js index 9982e26b..f79262c9 100644 --- a/hardware/blink1/77-blink1.js +++ b/hardware/blink1/77-blink1.js @@ -1,5 +1,5 @@ /** - * Copyright 2013 IBM Corp. + * Copyright 2013,2016 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,22 +17,24 @@ module.exports = function(RED) { "use strict"; var Blink1 = require("node-blink1"); - // create a single global blink1 object - // all blink1 nodes affect the same (single) led - var blink1 = null; + var blink1 = {}; function Blink1Node(n) { RED.nodes.createNode(this,n); - this.fade = Number(n.fade) || 0; + this.serial = n.serial; + if (!this.serial) { delete this.serial; } + this.fade = Number(n.fade) || 500; var node = this; try { var p1 = /^\#[A-Fa-f0-9]{6}$/ - var p2 = /[0-9]+,[0-9]+,[0-9]+/ + var p2 = /^[0-9]+,[0-9]+,[0-9]+$/ + var p3 = /^[0-9]+,[0-9]+,[0-9]+,[0-2]$/ this.on("input", function(msg) { try { - blink1 = blink1 || new Blink1.Blink1(); - if (blink1) { + blink1[node.serial||"one"] = blink1[node.serial||"one"] || new Blink1.Blink1(node.serial); + node.status({text:node.serial}); + if (blink1[node.serial||"one"]) { var r,g,b; try { if (p1.test(msg.payload)) { @@ -40,47 +42,54 @@ module.exports = function(RED) { r = parseInt(msg.payload.slice(1,3),16); g = parseInt(msg.payload.slice(3,5),16); b = parseInt(msg.payload.slice(5),16); - if (node.fade === 0) { blink1.setRGB( r, g, b ); } - else { blink1.fadeToRGB(node.fade, r, g, b ); } + if (node.fade === 0) { blink1[node.serial||"one"].setRGB( r, g, b ); } + else { blink1[node.serial||"one"].fadeToRGB(node.fade, r, g, b ); } } else if (p2.test(msg.payload)) { // if it is a r,g,b triple var rgb = msg.payload.split(','); - if (node.fade === 0) { blink1.setRGB(parseInt(rgb[0])&255, parseInt(rgb[1])&255, parseInt(rgb[2])&255); } - else { blink1.fadeToRGB(node.fade, parseInt(rgb[0])&255, parseInt(rgb[1])&255, parseInt(rgb[2])&255); } + if (node.fade === 0) { blink1[node.serial||"one"].setRGB(parseInt(rgb[0])&255, parseInt(rgb[1])&255, parseInt(rgb[2])&255); } + else { blink1[node.serial||"one"].fadeToRGB(node.fade, parseInt(rgb[0])&255, parseInt(rgb[1])&255, parseInt(rgb[2])&255); } + } + else if (p3.test(msg.payload)) { + // if it is a r,g,b,index quad for a two led device + var rgb = msg.payload.split(','); + blink1[node.serial||"one"].fadeToRGB(node.fade, parseInt(rgb[0])&255, parseInt(rgb[1])&255, parseInt(rgb[2])&255, parseInt(rgb[3])&3); } else { // you can add fancy colours by name here if you want... // these are the @cheerlight ones. var colors = {"red":"#FF0000","green":"#00FF00","blue":"#0000FF","cyan":"#00FFFF", - "white":"#FFFFFF","warmwhite":"#FDF5E6","oldlace":"#FDF5E6","purple":"#800080","magenta":"#FF00FF", - "yellow":"#FFFF00","amber":"#FFD200","orange":"#FFA500","black":"#000000","pink":"#FF69B4"} - if (msg.payload.toLowerCase() in colors) { - var c = colors[msg.payload.toLowerCase()]; - r = parseInt(c.slice(1,3),16); - g = parseInt(c.slice(3,5),16); - b = parseInt(c.slice(5),16); - if (node.fade === 0) { blink1.setRGB( r, g, b ); } - else { blink1.fadeToRGB(node.fade, r, g, b ); } - } - else { - node.warn("Blink1 : invalid msg : "+msg.payload); + "white":"#FFFFFF","warmwhite":"#FDF5E6","oldlace":"#FDF5E6", + "purple":"#800080","magenta":"#FF00FF","pink":"#FF69B4", + "yellow":"#FFFF00","amber":"#FFD200","orange":"#FFA500", + "black":"#000000","off":"#000000"} + if (typeof(msg.payload) === "string") { + if (msg.payload.toLowerCase() in colors) { + var c = colors[msg.payload.toLowerCase()]; + r = parseInt(c.slice(1,3),16); + g = parseInt(c.slice(3,5),16); + b = parseInt(c.slice(5),16); + if (node.fade === 0) { blink1[node.serial||"one"].setRGB( r, g, b ); } + else { blink1[node.serial||"one"].fadeToRGB(node.fade, r, g, b ); } + } + else { node.warn("Blink1 : invalid colour name : " + msg.payload); } } + else { node.warn("Blink1 : invalid msg : "+msg.payload); } } - } catch (e) { node.error("Blink1 : error"); blink1 = null; } + } + catch (e) { node.error("Blink1 : error"); blink1[node.serial||"one"] = null; } } - else { - node.warn("Blink1 : not found"); - } - } catch (e) { node.error("Blink1 : device not found"); blink1 = null; } + else { node.warn("Blink1 : not found"); } + } + catch (e) { node.error("Blink1 : device not found"); blink1[node.serial||"one"] = null; } }); this.on("close", function(done) { - if (blink1 && typeof blink1.close === "function") { - //This ought to work but seems to cause more hangs on closing than not... - blink1.close(function() { done() }); + if (blink1[node.serial||"one"] && typeof blink1[node.serial||"one"].close === "function") { + blink1[node.serial||"one"].close(function() { done() }); } else { done(); } - blink1 = null; + blink1[node.serial||"one"] = null; }); } catch(e) { @@ -88,4 +97,8 @@ module.exports = function(RED) { } } RED.nodes.registerType("blink1",Blink1Node); + + RED.httpAdmin.get("/blink1list", RED.auth.needsPermission('blink1.read'), function(req,res) { + res.json(Blink1.devices()); + }); } diff --git a/hardware/blink1/README.md b/hardware/blink1/README.md index 0aadb4de..b7fa25e9 100644 --- a/hardware/blink1/README.md +++ b/hardware/blink1/README.md @@ -10,9 +10,14 @@ As the blink1 is a USB HID device you may need some extra hardware libraries as documented here and here. -Specifically Ubuntu/Debian/Raspbian user may need to +Specifically Ubuntu/Debian/Raspbian users may need to - sudo apt-get install libusb-1.0-0.dev. + sudo apt-get install libusb-1.0-0-dev + +and also setup these udev rules in `/etc/udev/rules.d/51-blink1.rules` + + SUBSYSTEM=="input", GROUP="input", MODE="0666" + SUBSYSTEM=="usb", ATTRS{idVendor}=="27b8", ATTRS{idProduct}=="01ed", MODE:="666", GROUP="plugdev" Install ------- @@ -20,8 +25,7 @@ Install Run the following command in the user directory of your Node-RED install. This is usually `~/.node-red` - npm install node-red-node-blink1 - + npm i node-red-node-blink1 Usage ----- @@ -32,4 +36,4 @@ Sends the msg.payload to a Thingm Blink(1) LED device. The payload can be - a hex colour #rrggbb - e.g. green is #00FF00 - a @cheerlights colour name - e.g. blue - The @cheerlights colours are - red, amber, green, blue, cyan, magenta, yellow, orange, pink, purple, white, warmwhite, black + The colours it accepts are - red, amber, green, blue, cyan, magenta, yellow, orange, pink, purple, white, warmwhite (or oldlace), black, (or off) diff --git a/hardware/blink1/package.json b/hardware/blink1/package.json index e3858f87..44accee4 100644 --- a/hardware/blink1/package.json +++ b/hardware/blink1/package.json @@ -1,6 +1,6 @@ { "name" : "node-red-node-blink1", - "version" : "0.0.11", + "version" : "0.0.12", "description" : "A Node-RED node to control a Thingm Blink(1)", "dependencies" : { "node-blink1" : "0.2.2"