Spark Core and Node-RED integration

Spark Core and Node-RED are great IOT tools. If these two can work together then it is more awesome. So I decided to create a simple Node-RED node for Spark Core. The node implements basic things to interact with Spark Core, such as call a function, read a variable and subscribe to events. This node defines INPUT and OUTPUT nodes. Input node can be used to call a function, read a variable and subscribe to events. The output node can be used to call a function and pass an input parameter. Following are the return values:

Function call

  1. msg.raw contains the raw JSON string returned
  2. msg.payload contains the return value of the function
  3. msg.id contains the core id
  4. msg.name contains the core name

Read a Variable

  1. msg.raw contains the raw JSON string returned
  2. msg.payload contains the value of the variable
  3. msg.name contains the name of the core

Subscribe to variables

  1. msg.raw contains the raw JSON string returned
  2. msg.payload the event data
  3. msg.ttl contains he TTL
  4. msg.published_at contain the published date and time
  5. msg.coreid contains the core id

Sample Applications

I have created two samples created. The first sample demonstrates the subscribe to events functionality and uses DHT Temperature and Humidity sensor to log data to Xively. This Spark Core application published temperature and humidity at particular intervals and the Node-RED application send this data to Xively. This uses INPUT node.

The second sample uses MQTT to set color of RGB led. This uses OUTPUT node and Eclipse Sandbox MQTT server (iot.eclipse.org:1883). The Node-REd application listens for MQTT messages and forward to Spark Core which parses the color (in the format R,G,B) and set the LED color.

Screenshots

Input node properties
Input node properties

Output node properties
enter image description here

Spark Core MQTT REB Led sample
enter image description here

Spark Core DHT and Xively sample
enter image description here

12 Likes

Hi. Is there an npm that I can install so that this shows up in my Node-RED interface?

@sriram155, while doing this the node-red nodes were not npm capable, as of Node-RED 0.9.1 nodes can be installed using npm. I am preparing the npm and will publish it this weekend or so and update here.

3 Likes

How do you install it?

@alkopop79,

  1. Go to <Node-RED>\nodes\hardware folder.
  2. Create a folder named spark.
  3. Copy two files from https://github.com/krvarma/SparkCore_Node-RED/tree/master/spark-node.

You can use node red.js -v to debug any issues.

Let me know any issue facing.

2 Likes

Thanks @krvarma

@krvarma when i followed the above instruction, i get the following error

11 Nov 12:40:19 - [red] Version: 0.9.1.git
11 Nov 12:40:19 - [red] Loading palette nodes

/home/pi/node-red/nodes/core/hardware/sparkcore.js:5
<!DOCTYPE html>
^
11 Nov 12:40:36 - ------------------------------------------
11 Nov 12:40:36 - [sparkcore.js] SyntaxError: Unexpected token <
11 Nov 12:40:36 - ------------------------------------------

@sriram155, the error shows some HTML tags which the sparkcore.js have, can you paste your sparkcore.js here?

@krvarma here is the sparkcore.js contents that I've uploaded to my pi:

var EventSource = require('eventsource');
var Request = require("request");
var selectedDevice = null;

var sparkmodule = null;

module.exports = function(RED) {
	var core_id;
	var access_token;
	var param;
	var name;
	var repeat;
	var interval_id;
	var method;
	var es;

    function SparkCoreIN(n) {
        RED.nodes.createNode(this,n);
		
		sparkmodule = this;
		
        this.interval_id = null;
		this.repeat = n.repeat * 1000;
		this.core_id = n.coreid;
		this.access_token = n.accesstoken;
		this.name = n.fve;
		this.param = n.param;
		this.method = n.method;
		
		console.log("Method: " + this.method);
		
		if(this.method == "function"){
			if (this.repeat && !isNaN(this.repeat) && this.repeat > 0) {
				this.log("Repeat = "+this.repeat);
				
				this.interval_id = setInterval( function() {
					sparkmodule.emit("callfunction",{});
				}, this.repeat );
			} else{
				setTimeout( function(){ sparkmodule.emit("callfunction",{}); }, 100);
			}
		}
		else if(this.method == "subscribe"){
			var url = "https://api.spark.io/v1/devices/" + this.core_id + "/events/" + this.name + "?access_token=" + this.access_token;
			
			this.es = new EventSource(url);
		
			this.es.addEventListener(this.name, function(e){
				var data = JSON.parse(e.data);
			
				console.log("Data: " + data);
			
				var msg = {
					raw: data,
					payload:data.data,
					ttl: data.ttl,
					published_at: data.published_at,
					coreid: data.coreid
				};
			
				sparkmodule.send(msg);
			}, false);

			this.es.onerror = function(){
				console.log('ES Error');
			};
		}
		else if(this.method == "variable"){
			if (this.repeat && !isNaN(this.repeat) && this.repeat > 0) {
				this.log("Repeat = "+this.repeat);
				
				this.interval_id = setInterval( function() {
					sparkmodule.emit("getvariable",{});
				}, this.repeat );
			} else{
				setTimeout( function(){ sparkmodule.emit("getvariable",{}); }, 100);
			}
		}
		
		this.on("callfunction", function(){
			var url = "https://api.spark.io/v1/devices/" + this.core_id + "/" + this.name;
			
			Request.post(
				url, 
				{
					form: {
						access_token: this.access_token,
						args: this.param
					}
				},
				function (error, response, body){
					console.log(body);
					if(!error && response.statusCode == 200){
						var data = JSON.parse(body);
						var msg = {
							raw: data,
							payload: data.return_value,
							id: data.id,
							name: data.name,
							last_app: data.last_app,
							connected: data.connected
						};

						sparkmodule.send(msg);
					}
				}
			)
		});
		
		this.on("getvariable", function(){
			var url = "https://api.spark.io/v1/devices/" + this.core_id + "/" + this.name + "?access_token=" + this.access_token;
			
			Request.get(url,
				function (error, response, body){
					console.log(body);
					if(!error && response.statusCode == 200){
						var data = JSON.parse(body);
						
						var msg = {
							raw: data,
							payload: data.result,
							name: data.name,
							cmd: data.cmd
						};

						sparkmodule.send(msg);
					}
				}
			)
		});
    }
	
	function SparkCoreOUT(n) {
        RED.nodes.createNode(this,n);
		
		sparkmodule = this;
		
		this.core_id = n.coreid;
		this.access_token = n.accesstoken;
		this.name = n.fve;
		this.param = n.param;
		
		this.on("input", function(msg){
			var url = "https://api.spark.io/v1/devices/" + this.core_id + "/" + this.name;
			
			var parameter = this.param;
			
			if(parameter.length == 0){
				parameter = msg.payload;
			}
			
			var postdata = {
				form: {
					access_token: this.access_token,
					args: parameter
				}
			};
			
			console.log("Postdata: ", postdata);
				
			Request.post(
				url, 
				postdata,
				function (error, response, body){
					console.log(body);
					if(!error && response.statusCode == 200){
						var data = JSON.parse(body);
						var msg = {
							raw: data,
							payload: data.return_value,
							id: data.id,
							name: data.name,
							last_app: data.last_app,
							connected: data.connected
						};

						sparkmodule.send(msg);
					}
				}
			)
		});
    }
	
    RED.nodes.registerType("SparkCore in",SparkCoreIN);
	RED.nodes.registerType("SparkCore out",SparkCoreOUT);
	
	SparkCoreIN.prototype.close = function() {
		console.log("Close called.");
	
        if (this.interval_id != null) {
			console.log("Interval closed.");
            clearInterval(this.interval_id);
        }
		
		if(this.es != null){
			console.log("EventSource closed.");
			this.es.close();
		}
    }
}

