1
0
mirror of https://github.com/node-red/node-red-nodes.git synced 2023-10-10 13:36:58 +02:00
This commit is contained in:
Charalampos Doukas 2013-11-11 14:51:46 +01:00
commit 85797eb7fc
19 changed files with 498 additions and 379 deletions

View File

@ -1,6 +1,6 @@
# Node-RED Nodes # Node-RED Nodes
A collection of nodes for [Node-RED](http://nodered.org). A collection of nodes for [Node-RED](http://nodered.org). See below for a list.
## Installation ## Installation
@ -42,3 +42,64 @@ slightly different.
## Copyright and license ## Copyright and license
Copyright 2013 IBM Corp. under [the Apache 2.0 license](LICENSE). Copyright 2013 IBM Corp. under [the Apache 2.0 license](LICENSE).
# Extra Node Information
### Analysis
**72-wordpos** - Analyses the payload and classifies the part-of-speech of each word. The resulting message has msg.pos added with the results. A word may appear in multiple categories (eg, 'great' is both a noun and an adjective).
**74-swearfilter** - Analyses the payload and tries to filter out any messages containing bad swear words. This only operates on payloads of type string. Everything else is blocked.
### Hardware
**37-rpi-piface** - Adds support for the PiFace interface module for Raspberry Pi.
**78-ledborg** - A simple driver for the LEDborg plug on module for Raspberry Pi.
**60-wemo** - Basic node to drive a WeMo socket and switch. Does not use discovery.
**76-blinkstick** - Provides support for the BlinkStick USB LED device.
**77-blink1** - Provides support for the Blink1 USB LED from ThingM.
**78-digiRGB** - Provides support for the DigiSpark RGB USB LED.
**79-sensorTag** - Reads data from the Ti BLE SensorTag device.
**101-scanBLE** - Scans for a particular Bluetooth Low Energy (BLE) device.
### IO
**26-rawserial** - Only really needed for Windows boxes without serialport npm module installed.
Uses a simple read of the serial port as a file to input data. You **must** set the baud rate etc externally *before* starting Node-RED. This node does not implement pooling of connections so only one instance of each port may be used - so in **or** out but **not** both.
**39-wol** - Sends a Wake-On-LAN magic packet to the mac address specified. You may instead set msg.mac to dynamically set the target device mac to wake up.
**88-ping** - Pings a machine and returns the trip time in mS. Returns false if no response received within 3 seconds, or if the host is unresolveable. Default ping is every 20 seconds but can be configured.
### Social
**69-mpd** - MPD music control nodes. Output node expects payload to be a valid mpc command. Currently only simple commands that expect no reply are supported. Input node creates a payload object with Artist, Album, Title, Genre and Date.
**57-notify** - Uses Growl to provide a desktop popup containing the payload. Only useful on the local machine.
**57-prowl** - Uses Prowl to push the payload to an Apple device that has the Prowl app installed.
**57-pushbullet** - Uses PushBullet to push the payload to an Android device that has the PushBullet app installed.
**92-xmpp** - Connects to an XMPP server to send and receive messages.
### Storage
**67-leveldb** - Uses LevelDB for a simple key value pair database.
**68-mysql** - Allows basic access to a MySQL database. This node uses the **query** operation against the configured database. This does allow both INSERTS and DELETES. By it's very nature it allows SQL injection... *so be careful out there...*
### Time
**79-suncalc** - Uses the suncalc module to generate an output at sunrise and sunset based on a specified location. Several choices of definition of sunrise and sunset are available,
### Misc
**99-sample** - A sample node with more comments than most to try to help you get started without any other docs...

View File

@ -23,6 +23,7 @@
<script type="text/x-red" data-help-name="badwords"> <script type="text/x-red" data-help-name="badwords">
<p>Analyses the <b>msg.payload</b> and tries to filter out any messages containing bad swear words...</p> <p>Analyses the <b>msg.payload</b> and tries to filter out any messages containing bad swear words...</p>
<p><b>Note:</b> this only operates on payloads of type <b>string</b>. Everything else is blocked.</p>
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
@ -30,7 +31,7 @@
category: 'analysis-function', category: 'analysis-function',
color:"#E6E0F8", color:"#E6E0F8",
defaults: { defaults: {
name: {value:""}, name: {value:""}
}, },
inputs:1, inputs:1,
outputs:1, outputs:1,
@ -42,5 +43,4 @@
return this.name?"node_label_italic":""; return this.name?"node_label_italic":"";
} }
}); });
</script> </script>

View File

