node-red-contrib-broadlink-devices
Version:
Broadlink Node-RED control module
166 lines • 6.31 kB
JavaScript
;
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