diff --git a/hardware/Pi/38-rpi-pibrella.html b/hardware/Pi/38-rpi-pibrella.html
new file mode 100644
index 00000000..73a3802d
--- /dev/null
+++ b/hardware/Pi/38-rpi-pibrella.html
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hardware/Pi/38-rpi-pibrella.js b/hardware/Pi/38-rpi-pibrella.js
new file mode 100644
index 00000000..140b2286
--- /dev/null
+++ b/hardware/Pi/38-rpi-pibrella.js
@@ -0,0 +1,173 @@
+/**
+ * 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 util = require("util");
+var exec = require('child_process').exec;
+var fs = require('fs');
+
+if (!fs.existsSync("/usr/local/bin/gpio")) {
+ exec("cat /proc/cpuinfo | grep BCM27",function(err,stdout,stderr) {
+ if (stdout.indexOf('BCM27') > -1) {
+ util.log('[36-rpi-gpio.js] Error: Cannot find Wiring-Pi "gpio" command. http://wiringpi.com/download-and-install/');
+ }
+ // else not on a Pi so don't worry anyone with needless messages.
+ });
+ return;
+}
+
+// Map physical P1 pins to Gordon's Wiring-Pi Pins (as they should be V1/V2 tolerant)
+var pintable = {
+// Physical : WiringPi
+ "Amber LED":"0",
+ "Buzzer":"1",
+ "Red LED":"2",
+ "Out E":"3",
+ "Out F":"4",
+ "Out G":"5",
+ "Out H":"6",
+ "Green LED":"7",
+ "In C":"10",
+ "In B":"11",
+ "In D":"12",
+ "In A":"13",
+ "Red Button":"14",
+}
+var tablepin = {
+// WiringPi : Physical
+ "0":"Amber",
+ "Buzzer":"1",
+ "2":"Red",
+ "3":"E",
+ "4":"F",
+ "5":"G",
+ "6":"H",
+ "7":"Green",
+ "10":"C",
+ "11":"B",
+ "12":"D",
+ "13":"A",
+ "14":"R",
+}
+
+function PibrellaIn(n) {
+ RED.nodes.createNode(this,n);
+ this.buttonState = -1;
+ this.pin = pintable[n.pin];
+ this.intype = n.intype;
+ var node = this;
+
+ if (this.pin) {
+ exec("gpio mode "+node.pin+" "+node.intype, function(err,stdout,stderr) {
+ if (err) node.error(err);
+ else {
+ node._interval = setInterval( function() {
+ exec("gpio read "+node.pin, function(err,stdout,stderr) {
+ if (err) node.error(err);
+ else {
+ if (node.buttonState !== Number(stdout)) {
+ var previousState = node.buttonState;
+ node.buttonState = Number(stdout);
+ if (previousState !== -1) {
+ var msg = {topic:"pibrella/"+tablepin[node.pin], payload:node.buttonState};
+ node.send(msg);
+ }
+ }
+ }
+ });
+ }, 250);
+ }
+ });
+ }
+ else {
+ this.error("Invalid GPIO pin: "+this.pin);
+ }
+}
+
+function PibrellaOut(n) {
+ RED.nodes.createNode(this,n);
+ this.pin = pintable[n.pin];
+ var node = this;
+
+ if (this.pin == "1") {
+ exec("gpio mode 1 pwm");
+ process.nextTick(function() {
+ exec("gpio pwm-ms");
+ node.on("input", function(msg) {
+ var out = Number(msg.payload);
+ if (out == 1) { out = 2; } // doesn't work with 1...
+ if (out == 0) { exec("gpio pwm 1 0"); }
+ else {
+ exec("gpio pwm 1 511");
+ exec("gpio pwmc "+out);
+ }
+ });
+ });
+ }
+ else if (this.pin) {
+ process.nextTick(function() {
+ exec("gpio mode "+node.pin+" out", function(err,stdout,stderr) {
+ if (err) node.error(err);
+ else {
+ node.on("input", function(msg) {
+ if (msg.payload === "true") msg.payload = true;
+ if (msg.payload === "false") msg.payload = false;
+ var out = Number(msg.payload);
+ if ((out == 0)|(out == 1)) {
+ exec("gpio write "+node.pin+" "+out, function(err,stdout,stderr) {
+ if (err) node.error(err);
+ });
+ }
+ else node.warn("Invalid input - not 0 or 1");
+ });
+ }
+ });
+ });
+ }
+ else {
+ this.error("Invalid GPIO pin: "+this.pin);
+ }
+}
+
+exec("gpio mode 0 out",function(err,stdout,stderr) {
+ if (err) {
+ util.log('[36-rpi-gpio.js] Error: "gpio" command failed for some reason.');
+ }
+ exec("gpio mode 1 out");
+ exec("gpio mode 2 out");
+ exec("gpio mode 3 out");
+ exec("gpio mode 4 out");
+ exec("gpio mode 5 out");
+ exec("gpio mode 6 out");
+ exec("gpio mode 7 out");
+ exec("gpio mode 10 in");
+ exec("gpio mode 11 in");
+ exec("gpio mode 12 in");
+ exec("gpio mode 13 in");
+ exec("gpio mode 14 in",function(err,stdout,stderr) {
+ RED.nodes.registerType("rpi-pibrella in",PibrellaIn);
+ RED.nodes.registerType("rpi-pibrella out",PibrellaOut);
+
+ PibrellaIn.prototype.close = function() {
+ clearInterval(this._interval);
+ }
+
+ PibrellaOut.prototype.close = function() {
+ exec("gpio mode "+this.pin+" in");
+ }
+
+ });
+});