@ -21,8 +21,9 @@ function BadwordsNode(n) {
RED.nodes.createNode(this,n); RED.nodes.createNode(this,n);
var node = this; var node = this;
this.on("input", function(msg) { this.on("input", function(msg) {
if (typeof msg.payload == "string") {
if (badwords.ok(msg.payload)) { node.send(msg); } if (badwords.ok(msg.payload)) { node.send(msg); }
}
}); });
} }
RED.nodes.registerType("badwords",BadwordsNode); RED.nodes.registerType("badwords",BadwordsNode);

View File

@ -53,5 +53,4 @@
return this.name?"node_label_italic":""; return this.name?"node_label_italic":"";
} }
}); });
</script> </script>

View File

@ -15,9 +15,7 @@
**/ **/
var RED = require(process.env.NODE_RED_HOME+"/red/red"); var RED = require(process.env.NODE_RED_HOME+"/red/red");
var util = require("util");
var WordPos = require('wordpos'); var WordPos = require('wordpos');
var wordpos = new WordPos(); var wordpos = new WordPos();
function WordPOSNode(n) { function WordPOSNode(n) {
@ -30,5 +28,4 @@ function WordPOSNode(n) {
}); });
}); });
} }
RED.nodes.registerType("wordpos",WordPOSNode); RED.nodes.registerType("wordpos",WordPOSNode);

View File

@ -20,7 +20,7 @@ var fs = require('fs');
// check if /dev/ledborg exists - if not then don't even show the node. // check if /dev/ledborg exists - if not then don't even show the node.
if (!fs.existsSync("/dev/ledborg")) { if (!fs.existsSync("/dev/ledborg")) {
util.log("[78-ledborg.js] Error: PiBorg hardware : LedBorg not found"); util.log("[78-ledborg.js] Warning: PiBorg hardware : LedBorg not found");
return; return;
} }
@ -49,5 +49,4 @@ function LedBorgNode(n) {
} }
}); });
} }
RED.nodes.registerType("ledborg",LedBorgNode); RED.nodes.registerType("ledborg",LedBorgNode);

View File

@ -27,7 +27,7 @@
</script> </script>
<script type="text/x-red" data-help-name="blink1"> <script type="text/x-red" data-help-name="blink1">
<p>Thingm Blink1 output node. Expects a msg.payload with a three part csv string of r,g,b.</p> <p>ThingM Blink1 output node. Expects a msg.payload with a three part csv string of r,g,b.</p>
</script> </script>
<script type="text/javascript"> <script type="text/javascript">
@ -46,7 +46,7 @@
return this.name||"blink1"; return this.name||"blink1";
}, },
labelStyle: function() { labelStyle: function() {
return (this.name||!this.topic)?"node_label_italic":""; return this.name?"node_label_italic":"";
} }
}); });
</script> </script>

View File

@ -42,7 +42,7 @@ function Blink1Node(n) {
else { blink1.fadeToRGB(node.fade, 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); }
} }
else { else {
// you can do fancy colours by name here if you want... // you can add fancy colours by name here if you want...
node.warn("Blink1 : invalid msg : "+msg.payload); node.warn("Blink1 : invalid msg : "+msg.payload);
} }
} }
@ -56,5 +56,4 @@ function Blink1Node(n) {
node.error("No Blink1 found"); node.error("No Blink1 found");
} }
} }
RED.nodes.registerType("blink1",Blink1Node); RED.nodes.registerType("blink1",Blink1Node);

View File

@ -14,55 +14,34 @@
limitations under the License. limitations under the License.
--> -->
<!-- First, the content of the edit dialog is defined. -->
<script type="text/x-red" data-template-name="digiRGB"> <script type="text/x-red" data-template-name="digiRGB">
<!-- data-template-name identifies the node type this is for -->
<!-- Each of the following divs creates a field in the edit dialog. -->
<!-- Generally, there should be an input for each property of the node. -->
<!-- The for and id attributes identify the corresponding property -->
<!-- (with the 'node-input-' prefix). -->
<!-- The available icon classes are defined in Twitter Bootstrap -->
<!-- By convention, most nodes have a 'name' property. The following div -->
<!-- provides the necessary field. -->
<div class="form-row"> <div class="form-row">
<label for="node-input-name"><i class="icon-tag"></i> Name</label> <label for="node-input-name"><i class="icon-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name"> <input type="text" id="node-input-name" placeholder="DigiSpark">
</div> </div>
<div class="form-tips">Expects a msg.payload with three part csv string of r,g,b.</div> <div class="form-tips">Expects a msg.payload with three part csv string of r,g,b.</div>
</script> </script>
<!-- Next, some simple help text is provided for the node. -->
<script type="text/x-red" data-help-name="digiRGB"> <script type="text/x-red" data-help-name="digiRGB">
<!-- data-help-name identifies the node type this help is for -->
<!-- This content appears in the Info sidebar when a node is selected -->
<!-- The first <p> is used as the pop-up tool tip when hovering over a -->
<!-- node in the palette. -->
<p>Simple output node to drive digispark RGB</p> <p>Simple output node to drive digispark RGB</p>
<p>Requires msg.payload to be of the form 'r,g,b'</p> <p>Requires <b>msg.payload</b> to be of the form 'r,g,b'</p>
</script> </script>
<!-- Finally, the node type is registered along with all of its properties -->
<!-- The example below shows a small subset of the properties that can be set-->
<script type="text/javascript"> <script type="text/javascript">
RED.nodes.registerType('digiRGB',{ RED.nodes.registerType('digiRGB',{
category: 'output', // the palette category category: 'output',
color:"GoldenRod", color:"GoldenRod",
defaults: { // defines the editable properties of the node defaults: {
name: {value:"digiSparkRGB"} // along with default values. name: {value:""}
}, },
inputs:1, // set the number of inputs - only 0 or 1 inputs:1,
outputs:0, // set the number of outputs - 0 to n outputs:0,
icon: "light.png", // set the icon (held in public/icons) icon: "light.png",
align: "right", align: "right",
label: function() { // sets the default label contents label: function() {
return this.name||this.topic||"sample"; return this.name||"digiSparkRGB";
}, },
labelStyle: function() { // sets the class to apply to the label labelStyle: function() {
return this.name?"node_label_italic":""; return this.name?"node_label_italic":"";
} }
}); });

