-
Notifications
You must be signed in to change notification settings - Fork 591
/
77-blink1.js
137 lines (128 loc) · 6.75 KB
/
77-blink1.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
module.exports = function(RED) {
"use strict";
var Blink1 = require("node-blink1");
var blink1 = {};
function Blink1Node(n) {
RED.nodes.createNode(this,n);
this.serial = n.serial;
if (!this.serial) { delete this.serial; }
this.fade = Number(n.fade) || 500;
if (this.fade < 0) { this.fade = 0; }
if (this.fade > 60000) { this.fade = 60000; }
var node = this;
try {
var p1 = /^\#[A-Fa-f0-9]{6}$/
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[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)) {
// if it is a hex colour string
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[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[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 rgb2 = msg.payload.split(',');
blink1[node.serial||"one"].fadeToRGB(node.fade, parseInt(rgb2[0])&255, parseInt(rgb2[1])&255, parseInt(rgb2[2])&255, parseInt(rgb2[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","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[node.serial||"one"] = 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[node.serial||"one"] && typeof blink1[node.serial||"one"].close === "function") {
blink1[node.serial||"one"].close(function() { done() });
}
else { done(); }
blink1[node.serial||"one"] = null;
});
}
catch(e) {
node.error("No Blink1 found (" + e + ")");
}
}
RED.nodes.registerType("blink1",Blink1Node);
function Blink1InNode(n) {
RED.nodes.createNode(this,n);
this.serial = n.serial;
if (!this.serial) { delete this.serial; }
var node = this;
try {
this.on("input", function(msg) {
try {
blink1[node.serial||"one"] = blink1[node.serial||"one"] || new Blink1.Blink1(node.serial);
node.status({text:node.serial});
if (blink1[node.serial||"one"]) {
var that = this;
var returnRgb = function (r,g,b){
var rgb = [r,g,b];
var payload = rgb.every(el => el === 0) ? "off" : rgb;
msg.payload = payload;
that.send(msg);
};
try {
var device = blink1[node.serial||"one"];
device.rgb(returnRgb);
}
catch (e) { node.error("Blink1 : error | " + e); blink1[node.serial||"one"] = 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[node.serial||"one"] && typeof blink1[node.serial||"one"].close === "function") {
blink1[node.serial||"one"].close(function() { done() });
}
else { done(); }
blink1[node.serial||"one"] = null;
});
}
catch(e) {
node.error("No Blink1 found (" + e + ")");
}
}
RED.nodes.registerType("blink1 in",Blink1InNode);
RED.httpAdmin.get("/blink1list", RED.auth.needsPermission('blink1.read'), function(req,res) {
res.json(Blink1.devices());
});
}