UNPKG

node-red-contrib-broadlink-devices

Version:

Broadlink Node-RED control module

166 lines 6.31 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const Bluebird = require("bluebird"); const broadlink_1 = require("broadlink"); module.exports = (RED) => { const client = new broadlink_1.Broadlink(); const devices = {}; client.on('deviceReady', (dev) => { if (!devices[dev.mac.toString('hex')]) { devices[dev.mac.toString('hex')] = dev; } }); client.discover(); // Poll for new clients every 5 seconds setInterval(() => { client.discover(); }, 5000); function discover(config) { RED.nodes.createNode(this, config); const node = this; node.on('input', (msg) => __awaiter(this, void 0, void 0, function* () { const list = []; for (const key of Object.keys(devices)) { list.push({ id: devices[key].mac.toString('hex'), type: devices[key].type, ip: devices[key].host.address, mac: devices[key].mac.toString('hex').match(/(.{1,2})/g).join(':'), }); } node.log(JSON.stringify(list)); msg.payload = list; node.send(msg); })); } function getState(config) { RED.nodes.createNode(this, config); const node = this; node.on('input', (msg) => __awaiter(this, void 0, void 0, function* () { if (!msg.req.params || !msg.req.params.deviceId) { msg.payload = { error: 'No device specified', }; msg.status = 400; return node.send(msg); } if (!devices[msg.req.params.deviceId]) { msg.payload = { error: 'Device not found', }; msg.status = 404; return node.send(msg); } const device = devices[msg.req.params.deviceId]; device.requestState(); try { const result = yield new Bluebird((resolve, reject) => { device .on('state', (data) => resolve(data)) .on('error', (err) => reject(err)); }); msg.payload = result; return node.send(msg); } catch (e) { msg.payload = { error: e.message, }; msg.status = 500; return node.send(msg); } })); } function setState(config) { RED.nodes.createNode(this, config); const node = this; node.on('input', (msg) => __awaiter(this, void 0, void 0, function* () { if (!msg.req.params || !msg.req.params.deviceId) { msg.payload = { error: 'No device specified', }; msg.status = 400; return node.send(msg); } if (!devices[msg.req.params.deviceId]) { msg.payload = { error: 'Device not found', }; msg.status = 404; return node.send(msg); } const device = devices[msg.req.params.deviceId]; device.setState(msg.payload); try { const result = yield new Bluebird((resolve, reject) => { device .on('state', (data) => resolve(data)) .on('error', (err) => reject(err)); }); msg.payload = result; return node.send(msg); } catch (e) { msg.payload = { error: e.message, }; msg.status = 500; return node.send(msg); } })); } function configuration(config) { RED.nodes.createNode(this, config); this.name = config.name; this.mapping = config.mapping; } function setConfig(n) { RED.nodes.createNode(this, n); const node = this; // Retrieve the config node const config = RED.nodes.getNode(n.config); node.on('input', (msg) => { if (!config) { msg.payload = { error: 'Device not found', }; msg.status = 404; return node.send(msg); } const mapping = JSON.parse(config.mapping); if (!mapping.devices[msg.req.params.deviceId]) { msg.payload = { error: 'Device not found', }; msg.status = 404; return node.send(msg); } msg.payload = mapping.devices[msg.req.params.deviceId]; return node.send(msg); }); } RED.nodes.registerType('broadlink-get-state', getState); RED.nodes.registerType('broadlink-set-state', setState); RED.nodes.registerType('broadlink-discover', discover); RED.nodes.registerType('broadlink-configuration', configuration); RED.nodes.registerType('broadlink-set-configuration', setConfig); RED.httpAdmin.get('/broadlink/discover', RED.auth.needsPermission('broadlink.read'), (req, res) => { const list = []; for (const key of Object.keys(devices)) { list.push({ id: devices[key].mac, type: devices[key].type, ip: devices[key].host.address, mac: devices[key].mac, }); } res.send(list); }); }; //# sourceMappingURL=index.js.map