@sriram155, can you execute following command an check:

npm install request
npm install eventsource

@krvarma it’s still the same even after installing the request and eventsource packages.

@sriram155, I tried the same with my RPi and Windows machine, its working fine. Is there any detailed error message, I mean from node red.js -v?

@sriram155, can you take the latest and check it is working or not, I just made some changes based on an assumption, lets see it is working or not.

@krvarma still no luck with the updated files. The error message is the same.

 pi@ramServer ~/node-red $ sudo node red.js -v
    
    Welcome to Node-RED
    ===================
    
    13 Nov 07:59:45 - [red] Version: 0.9.1.git
    13 Nov 07:59:45 - [red] Loading palette nodes
    
    /home/pi/node-red/nodes/core/hardware/spark/sparkcore.js:5
    <!DOCTYPE html>
    ^
    13 Nov 08:00:04 - ------------------------------------------
    13 Nov 08:00:04 - [sparkcore.js] SyntaxError: Unexpected token <
    13 Nov 08:00:04 - ------------------------------------------
    13 Nov 08:00:04 - [red] Server now running at http://127.0.0.1:1880/
    13 Nov 08:00:04 - [red] Loading flows : flows_ramServer.json
    13 Nov 08:00:04 - [36-rpi-gpio.js] Error: "/usr/local/bin/gpio -v" command failed for some reason.
    13 Nov 08:00:04 - [red] Starting flows
    13 Nov 08:00:04 - [warn] [arduino-board:1a003a65.e5ffc6] Device /dev/ttyACM0 not found

Here is the complete list of packages installed under the node-red directory:


pi@ramServer ~/node-red $ npm ls
node-red@0.9.1 /home/pi/node-red
β”œβ”€β”¬ arduino-firmata@0.3.2 extraneous
β”‚ β”œβ”€β”¬ debug@2.1.0
β”‚ β”‚ └── ms@0.6.2
β”‚ β”œβ”€β”€ eventemitter2@0.4.14
β”‚ └─┬ serialport@1.4.6
β”‚   β”œβ”€β”€ async@0.9.0
β”‚   β”œβ”€β”€ bindings@1.2.1
β”‚   β”œβ”€β”€ nan@1.3.0
β”‚   β”œβ”€β”¬ node-pre-gyp@0.5.19
β”‚   β”‚ β”œβ”€β”¬ mkdirp@0.5.0
β”‚   β”‚ β”‚ └── minimist@0.0.8
β”‚   β”‚ β”œβ”€β”¬ nopt@2.2.1
β”‚   β”‚ β”‚ └── abbrev@1.0.5
β”‚   β”‚ β”œβ”€β”¬ npmlog@0.0.6
β”‚   β”‚ β”‚ └── ansi@0.2.1
β”‚   β”‚ β”œβ”€β”¬ rc@0.4.0
β”‚   β”‚ β”‚ β”œβ”€β”€ deep-extend@0.2.10
β”‚   β”‚ β”‚ β”œβ”€β”€ ini@1.1.0
β”‚   β”‚ β”‚ β”œβ”€β”€ minimist@0.0.10
β”‚   β”‚ β”‚ └── strip-json-comments@0.1.3
β”‚   β”‚ β”œβ”€β”¬ request@2.36.0
β”‚   β”‚ β”‚ β”œβ”€β”€ aws-sign2@0.5.0
β”‚   β”‚ β”‚ β”œβ”€β”€ forever-agent@0.5.2
β”‚   β”‚ β”‚ β”œβ”€β”¬ form-data@0.1.2
β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ async@0.2.10
β”‚   β”‚ β”‚ β”‚ └─┬ combined-stream@0.0.4
β”‚   β”‚ β”‚ β”‚   └── delayed-stream@0.0.5
β”‚   β”‚ β”‚ β”œβ”€β”¬ hawk@1.0.0
β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ boom@0.4.2
β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ cryptiles@0.2.2
β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ hoek@0.9.1
β”‚   β”‚ β”‚ β”‚ └── sntp@0.2.4
β”‚   β”‚ β”‚ β”œβ”€β”¬ http-signature@0.10.0
β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ asn1@0.1.11
β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ assert-plus@0.1.2
β”‚   β”‚ β”‚ β”‚ └── ctype@0.5.2
β”‚   β”‚ β”‚ β”œβ”€β”€ json-stringify-safe@5.0.0
β”‚   β”‚ β”‚ β”œβ”€β”€ mime@1.2.11
β”‚   β”‚ β”‚ β”œβ”€β”€ node-uuid@1.4.1
β”‚   β”‚ β”‚ β”œβ”€β”€ oauth-sign@0.3.0
β”‚   β”‚ β”‚ β”œβ”€β”€ qs@0.6.6
β”‚   β”‚ β”‚ β”œβ”€β”¬ tough-cookie@0.12.1
β”‚   β”‚ β”‚ β”‚ └── punycode@1.2.4
β”‚   β”‚ β”‚ └── tunnel-agent@0.4.0
β”‚   β”‚ β”œβ”€β”€ rimraf@2.2.8
β”‚   β”‚ β”œβ”€β”€ semver@2.3.0
β”‚   β”‚ β”œβ”€β”¬ tar@0.1.19
β”‚   β”‚ β”‚ β”œβ”€β”€ block-stream@0.0.7
β”‚   β”‚ β”‚ β”œβ”€β”¬ fstream@0.1.25
β”‚   β”‚ β”‚ β”‚ β”œβ”€β”€ graceful-fs@2.0.3
β”‚   β”‚ β”‚ β”‚ └── mkdirp@0.3.5
β”‚   β”‚ β”‚ └── inherits@2.0.1
β”‚   β”‚ └─┬ tar-pack@2.0.0
β”‚   β”‚   β”œβ”€β”€ debug@0.7.4
β”‚   β”‚   β”œβ”€β”¬ fstream@0.1.25
β”‚   β”‚   β”‚ β”œβ”€β”€ graceful-fs@2.0.3
β”‚   β”‚   β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚   β”‚   β”‚ └── mkdirp@0.3.5
β”‚   β”‚   β”œβ”€β”¬ fstream-ignore@0.0.7
β”‚   β”‚   β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚   β”‚   β”‚ └─┬ minimatch@0.2.14
β”‚   β”‚   β”‚   β”œβ”€β”€ lru-cache@2.5.0
β”‚   β”‚   β”‚   └── sigmund@1.0.0
β”‚   β”‚   β”œβ”€β”€ graceful-fs@1.2.3
β”‚   β”‚   β”œβ”€β”€ once@1.1.1
β”‚   β”‚   β”œβ”€β”¬ readable-stream@1.0.27-1
β”‚   β”‚   β”‚ β”œβ”€β”€ core-util-is@1.0.1
β”‚   β”‚   β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚   β”‚   β”‚ β”œβ”€β”€ isarray@0.0.1
β”‚   β”‚   β”‚ └── string_decoder@0.10.25-1
β”‚   β”‚   └── uid-number@0.0.3
β”‚   β”œβ”€β”¬ optimist@0.6.1
β”‚   β”‚ β”œβ”€β”€ minimist@0.0.10
β”‚   β”‚ └── wordwrap@0.0.2
β”‚   └── sf@0.1.7
β”œβ”€β”¬ cheerio@0.17.0
β”‚ β”œβ”€β”¬ CSSselect@0.4.1
β”‚ β”‚ β”œβ”€β”€ CSSwhat@0.4.7
β”‚ β”‚ └─┬ domutils@1.4.3
β”‚ β”‚   └── domelementtype@1.1.3
β”‚ β”œβ”€β”¬ dom-serializer@0.0.1
β”‚ β”‚ └── domelementtype@1.1.3
β”‚ β”œβ”€β”€ entities@1.1.1
β”‚ β”œβ”€β”¬ htmlparser2@3.7.3
β”‚ β”‚ β”œβ”€β”€ domelementtype@1.1.3
β”‚ β”‚ β”œβ”€β”€ domhandler@2.2.1
β”‚ β”‚ β”œβ”€β”€ domutils@1.5.0
β”‚ β”‚ β”œβ”€β”€ entities@1.0.0
β”‚ β”‚ └─┬ readable-stream@1.1.13
β”‚ β”‚   β”œβ”€β”€ core-util-is@1.0.1
β”‚ β”‚   β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚   β”œβ”€β”€ isarray@0.0.1
β”‚ β”‚   └── string_decoder@0.10.31
β”‚ └── lodash@2.4.1
β”œβ”€β”€ clone@0.1.18
β”œβ”€β”€ colors@0.6.2
β”œβ”€β”€ cors@2.4.2
β”œβ”€β”€ cron@1.0.4
β”œβ”€β”¬ cylon@0.20.2
β”‚ β”œβ”€β”€ async@0.9.0
β”‚ β”œβ”€β”¬ body-parser@1.9.0
β”‚ β”‚ β”œβ”€β”€ bytes@1.0.0
β”‚ β”‚ β”œβ”€β”€ depd@1.0.0
β”‚ β”‚ β”œβ”€β”€ iconv-lite@0.4.4
β”‚ β”‚ β”œβ”€β”€ media-typer@0.3.0
β”‚ β”‚ β”œβ”€β”¬ on-finished@2.1.0
β”‚ β”‚ β”‚ └── ee-first@1.0.5
β”‚ β”‚ β”œβ”€β”€ qs@2.2.4
β”‚ β”‚ └─┬ type-is@1.5.3
β”‚ β”‚   └─┬ mime-types@2.0.3
β”‚ β”‚     └── mime-db@1.2.0
β”‚ β”œβ”€β”¬ express@4.9.8
β”‚ β”‚ β”œβ”€β”¬ accepts@1.1.3
β”‚ β”‚ β”‚ β”œβ”€β”¬ mime-types@2.0.3
β”‚ β”‚ β”‚ β”‚ └── mime-db@1.2.0
β”‚ β”‚ β”‚ └── negotiator@0.4.9
β”‚ β”‚ β”œβ”€β”€ cookie@0.1.2
β”‚ β”‚ β”œβ”€β”€ cookie-signature@1.0.5
β”‚ β”‚ β”œβ”€β”¬ debug@2.0.0
β”‚ β”‚ β”‚ └── ms@0.6.2
β”‚ β”‚ β”œβ”€β”€ depd@0.4.5
β”‚ β”‚ β”œβ”€β”€ escape-html@1.0.1
β”‚ β”‚ β”œβ”€β”¬ etag@1.4.0
β”‚ β”‚ β”‚ └── crc@3.0.0
β”‚ β”‚ β”œβ”€β”€ finalhandler@0.2.0
β”‚ β”‚ β”œβ”€β”€ fresh@0.2.4
β”‚ β”‚ β”œβ”€β”€ media-typer@0.3.0
β”‚ β”‚ β”œβ”€β”€ merge-descriptors@0.0.2
β”‚ β”‚ β”œβ”€β”€ methods@1.1.0
β”‚ β”‚ β”œβ”€β”¬ on-finished@2.1.1
β”‚ β”‚ β”‚ └── ee-first@1.1.0
β”‚ β”‚ β”œβ”€β”€ parseurl@1.3.0
β”‚ β”‚ β”œβ”€β”€ path-to-regexp@0.1.3
β”‚ β”‚ β”œβ”€β”¬ proxy-addr@1.0.3
β”‚ β”‚ β”‚ β”œβ”€β”€ forwarded@0.1.0
β”‚ β”‚ β”‚ └── ipaddr.js@0.1.3
β”‚ β”‚ β”œβ”€β”€ qs@2.2.4
β”‚ β”‚ β”œβ”€β”€ range-parser@1.0.2
β”‚ β”‚ β”œβ”€β”¬ send@0.9.3
β”‚ β”‚ β”‚ β”œβ”€β”€ destroy@1.0.3
β”‚ β”‚ β”‚ β”œβ”€β”€ mime@1.2.11
β”‚ β”‚ β”‚ β”œβ”€β”€ ms@0.6.2
β”‚ β”‚ β”‚ └─┬ on-finished@2.1.0
β”‚ β”‚ β”‚   └── ee-first@1.0.5
β”‚ β”‚ β”œβ”€β”€ serve-static@1.6.4
β”‚ β”‚ β”œβ”€β”¬ type-is@1.5.3
β”‚ β”‚ β”‚ └─┬ mime-types@2.0.3
β”‚ β”‚ β”‚   └── mime-db@1.2.0
β”‚ β”‚ β”œβ”€β”€ utils-merge@1.0.0
β”‚ β”‚ └── vary@1.0.0
β”‚ └── robeaux@0.2.0
β”œβ”€β”¬ cylon-ble@0.2.0 extraneous
β”‚ └─┬ noble@0.3.6
β”‚   └── debug@0.7.4
β”œβ”€β”¬ cylon-firmata@0.17.0 extraneous
β”‚ β”œβ”€β”€ cylon-gpio@0.20.0
β”‚ β”œβ”€β”€ cylon-i2c@0.17.0
β”‚ └─┬ firmata@0.3.5
β”‚   β”œβ”€β”€ browser-serialport@1.0.6
β”‚   └── object-assign@1.0.0
β”œβ”€β”€ cylon-gpio@0.20.0
β”œβ”€β”€ cylon-i2c@0.17.0
β”œβ”€β”€ cylon-mqtt@0.1.0 extraneous
β”œβ”€β”€ cylon-pebble@0.13.0 extraneous
β”œβ”€β”¬ cylon-raspi@0.13.0 extraneous
β”‚ β”œβ”€β”€ cylon-gpio@0.20.0
β”‚ β”œβ”€β”€ cylon-i2c@0.17.0
β”‚ └─┬ i2c@0.1.4
β”‚   β”œβ”€β”€ bindings@1.1.1
β”‚   β”œβ”€β”€ coffee-script@1.3.3
β”‚   β”œβ”€β”€ repl@0.1.3
β”‚   └── underscore@1.2.4
β”œβ”€β”¬ eventsource@0.1.4 extraneous
β”‚ └─┬ original@0.0.5
β”‚   └── url-parse@0.0.4
β”œβ”€β”¬ express@3.17.2
β”‚ β”œβ”€β”€ basic-auth@1.0.0
β”‚ β”œβ”€β”¬ commander@1.3.2
β”‚ β”‚ └── keypress@0.1.0
β”‚ β”œβ”€β”¬ connect@2.26.1
β”‚ β”‚ β”œβ”€β”€ basic-auth-connect@1.0.0
β”‚ β”‚ β”œβ”€β”¬ body-parser@1.8.4
β”‚ β”‚ β”‚ β”œβ”€β”€ iconv-lite@0.4.4
β”‚ β”‚ β”‚ β”œβ”€β”¬ on-finished@2.1.0
β”‚ β”‚ β”‚ β”‚ └── ee-first@1.0.5
β”‚ β”‚ β”‚ └── qs@2.2.4
β”‚ β”‚ β”œβ”€β”€ bytes@1.0.0
β”‚ β”‚ β”œβ”€β”¬ compression@1.1.2
β”‚ β”‚ β”‚ β”œβ”€β”¬ accepts@1.1.3
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ mime-types@2.0.3
β”‚ β”‚ β”‚ β”‚ β”‚ └── mime-db@1.2.0
β”‚ β”‚ β”‚ β”‚ └── negotiator@0.4.9
β”‚ β”‚ β”‚ └─┬ compressible@2.0.1
β”‚ β”‚ β”‚   └── mime-db@1.2.0
β”‚ β”‚ β”œβ”€β”¬ connect-timeout@1.3.0
β”‚ β”‚ β”‚ └── ms@0.6.2
β”‚ β”‚ β”œβ”€β”€ cookie-parser@1.3.3
β”‚ β”‚ β”œβ”€β”¬ csurf@1.6.3
β”‚ β”‚ β”‚ β”œβ”€β”¬ csrf@2.0.2
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ base64-url@1.0.0
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ rndm@1.0.0
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ scmp@1.0.0
β”‚ β”‚ β”‚ β”‚ └─┬ uid-safe@1.0.1
β”‚ β”‚ β”‚ β”‚   └─┬ mz@1.0.2
β”‚ β”‚ β”‚ β”‚     └── native-or-bluebird@1.1.2
β”‚ β”‚ β”‚ └─┬ http-errors@1.2.7
β”‚ β”‚ β”‚   β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚ β”‚   └── statuses@1.2.0
β”‚ β”‚ β”œβ”€β”¬ errorhandler@1.2.2
β”‚ β”‚ β”‚ └─┬ accepts@1.1.3
β”‚ β”‚ β”‚   β”œβ”€β”¬ mime-types@2.0.3
β”‚ β”‚ β”‚   β”‚ └── mime-db@1.2.0
β”‚ β”‚ β”‚   └── negotiator@0.4.9
β”‚ β”‚ β”œβ”€β”¬ express-session@1.8.2
β”‚ β”‚ β”‚ β”œβ”€β”¬ uid-safe@1.0.1
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ base64-url@1.0.0
β”‚ β”‚ β”‚ β”‚ └─┬ mz@1.0.2
β”‚ β”‚ β”‚ β”‚   └── native-or-bluebird@1.1.2
β”‚ β”‚ β”‚ └── utils-merge@1.0.0
β”‚ β”‚ β”œβ”€β”€ finalhandler@0.2.0
β”‚ β”‚ β”œβ”€β”€ method-override@2.2.0
β”‚ β”‚ β”œβ”€β”¬ morgan@1.3.2
β”‚ β”‚ β”‚ └─┬ on-finished@2.1.0
β”‚ β”‚ β”‚   └── ee-first@1.0.5
β”‚ β”‚ β”œβ”€β”¬ multiparty@3.3.2
β”‚ β”‚ β”‚ β”œβ”€β”¬ readable-stream@1.1.13
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ core-util-is@1.0.1
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ isarray@0.0.1
β”‚ β”‚ β”‚ β”‚ └── string_decoder@0.10.31
β”‚ β”‚ β”‚ └── stream-counter@0.2.0
β”‚ β”‚ β”œβ”€β”€ on-headers@1.0.0
β”‚ β”‚ β”œβ”€β”€ pause@0.0.1
β”‚ β”‚ β”œβ”€β”€ qs@2.2.3
β”‚ β”‚ β”œβ”€β”€ response-time@2.0.1
β”‚ β”‚ β”œβ”€β”¬ serve-favicon@2.1.6
β”‚ β”‚ β”‚ β”œβ”€β”€ etag@1.5.0
β”‚ β”‚ β”‚ └── ms@0.6.2
β”‚ β”‚ β”œβ”€β”¬ serve-index@1.2.1
β”‚ β”‚ β”‚ β”œβ”€β”¬ accepts@1.1.3
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”¬ mime-types@2.0.3
β”‚ β”‚ β”‚ β”‚ β”‚ └── mime-db@1.2.0
β”‚ β”‚ β”‚ β”‚ └── negotiator@0.4.9
β”‚ β”‚ β”‚ └── batch@0.5.1
β”‚ β”‚ β”œβ”€β”¬ serve-static@1.6.4
β”‚ β”‚ β”‚ β”œβ”€β”¬ send@0.9.3
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ destroy@1.0.3
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ etag@1.4.0
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ mime@1.2.11
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ ms@0.6.2
β”‚ β”‚ β”‚ β”‚ └─┬ on-finished@2.1.0
β”‚ β”‚ β”‚ β”‚   └── ee-first@1.0.5
β”‚ β”‚ β”‚ └── utils-merge@1.0.0
β”‚ β”‚ β”œβ”€β”¬ type-is@1.5.3
β”‚ β”‚ β”‚ └─┬ mime-types@2.0.3
β”‚ β”‚ β”‚   └── mime-db@1.2.0
β”‚ β”‚ └── vhost@3.0.0
β”‚ β”œβ”€β”€ cookie@0.1.2
β”‚ β”œβ”€β”€ cookie-signature@1.0.5
β”‚ β”œβ”€β”€ crc@3.0.0
β”‚ β”œβ”€β”¬ debug@2.0.0
β”‚ β”‚ └── ms@0.6.2
β”‚ β”œβ”€β”€ depd@0.4.5
β”‚ β”œβ”€β”€ escape-html@1.0.1
β”‚ β”œβ”€β”€ fresh@0.2.4
β”‚ β”œβ”€β”€ media-typer@0.3.0
β”‚ β”œβ”€β”€ merge-descriptors@0.0.2
β”‚ β”œβ”€β”€ methods@1.1.0
β”‚ β”œβ”€β”€ parseurl@1.3.0
β”‚ β”œβ”€β”¬ proxy-addr@1.0.1
β”‚ β”‚ └── ipaddr.js@0.1.2
β”‚ β”œβ”€β”€ range-parser@1.0.2
β”‚ β”œβ”€β”¬ send@0.9.2
β”‚ β”‚ β”œβ”€β”€ destroy@1.0.3
β”‚ β”‚ β”œβ”€β”€ etag@1.3.1
β”‚ β”‚ β”œβ”€β”€ mime@1.2.11
β”‚ β”‚ β”œβ”€β”€ ms@0.6.2
β”‚ β”‚ └─┬ on-finished@2.1.0
β”‚ β”‚   └── ee-first@1.0.5
β”‚ └── vary@1.0.0
β”œβ”€β”¬ feedparser@0.19.2 extraneous
β”‚ β”œβ”€β”€ addressparser@0.1.3
β”‚ β”œβ”€β”€ array-indexofobject@0.0.1
β”‚ β”œβ”€β”¬ readable-stream@1.0.33
β”‚ β”‚ β”œβ”€β”€ core-util-is@1.0.1
β”‚ β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚ β”œβ”€β”€ isarray@0.0.1
β”‚ β”‚ └── string_decoder@0.10.31
β”‚ β”œβ”€β”¬ resanitize@0.3.0
β”‚ β”‚ └── validator@1.5.1
β”‚ └── sax@0.6.1
β”œβ”€β”¬ follow-redirects@0.0.3
β”‚ └── underscore@1.7.0
β”œβ”€β”¬ fs-extra@0.11.1
β”‚ β”œβ”€β”€ jsonfile@2.0.0
β”‚ β”œβ”€β”€ ncp@0.6.0
β”‚ └── rimraf@2.2.8
β”œβ”€β”¬ fs.notify@0.0.4 extraneous
β”‚ β”œβ”€β”€ async@0.1.22
β”‚ └── retry@0.6.1
β”œβ”€β”¬ grunt@0.4.5
β”‚ β”œβ”€β”€ async@0.1.22
β”‚ β”œβ”€β”€ coffee-script@1.3.3
β”‚ β”œβ”€β”€ dateformat@1.0.2-1.2.3
β”‚ β”œβ”€β”€ eventemitter2@0.4.14
β”‚ β”œβ”€β”€ exit@0.1.2
β”‚ β”œβ”€β”¬ findup-sync@0.1.3
β”‚ β”‚ β”œβ”€β”¬ glob@3.2.11
β”‚ β”‚ β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚ β”‚ └─┬ minimatch@0.3.0
β”‚ β”‚ β”‚   β”œβ”€β”€ lru-cache@2.5.0
β”‚ β”‚ β”‚   └── sigmund@1.0.0
β”‚ β”‚ └── lodash@2.4.1
β”‚ β”œβ”€β”€ getobject@0.1.0
β”‚ β”œβ”€β”¬ glob@3.1.21
β”‚ β”‚ β”œβ”€β”€ graceful-fs@1.2.3
β”‚ β”‚ └── inherits@1.0.0
β”‚ β”œβ”€β”¬ grunt-legacy-log@0.1.1
β”‚ β”‚ β”œβ”€β”€ lodash@2.4.1
β”‚ β”‚ └── underscore.string@2.3.3
β”‚ β”œβ”€β”€ grunt-legacy-util@0.2.0
β”‚ β”œβ”€β”€ hooker@0.2.3
β”‚ β”œβ”€β”€ iconv-lite@0.2.11
β”‚ β”œβ”€β”¬ js-yaml@2.0.5
β”‚ β”‚ β”œβ”€β”¬ argparse@0.1.15
β”‚ β”‚ β”‚ β”œβ”€β”€ underscore@1.4.4
β”‚ β”‚ β”‚ └── underscore.string@2.3.3
β”‚ β”‚ └── esprima@1.0.4
β”‚ β”œβ”€β”€ lodash@0.9.2
β”‚ β”œβ”€β”¬ minimatch@0.2.14
β”‚ β”‚ β”œβ”€β”€ lru-cache@2.5.0
β”‚ β”‚ └── sigmund@1.0.0
β”‚ β”œβ”€β”¬ nopt@1.0.10
β”‚ β”‚ └── abbrev@1.0.5
β”‚ β”œβ”€β”€ rimraf@2.2.8
β”‚ β”œβ”€β”€ underscore.string@2.2.1
β”‚ └── which@1.0.5
β”œβ”€β”¬ grunt-cli@0.1.13
β”‚ β”œβ”€β”¬ findup-sync@0.1.3
β”‚ β”‚ β”œβ”€β”¬ glob@3.2.11
β”‚ β”‚ β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚ β”‚ └─┬ minimatch@0.3.0
β”‚ β”‚ β”‚   β”œβ”€β”€ lru-cache@2.5.0
β”‚ β”‚ β”‚   └── sigmund@1.0.0
β”‚ β”‚ └── lodash@2.4.1
β”‚ β”œβ”€β”¬ nopt@1.0.10
β”‚ β”‚ └── abbrev@1.0.5
β”‚ └── resolve@0.3.1
β”œβ”€β”¬ grunt-contrib-jshint@0.10.0
β”‚ β”œβ”€β”€ hooker@0.2.3
β”‚ └─┬ jshint@2.5.10
β”‚   β”œβ”€β”¬ cli@0.6.5
β”‚   β”‚ └─┬ glob@3.2.11
β”‚   β”‚   β”œβ”€β”€ inherits@2.0.1
β”‚   β”‚   └─┬ minimatch@0.3.0
β”‚   β”‚     β”œβ”€β”€ lru-cache@2.5.0
β”‚   β”‚     └── sigmund@1.0.0
β”‚   β”œβ”€β”¬ console-browserify@1.1.0
β”‚   β”‚ └── date-now@0.1.4
β”‚   β”œβ”€β”€ exit@0.1.2
β”‚   β”œβ”€β”¬ htmlparser2@3.8.2
β”‚   β”‚ β”œβ”€β”€ domelementtype@1.1.3
β”‚   β”‚ β”œβ”€β”€ domhandler@2.3.0
β”‚   β”‚ β”œβ”€β”€ domutils@1.5.0
β”‚   β”‚ β”œβ”€β”€ entities@1.0.0
β”‚   β”‚ └─┬ readable-stream@1.1.13
β”‚   β”‚   β”œβ”€β”€ core-util-is@1.0.1
β”‚   β”‚   β”œβ”€β”€ inherits@2.0.1
β”‚   β”‚   β”œβ”€β”€ isarray@0.0.1
β”‚   β”‚   └── string_decoder@0.10.31
β”‚   β”œβ”€β”¬ minimatch@1.0.0
β”‚   β”‚ β”œβ”€β”€ lru-cache@2.5.0
β”‚   β”‚ └── sigmund@1.0.0
β”‚   β”œβ”€β”€ shelljs@0.3.0
β”‚   β”œβ”€β”€ strip-json-comments@1.0.2
β”‚   └── underscore@1.6.0
β”œβ”€β”€ grunt-simple-mocha@0.4.0
β”œβ”€β”¬ imap@0.8.13
β”‚ β”œβ”€β”¬ readable-stream@1.1.13
β”‚ β”‚ β”œβ”€β”€ core-util-is@1.0.1
β”‚ β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚ β”œβ”€β”€ isarray@0.0.1
β”‚ β”‚ └── string_decoder@0.10.31
β”‚ └── utf7@1.0.0
β”œβ”€β”¬ irc@0.3.7
β”‚ └── ansi-color@0.2.1
β”œβ”€β”€ is-utf8@0.2.0
β”œβ”€β”€ js2xmlparser@0.1.5 extraneous
β”œβ”€β”¬ mkdirp@0.5.0
β”‚ └── minimist@0.0.8
β”œβ”€β”¬ mocha@1.21.4
β”‚ β”œβ”€β”€ commander@2.0.0
β”‚ β”œβ”€β”¬ debug@2.1.0
β”‚ β”‚ └── ms@0.6.2
β”‚ β”œβ”€β”€ diff@1.0.7
β”‚ β”œβ”€β”¬ glob@3.2.3
β”‚ β”‚ β”œβ”€β”€ graceful-fs@2.0.3
β”‚ β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚ └─┬ minimatch@0.2.14
β”‚ β”‚   β”œβ”€β”€ lru-cache@2.5.0
β”‚ β”‚   └── sigmund@1.0.0
β”‚ β”œβ”€β”€ growl@1.8.1
β”‚ β”œβ”€β”¬ jade@0.26.3
β”‚ β”‚ β”œβ”€β”€ commander@0.6.1
β”‚ β”‚ └── mkdirp@0.3.0
β”‚ └── mkdirp@0.3.5
β”œβ”€β”¬ mongodb@1.4.19 extraneous
β”‚ β”œβ”€β”¬ bson@0.2.15
β”‚ β”‚ └── nan@1.3.0
β”‚ β”œβ”€β”€ kerberos@0.0.4
β”‚ └─┬ readable-stream@1.0.33
β”‚   β”œβ”€β”€ core-util-is@1.0.1
β”‚   β”œβ”€β”€ inherits@2.0.1
β”‚   β”œβ”€β”€ isarray@0.0.1
β”‚   └── string_decoder@0.10.31
β”œβ”€β”¬ mqtt@0.3.12
β”‚ └─┬ readable-stream@1.0.33
β”‚   β”œβ”€β”€ core-util-is@1.0.1
β”‚   β”œβ”€β”€ inherits@2.0.1
β”‚   β”œβ”€β”€ isarray@0.0.1
β”‚   └── string_decoder@0.10.31
β”œβ”€β”€ mustache@0.8.2
β”œβ”€β”¬ node-red-node-pushover@0.0.1 extraneous
β”‚ └── pushover-notifications@0.2.0
β”œβ”€β”¬ node-red-node-twilio@0.0.4 extraneous
β”‚ └─┬ twilio@1.6.0
β”‚   β”œβ”€β”€ jwt-simple@0.1.0
β”‚   β”œβ”€β”€ q@0.9.7
β”‚   β”œβ”€β”¬ request@2.27.0
β”‚   β”‚ β”œβ”€β”€ aws-sign@0.3.0
β”‚   β”‚ β”œβ”€β”€ cookie-jar@0.3.0
β”‚   β”‚ β”œβ”€β”€ forever-agent@0.5.2
β”‚   β”‚ β”œβ”€β”¬ form-data@0.1.4
β”‚   β”‚ β”‚ β”œβ”€β”€ async@0.9.0
β”‚   β”‚ β”‚ └─┬ combined-stream@0.0.7
β”‚   β”‚ β”‚   └── delayed-stream@0.0.5
β”‚   β”‚ β”œβ”€β”¬ hawk@1.0.0
β”‚   β”‚ β”‚ β”œβ”€β”€ boom@0.4.2
β”‚   β”‚ β”‚ β”œβ”€β”€ cryptiles@0.2.2
β”‚   β”‚ β”‚ β”œβ”€β”€ hoek@0.9.1
β”‚   β”‚ β”‚ └── sntp@0.2.4
β”‚   β”‚ β”œβ”€β”¬ http-signature@0.10.0
β”‚   β”‚ β”‚ β”œβ”€β”€ asn1@0.1.11
β”‚   β”‚ β”‚ β”œβ”€β”€ assert-plus@0.1.2
β”‚   β”‚ β”‚ └── ctype@0.5.2
β”‚   β”‚ β”œβ”€β”€ json-stringify-safe@5.0.0
β”‚   β”‚ β”œβ”€β”€ mime@1.2.11
β”‚   β”‚ β”œβ”€β”€ node-uuid@1.4.1
β”‚   β”‚ β”œβ”€β”€ oauth-sign@0.3.0
β”‚   β”‚ β”œβ”€β”€ qs@0.6.6
β”‚   β”‚ └── tunnel-agent@0.3.0
β”‚   └── underscore@1.7.0
β”œβ”€β”¬ nodemailer@1.3.0
β”‚ β”œβ”€β”¬ buildmail@1.2.0
β”‚ β”‚ β”œβ”€β”€ addressparser@0.3.1
β”‚ β”‚ β”œβ”€β”€ libbase64@0.1.0
β”‚ β”‚ └── libqp@0.1.1
β”‚ β”œβ”€β”¬ hyperquest@0.3.0
β”‚ β”‚ β”œβ”€β”€ duplexer@0.1.1
β”‚ β”‚ └── through@2.2.7
β”‚ β”œβ”€β”¬ libmime@0.1.6
β”‚ β”‚ β”œβ”€β”€ iconv-lite@0.4.4
β”‚ β”‚ β”œβ”€β”€ libbase64@0.1.0
β”‚ β”‚ └── libqp@0.1.1
β”‚ β”œβ”€β”¬ nodemailer-direct-transport@1.0.0
β”‚ β”‚ └── smtp-connection@0.1.7
β”‚ └─┬ nodemailer-smtp-transport@0.1.13
β”‚   β”œβ”€β”€ nodemailer-wellknown@0.1.3
β”‚   └── smtp-connection@1.0.2
β”œβ”€β”¬ nopt@3.0.1
β”‚ └── abbrev@1.0.5
β”œβ”€β”€ oauth@0.9.12
β”œβ”€β”¬ raw-body@1.3.0
β”‚ β”œβ”€β”€ bytes@1.0.0
β”‚ └── iconv-lite@0.4.4
β”œβ”€β”€ redis@0.12.1 extraneous
β”œβ”€β”¬ request@2.42.0
β”‚ β”œβ”€β”€ aws-sign2@0.5.0
β”‚ β”œβ”€β”¬ bl@0.9.3
β”‚ β”‚ └─┬ readable-stream@1.0.33
β”‚ β”‚   β”œβ”€β”€ core-util-is@1.0.1
β”‚ β”‚   β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚   β”œβ”€β”€ isarray@0.0.1
β”‚ β”‚   └── string_decoder@0.10.31
β”‚ β”œβ”€β”€ caseless@0.6.0
β”‚ β”œβ”€β”€ forever-agent@0.5.2
β”‚ β”œβ”€β”¬ form-data@0.1.4
β”‚ β”‚ β”œβ”€β”€ async@0.9.0
β”‚ β”‚ β”œβ”€β”¬ combined-stream@0.0.7
β”‚ β”‚ β”‚ └── delayed-stream@0.0.5
β”‚ β”‚ └── mime@1.2.11
β”‚ β”œβ”€β”¬ hawk@1.1.1
β”‚ β”‚ β”œβ”€β”€ boom@0.4.2
β”‚ β”‚ β”œβ”€β”€ cryptiles@0.2.2
β”‚ β”‚ β”œβ”€β”€ hoek@0.9.1
β”‚ β”‚ └── sntp@0.2.4
β”‚ β”œβ”€β”¬ http-signature@0.10.0
β”‚ β”‚ β”œβ”€β”€ asn1@0.1.11
β”‚ β”‚ β”œβ”€β”€ assert-plus@0.1.2
β”‚ β”‚ └── ctype@0.5.2
β”‚ β”œβ”€β”€ json-stringify-safe@5.0.0
β”‚ β”œβ”€β”€ mime-types@1.0.2
β”‚ β”œβ”€β”€ node-uuid@1.4.1
β”‚ β”œβ”€β”€ oauth-sign@0.4.0
β”‚ β”œβ”€β”€ qs@1.2.2
β”‚ β”œβ”€β”€ stringstream@0.0.4
β”‚ β”œβ”€β”¬ tough-cookie@0.12.1
β”‚ β”‚ └── punycode@1.3.2
β”‚ └── tunnel-agent@0.4.0
β”œβ”€β”¬ sentiment@0.2.3
β”‚ β”œβ”€β”€ async@0.2.10
β”‚ └── lodash@1.3.1
β”œβ”€β”¬ serialport@1.4.6 extraneous
β”‚ β”œβ”€β”€ async@0.9.0
β”‚ β”œβ”€β”€ bindings@1.2.1
β”‚ β”œβ”€β”€ nan@1.3.0
β”‚ β”œβ”€β”¬ node-pre-gyp@0.5.19
β”‚ β”‚ β”œβ”€β”¬ mkdirp@0.5.0
β”‚ β”‚ β”‚ └── minimist@0.0.8
β”‚ β”‚ β”œβ”€β”¬ nopt@2.2.1
β”‚ β”‚ β”‚ └── abbrev@1.0.5
β”‚ β”‚ β”œβ”€β”¬ npmlog@0.0.6
β”‚ β”‚ β”‚ └── ansi@0.2.1
β”‚ β”‚ β”œβ”€β”¬ rc@0.4.0
β”‚ β”‚ β”‚ β”œβ”€β”€ deep-extend@0.2.10
β”‚ β”‚ β”‚ β”œβ”€β”€ ini@1.1.0
β”‚ β”‚ β”‚ β”œβ”€β”€ minimist@0.0.10
β”‚ β”‚ β”‚ └── strip-json-comments@0.1.3
β”‚ β”‚ β”œβ”€β”¬ request@2.36.0
β”‚ β”‚ β”‚ β”œβ”€β”€ aws-sign2@0.5.0
β”‚ β”‚ β”‚ β”œβ”€β”€ forever-agent@0.5.2
β”‚ β”‚ β”‚ β”œβ”€β”¬ form-data@0.1.2
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ async@0.2.10
β”‚ β”‚ β”‚ β”‚ └─┬ combined-stream@0.0.4
β”‚ β”‚ β”‚ β”‚   └── delayed-stream@0.0.5
β”‚ β”‚ β”‚ β”œβ”€β”¬ hawk@1.0.0
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ boom@0.4.2
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ cryptiles@0.2.2
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ hoek@0.9.1
β”‚ β”‚ β”‚ β”‚ └── sntp@0.2.4
β”‚ β”‚ β”‚ β”œβ”€β”¬ http-signature@0.10.0
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ asn1@0.1.11
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ assert-plus@0.1.2
β”‚ β”‚ β”‚ β”‚ └── ctype@0.5.2
β”‚ β”‚ β”‚ β”œβ”€β”€ json-stringify-safe@5.0.0
β”‚ β”‚ β”‚ β”œβ”€β”€ mime@1.2.11
β”‚ β”‚ β”‚ β”œβ”€β”€ node-uuid@1.4.1
β”‚ β”‚ β”‚ β”œβ”€β”€ oauth-sign@0.3.0
β”‚ β”‚ β”‚ β”œβ”€β”€ qs@0.6.6
β”‚ β”‚ β”‚ β”œβ”€β”¬ tough-cookie@0.12.1
β”‚ β”‚ β”‚ β”‚ └── punycode@1.2.4
β”‚ β”‚ β”‚ └── tunnel-agent@0.4.0
β”‚ β”‚ β”œβ”€β”€ rimraf@2.2.8
β”‚ β”‚ β”œβ”€β”€ semver@2.3.0
β”‚ β”‚ β”œβ”€β”¬ tar@0.1.19
β”‚ β”‚ β”‚ β”œβ”€β”€ block-stream@0.0.7
β”‚ β”‚ β”‚ β”œβ”€β”¬ fstream@0.1.25
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ graceful-fs@2.0.3
β”‚ β”‚ β”‚ β”‚ └── mkdirp@0.3.5
β”‚ β”‚ β”‚ └── inherits@2.0.1
β”‚ β”‚ └─┬ tar-pack@2.0.0
β”‚ β”‚   β”œβ”€β”€ debug@0.7.4
β”‚ β”‚   β”œβ”€β”¬ fstream@0.1.25
β”‚ β”‚   β”‚ β”œβ”€β”€ graceful-fs@2.0.3
β”‚ β”‚   β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚   β”‚ └── mkdirp@0.3.5
β”‚ β”‚   β”œβ”€β”¬ fstream-ignore@0.0.7
β”‚ β”‚   β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚   β”‚ └─┬ minimatch@0.2.14
β”‚ β”‚   β”‚   β”œβ”€β”€ lru-cache@2.5.0
β”‚ β”‚   β”‚   └── sigmund@1.0.0
β”‚ β”‚   β”œβ”€β”€ graceful-fs@1.2.3
β”‚ β”‚   β”œβ”€β”€ once@1.1.1
β”‚ β”‚   β”œβ”€β”¬ readable-stream@1.0.27-1
β”‚ β”‚   β”‚ β”œβ”€β”€ core-util-is@1.0.1
β”‚ β”‚   β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚ β”‚   β”‚ β”œβ”€β”€ isarray@0.0.1
β”‚ β”‚   β”‚ └── string_decoder@0.10.25-1
β”‚ β”‚   └── uid-number@0.0.3
β”‚ β”œβ”€β”¬ optimist@0.6.1
β”‚ β”‚ β”œβ”€β”€ minimist@0.0.10
β”‚ β”‚ └── wordwrap@0.0.2
β”‚ └── sf@0.1.7
β”œβ”€β”€ should@4.0.4
β”œβ”€β”¬ sinon@1.10.3
β”‚ β”œβ”€β”¬ formatio@1.0.2
β”‚ β”‚ └── samsam@1.1.1
β”‚ └─┬ util@0.10.3
β”‚   └── inherits@2.0.1
β”œβ”€β”¬ supertest@0.13.0
β”‚ β”œβ”€β”€ methods@1.0.0
β”‚ └─┬ superagent@0.18.0
β”‚   β”œβ”€β”€ component-emitter@1.1.2
β”‚   β”œβ”€β”€ cookiejar@1.3.2
β”‚   β”œβ”€β”€ debug@0.7.4
β”‚   β”œβ”€β”€ extend@1.2.1
β”‚   β”œβ”€β”¬ form-data@0.1.2
β”‚   β”‚ β”œβ”€β”€ async@0.2.10
β”‚   β”‚ β”œβ”€β”¬ combined-stream@0.0.7
β”‚   β”‚ β”‚ └── delayed-stream@0.0.5
β”‚   β”‚ └── mime@1.2.11
β”‚   β”œβ”€β”€ formidable@1.0.14
β”‚   β”œβ”€β”€ methods@0.0.1
β”‚   β”œβ”€β”€ mime@1.2.5
β”‚   β”œβ”€β”€ qs@0.6.6
β”‚   β”œβ”€β”¬ readable-stream@1.0.27-1
β”‚   β”‚ β”œβ”€β”€ core-util-is@1.0.1
β”‚   β”‚ β”œβ”€β”€ inherits@2.0.1
β”‚   β”‚ β”œβ”€β”€ isarray@0.0.1
β”‚   β”‚ └── string_decoder@0.10.31
β”‚   └── reduce-component@1.0.1
β”œβ”€β”€ twitter-ng@0.6.2
β”œβ”€β”¬ uglify-js@2.4.15
β”‚ β”œβ”€β”€ async@0.2.10
β”‚ β”œβ”€β”¬ optimist@0.3.7
β”‚ β”‚ └── wordwrap@0.0.2
β”‚ β”œβ”€β”¬ source-map@0.1.34
β”‚ β”‚ └── amdefine@0.1.0
β”‚ └── uglify-to-browserify@1.0.2
β”œβ”€β”€ when@3.4.6
β”œβ”€β”¬ ws@0.4.32
β”‚ β”œβ”€β”€ commander@2.1.0
β”‚ β”œβ”€β”€ nan@1.0.0
β”‚ β”œβ”€β”€ options@0.0.6
β”‚ └── tinycolor@0.0.1
└─┬ xml2js@0.4.4
  β”œβ”€β”€ sax@0.6.1
  └─┬ xmlbuilder@2.4.4
    └── lodash-node@2.4.1

Here is the version 0.0.7 NPM install package. Following command will install the package. The node-red authentication mechanism is implemented in this version. The authentication data, core id and access token are stored in separate file, so when you copy and paste the flow the auth data is not copied.

npm install node-red-contrib-sparkcore

I want to thank Dave Conway-Jones for his valuable inputs.

1 Like

@krvarma Thanks a lot. Does this work with Spark local cloud?

@sriram155 , this version 0.0.7 does not support the local cloud, but the next version will support this. I am working on it and may be early next week I can update it.

As I mentioned in the previous post this version has Authentication, Spark Core icon and some message modification to make it more consistent for all function call, read variable and the publish/subscribe.

2 Likes

@krvarma thanks for the note. I’m working on the local cloud. I’ll bookmark this thread for future updates.

Just published latest version 0.0.8. This version supports local cloud also with some other issue fixes.

1 Like

@sriram155, I just published the version 0.0.8, can you check you are able to connect to local cloud?