node-red-contrib-miflora
Version:
96 lines (89 loc) • 4.93 kB
JavaScript
module.exports = function (RED) {
var noble = require('noble');
function floraNode(config) {
RED.nodes.createNode(this, config);
var node = this;
const EventEmitter = require('events');
const DEFAULT_DEVICE_NAME = 'Flower care';//'Flower mate';
const DATA_SERVICE_UUID = '0000120400001000800000805f9b34fb';
const DATA_CHARACTERISTIC_UUID = '00001a0100001000800000805f9b34fb';
const FIRMWARE_CHARACTERISTIC_UUID = '00001a0200001000800000805f9b34fb';
const REALTIME_CHARACTERISTIC_UUID = '00001a0000001000800000805f9b34fb';
const REALTIME_META_VALUE = Buffer.from([0xA0, 0x1F]);
const SERVICE_UUIDS = [DATA_SERVICE_UUID];
const CHARACTERISTIC_UUIDS = [DATA_CHARACTERISTIC_UUID, FIRMWARE_CHARACTERISTIC_UUID, REALTIME_CHARACTERISTIC_UUID];
node.on('input', function (msg) {
if (noble.state === 'poweredOn') {
//noble.startScanning([], true);
run(msg, config);
} else {
// bind event to start scanning
noble.on('stateChange', function (state) {
if (state === 'poweredOn') {
//noble.startScanning([], true);
run(msg, config);
}
});
}
});
function run(msg, config) {
var devices = [];
noble.startScanning([], true);
noble.on('discover', function (peripheral) {
//console.log(peripheral);
if (peripheral.advertisement.localName == DEFAULT_DEVICE_NAME) {
console.log(peripheral.address)
if (devices.indexOf(peripheral.address) == -1) {
devices.push(peripheral.address);
//noble.stopScanning();
//noble.removeAllListeners('discover');// только первый?
peripheral.connect(function (err) {
//console.log(err);
//peripheral.readHandle(0x03, function (error, data) {
// console.log(error, data);
//});
switch (config.action) {
case "Data":
//console.log(config.action);
peripheral.writeHandle(0x33, new Buffer([0xA0, 0x1F]), false, function (err) {
if (err) console.error('ERROR', err)
peripheral.readHandle(0x35, function (error, data) {
//console.log(data);
var temp = (data[1] * 256 + data[0]) / 10;
var moist = data[7];
var light = data[4] * 256 + data[3];
var conductivity = data[9] * 256 + data[8];
//console.log(temp, moist, light, conductivity)
msg.payload = { address: peripheral.address, rssi: peripheral.rssi, temp: temp, moist: moist, light: light, conductivity: conductivity }
node.send(msg);
peripheral.disconnect();
});
});
break;
case "Battery":
//console.log(config.action);
peripheral.readHandle(0x038, function (error, data) {
//console.log(error, data);
msg.payload = { address: peripheral.address, rssi: peripheral.rssi, batteryLevel: parseInt(data.toString('hex', 0, 1), 16), firmwareVersion: data.toString('ascii', 2, data.length) }
node.send(msg);
peripheral.disconnect();
});
break;
}
});
}
}
});
setTimeout(function () {
noble.stopScanning();
noble.removeAllListeners('discover');// только первый?
devices = [];
}, 5000);
}
node.on("close", function () {
//noble.stopScanning();
//noble.removeAllListeners();
});
}
RED.nodes.registerType("miflora", floraNode);
}