View File

@ -14,17 +14,12 @@
* limitations under the License. * limitations under the License.
**/ **/
// Sample Node-RED node file
// Require main module
var RED = require(process.env.NODE_RED_HOME+"/red/red"); var RED = require(process.env.NODE_RED_HOME+"/red/red");
var HID = require('node-hid'); var HID = require('node-hid');
var device; var device;
var node; var node;
// The main node definition - most things happen in here
function DigiRGBNode(n) { function DigiRGBNode(n) {
// Create a RED node
RED.nodes.createNode(this,n); RED.nodes.createNode(this,n);
node=this; node=this;
@ -66,18 +61,9 @@ function DigiRGBNode(n) {
} else { } else {
node.warn("no digispark RGB found"); node.warn("no digispark RGB found");
} }
}
// Register the node by name. This must be called before overriding any of the this.on('close', function() {
// Node functions. if (device) { device.close(); }
});
}
RED.nodes.registerType("digiRGB",DigiRGBNode); RED.nodes.registerType("digiRGB",DigiRGBNode);
DigiRGBNode.prototype.close = function() {
// Called when the node is shutdown - eg on redeploy.
// Allows ports to be closed, connections dropped etc.
// eg: this.client.disconnect();
if (device) {
device.close();
}
}

View File

@ -0,0 +1,90 @@
<!--
Copyright 2013 IBM Corp.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<script type="text/x-red" data-template-name="wemo out">
<div class="form-row">
<label for="node-input-ipaddr"><i class="icon-globe"></i> IP Address</label>
<input type="text" id="node-input-ipaddr" placeholder="192.168.1.100">
</div>
<div class="form-row">
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-tips">Expects a msg.payload with either 1/0, on/off, or true/false</div>
</script>
<script type="text/x-red" data-help-name="wemo out">
<p>Wemo output node. Expects a <b>msg.payload</b> with either 1/0, on/off or true/false.</p>
<p>It doesn't yet do any ip address discovery of the wemo devices.</p>
</script>
<script type="text/javascript">
RED.nodes.registerType('wemo out',{
category: 'advanced-output',
color:"GoldenRod",
defaults: {
ipaddr: {value:"",required:true},
name: {value:""}
},
inputs:1,
outputs:0,
icon: "light.png",
align: "right",
label: function() {
return this.name||"wemo";
},
labelStyle: function() {
return this.name?"node_label_italic":"";
}
});
</script>
<script type="text/x-red" data-template-name="wemo in">
<div class="form-row">
<label for="node-input-ipaddr"><i class="icon-globe"></i> IP Address</label>
<input type="text" id="node-input-ipaddr" placeholder="192.168.1.100">
</div>
<div class="form-row">
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-tips">Creates a msg.payload with either 1, 0, nc or na.</div>
</script>
<script type="text/x-red" data-help-name="wemo in">
<p>Wemo input node. Creates a <b>msg.payload</b> with either 1, 0, nc (no change), or na (not available).</p>
<p>It doesn't yet do any ip address discovery of the wemo devices.</p>
</script>
<script type="text/javascript">
RED.nodes.registerType('wemo in',{
category: 'advanced-input',
color:"GoldenRod",
defaults: {
ipaddr: {value:"",required:true},
name: {value:""}
},
inputs:0,
outputs:1,
icon: "light.png",
label: function() {
return this.name||"wemo";
},
labelStyle: function() {
return this.name?"node_label_italic":"";
}
});
</script>

