@dbruno74/node-red-node-sensortag
Version:
A Node-RED node to read data from a TI SensorTag
282 lines (267 loc) • 13.1 kB
JavaScript
module.exports = function(RED) {
"use strict";
var SensorTag = require("@dbruno74/sensortag");
function discover(address, callback) {
if ((address === "") || (address == null)) {
SensorTag.discover(callback);
} else {
SensorTag.discoverByAddress(address, callback);
}
}
function SensorTagNode(n) {
RED.nodes.createNode(this,n);
this.name = n.name;
this.topic = n.topic;
this.address = n.address;
this.temperature = n.temperature;
this.pressure = n.pressure;
this.humidity = n.humidity;
this.accelerometer = n.accelerometer;
this.magnetometer = n.magnetometer;
this.gyroscope = n.gyroscope;
this.luxometer = n.luxometer;
this.keys = n.keys;
this.button = n.button;
this.battery = n.battery;
var node = this;
node.discovering = false;
node.configured = false;
if (typeof node.stag === "undefined") {
node.loop = setInterval(function() {
if (!node.discovering) {
node.discovering = true;
node.status({fill:"blue", shape:"dot", text:"discovering..."});
var msg = {'topic': node.topic + '/connection'};
msg.payload = {'status': 'discovering'};
node.send(msg);
discover(node.address,function(sensorTag) {
node.status({fill:"blue", shape:"dot", text:"connecting"});
node.stag = sensorTag;
node.log("found sensor tag: " + sensorTag._peripheral.address);
node.warn("found sensor tag: " + sensorTag._peripheral.address);
node.warn("sensortag type: " + node.stag.type);
node.topic = node.topic || sensorTag._peripheral.address;
var msg = {'topic': node.topic + '/connection'};
msg.payload = {'status': 'connecting', 'device': sensorTag._peripheral.address};
node.send(msg);
sensorTag.connect(function() {
node.log("connected to sensor tag: " + sensorTag._peripheral.address);
node.warn("connected to sensor tag: " + sensorTag._peripheral.address);
node.status({fill:"green", shape:"dot", text:"connected"});
var msg = {'topic': node.topic + '/connection'};
msg.payload = {'status': 'connected', 'device': sensorTag._peripheral.address};
node.send(msg);
sensorTag.once('disconnect', function() {
if (node.stag.type === "cc1352") {
sensorTag.enableAccelerometer(function() {});
}
node.status({fill:"red", shape:"ring", text:"disconnected"});
node.log("disconnected ",node.address);
node.warn("disconnected ",node.address);
var msg = {'topic': node.topic + '/connection'};
msg.payload = {'status': 'disconnected', 'device': sensorTag._peripheral.address};
node.send(msg);
node.discovering = false;
node.configured = false;
});
sensorTag.discoverServicesAndCharacteristics(function() {
if (!node.configured) {
node.configured = true;
node.warn("Discovering and configuring services ...");
sensorTag.enableIrTemperature(function() {});
sensorTag.on('irTemperatureChange',
function(objectTemperature, ambientTemperature) {
var msg = {'topic': node.topic + '/temperature'};
msg.payload = {'object': +objectTemperature.toFixed(1),
'ambient': +ambientTemperature.toFixed(1)
};
node.send(msg);
});
if (node.stag.type != "cc1352") {
sensorTag.enableBarometricPressure(function() {});
sensorTag.on('barometricPressureChange', function(pressure) {
var msg = {'topic': node.topic + '/pressure'};
msg.payload = {'pressure': parseInt(pressure)};
node.send(msg);
});
}
sensorTag.enableHumidity(function() {});
sensorTag.on('humidityChange', function(temp, humidity) {
var msg = {'topic': node.topic + '/humidity'};
msg.payload = {'temperature': +temp.toFixed(1),
'humidity': +humidity.toFixed(1)
};
if ((temp !== -40) || (humidity !== 100)) {
node.send(msg);
}
});
if (node.stag.type === "cc1352") {
sensorTag.enableAccelerometer(function() {});
sensorTag.on('accelerometer_xChange', function(x) {
var msg = {'topic': node.topic + '/accelerometer'};
msg.payload = {'axis': 'x', 'coord': +x.toFixed(2)};
node.send(msg);
});
sensorTag.on('accelerometer_yChange', function(y) {
var msg = {'topic': node.topic + '/accelerometer'};
msg.payload = {'axis': 'y', 'coord': +y.toFixed(2)};
node.send(msg);
});
sensorTag.on('accelerometer_zChange', function(z) {
var msg = {'topic': node.topic + '/accelerometer'};
msg.payload = {'axis': 'z', 'coord': +z.toFixed(2)};
node.send(msg);
});
} else {
sensorTag.enableAccelerometer(function() {});
sensorTag.on('accelerometerChange', function(x,y,z) {
var msg = {'topic': node.topic + '/accelerometer'};
msg.payload = {'x': +x.toFixed(2), 'y': +y.toFixed(2), 'z': +z.toFixed(2)};
node.send(msg);
});
}
if (node.stag.type != "cc1352") {
sensorTag.enableMagnetometer(function() {});
sensorTag.on('magnetometerChange', function(x,y,z) {
var msg = {'topic': node.topic + '/magnetometer'};
msg.payload = {'x': +x.toFixed(2), 'y': +y.toFixed(2), 'z': +z.toFixed(2)};
node.send(msg);
});
sensorTag.enableGyroscope(function() {});
sensorTag.on('gyroscopeChange', function(x,y,z) {
var msg = {'topic': node.topic + '/gyroscope'};
msg.payload = {'x': +x.toFixed(2), 'y': +y.toFixed(2), 'z': +z.toFixed(2)};
node.send(msg);
});
}
if (node.stag.type === "cc1352") {
sensorTag.on('button_0Change', function(key,event) {
var msg = {'topic': node.topic + '/button'};
msg.payload = {'key': key, 'event': event};
node.send(msg);
});
sensorTag.on('button_1Change', function(key,event) {
var msg = {'topic': node.topic + '/button'};
msg.payload = {'key': key, 'event': event};
node.send(msg);
});
} else {
sensorTag.on('simpleKeyChange', function(left, right, mag) {
var msg = {'topic': node.topic + '/keys'};
msg.payload = {'left': left, 'right': right, 'magnet': mag};
node.send(msg);
});
}
sensorTag.on('luxometerChange', function(lux) {
var msg = {'topic': node.topic + '/luxometer'};
msg.payload = {'lux': parseInt(lux)};
node.send(msg);
});
sensorTag.on('batteryLevelChange', function(val) {
var msg = {'topic': node.topic + '/batteryLevel'};
msg.payload = {'val': parseInt(val)};
node.send(msg);
});
enable(node);
node.warn("Services configured!");
} else node.stag.disconnect(function() {});
});
});
},node.address);
}
},1000);
}
else {
console.log("reconfig",node.address);
enable(node);
}
this.on("close", function() {
if (node.loop) { clearInterval(node.loop); }
if (node.stag) { node.stag.disconnect(function() {}); }
});
this.on("input", function(msg) {
if (msg.topic === "writeLed") {
node.stag.writeLed(msg.payload.ledNum, msg.payload.val);
}
});
this.on("input", function(msg) {
if (msg.topic === "reconnect") {
node.stag.disconnect(function() {});
};
});
}
var enable = function(node) {
if (node.temperature) {
node.stag.notifyIrTemperature(function() {});
}
else {
node.stag.unnotifyIrTemperature(function() {});
}
if (node.stag.type != "cc1352") {
if (node.pressure) {
node.stag.notifyBarometricPressure(function() {});
}
else {
node.stag.unnotifyBarometricPressure(function() {});
}
}
if (node.humidity) {
node.stag.notifyHumidity(function() {});
}
else {
node.stag.unnotifyHumidity(function() {});
}
if (node.accelerometer) {
node.stag.notifyAccelerometer(function() {});
}
else {
node.stag.unnotifyAccelerometer(function() {});
}
if (node.stag.type != "cc1352") {
if (node.magnetometer) {
node.stag.notifyMagnetometer(function() {});
}
else {
node.stag.unnotifyMagnetometer(function() {});
}
if (node.gyroscope) {
node.stag.notifyGyroscope(function() {});
}
else {
node.stag.unnotifyGyroscope(function() {});
}
}
if (node.stag.type === "cc2650" || node.stag.type === "cc1352") {
if (node.luxometer) {
node.stag.enableLuxometer(function() {});
node.stag.notifyLuxometer(function() {});
}
else {
node.stag.unnotifyLuxometer(function() {});
node.stag.disableLuxometer(function() {});
}
}
if (node.stag.type === "cc1352") {
if (node.button) {
node.stag.notifyButton(function() {});
}
else {
node.stag.unnotifyButton(function() {});
}
} else {
if (node.keys) {
node.stag.notifySimpleKey(function() {});
}
else {
node.stag.unnotifySimpleKey(function() {});
}
}
if (node.battery) {
node.stag.notifyBatteryLevel(function() {});
}
else {
node.stag.unnotifyBatteryLevel(function() {});
}
}
RED.nodes.registerType("sensorTag",SensorTagNode);
}