UNPKG

node-red-contrib-miflora

Version:
96 lines (89 loc) 4.93 kB
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); }