60
hardware/wemo/60-wemo.js Normal file
View File

@ -0,0 +1,60 @@
/**
* Copyright 2013 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
**/
var RED = require(process.env.NODE_RED_HOME+"/red/red");
var WeMo = new require('wemo');
function WeMoOut(n) {
RED.nodes.createNode(this,n);
this.ipaddr = n.ipaddr;
this.wemoSwitch = new WeMo(n.ipaddr);
var node = this;
this.on("input", function(msg) {
if (msg != null) {
var state = 0;
if ( msg.payload == 1 || msg.payload == true || msg.payload == "on" ) { var state = 1; }
node.wemoSwitch.setBinaryState(state, function(err, result) {
if (err) node.warn(err);
//else { node.log(result); }
});
}
});
}
RED.nodes.registerType("wemo out",WeMoOut);
function WeMoIn(n) {
RED.nodes.createNode(this,n);
this.ipaddr = n.ipaddr;
this.wemoSwitch = new WeMo(n.ipaddr);
this.wemoSwitch.state = 0;
var node = this;
var tick = setInterval(function() {
wemoSwitch.getBinaryState(function(err, result) {
if (err) node.warn(err);
if (parseInt(result) != wemoSwitch.state) {
wemoSwitch.state = parseInt(result);
node.send({payload:wemoSwitch.state,topic:"wemo/"+node.ipaddr});
}
});
}, 2000);
this.on("close", function() {
clearInterval(tick);
});
}
RED.nodes.registerType("wemo in",WeMoOut);

View File

@ -51,7 +51,5 @@ function PingNode(n) {
this.on("close", function() { this.on("close", function() {
clearInterval(this.tout); clearInterval(this.tout);
}); });
} }
RED.nodes.registerType("ping",PingNode); RED.nodes.registerType("ping",PingNode);

View File

@ -23,7 +23,7 @@
</script> </script>
<script type="text/x-red" data-help-name="mpd out"> <script type="text/x-red" data-help-name="mpd out">
<p>MPD music control output node</p> <p>MPD music control output node.</p>
<p>Expects <b>msg.payload</b> to be a valid mpc command. Currently only simple commands that expect no reply are supported.</p> <p>Expects <b>msg.payload</b> to be a valid mpc command. Currently only simple commands that expect no reply are supported.</p>
</script> </script>

View File

@ -25,11 +25,12 @@ function LevelNode(n) {
if (err) node.error(err); if (err) node.error(err);
node.db = db; node.db = db;
}); });
this.on('close', function() {
if (node.db) { node.db.close(); }
});
} }
RED.nodes.registerType("leveldbase",LevelNode); RED.nodes.registerType("leveldbase",LevelNode);
LevelNode.prototype.close = function() {
this.db.close();
}
function LevelDBNodeIn(n) { function LevelDBNodeIn(n) {
RED.nodes.createNode(this,n); RED.nodes.createNode(this,n);

View File

@ -54,7 +54,6 @@
</script> </script>
<script type="text/x-red" data-template-name="mysql"> <script type="text/x-red" data-template-name="mysql">
<div class="form-row"> <div class="form-row">
<label for="node-input-mydb"><i class="icon-briefcase"></i> Database</label> <label for="node-input-mydb"><i class="icon-briefcase"></i> Database</label>
@ -95,53 +94,3 @@
} }
}); });
</script> </script>
<!--
<script type="text/x-red" data-template-name="mysql out">
<div class="form-row node-input-level">
<label for="node-input-level"><i class="icon-briefcase"></i> Database</label>
<input type="text" id="node-input-level">
</div>
<div class="form-row">
<label for="node-input-operation"><i class="icon-wrench"></i> Operation</label>
<select type="text" id="node-input-operation" style="display: inline-block; vertical-align: top;">
<option value="store">Store</option>
<option value="delete">Delete</option>
</select>
</div>
<div class="form-row">
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/x-red" data-help-name="mysql out">
<p>Allows access to a MySQL database.</p>
<p>Use this node to either <b>put</b> (store) the <b>msg.payload</b> to the named database file, using <b>msg.topic</b> as the key.</p>
<p>To <b>delete</b> information select delete in the properties dialogue and again use <b>msg.topic</b> as the key.</b>.</p>
</script>
<script type="text/javascript">
RED.nodes.registerType('mysql out',{
category: 'storage-output',
color:"#e97b00",
defaults: {
level: {type:"MySQLdatabase",required:true},
operation: {value:"store"},
name: {value:""}
},
inputs:1,
outputs:0,
icon: "db.png",
align: "right",
label: function() {
var levelNode = RED.nodes.node(this.level);
return this.name||(levelNode?levelNode.label():"mysql");
},
labelStyle: function() {
return this.name?"node_label_italic":"";
}
});
</script>
-->