node-red-contrib-broadlink-control
Version:
Node Red nodes to control the Broadlink RM devices and other Broadlink home automation nodes.
165 lines (154 loc) • 6.59 kB
JavaScript
var Device = require("./Device.js");
var constants = require('./Constants.js');
class RM extends Device {
constructor(host, mac, devType, timeout = 10) {
super(host, mac, devType, timeout);
this.on("payload", (err, payload) => {
if (constants.RM4.indexOf(devType) > -1) {
payload.copy(payload, 0, 2);
}
console.log("\x1b[31mBroadlink:\x1b[0m Data Received - Determining Type.");
console.log("\x1b[31mBroadlink:\x1b[0m BroadlinkData",payload);
var param = payload[0];
switch (param) {
case 1: //0x01
console.log("\x1b[31m\x1b[31mBroadlink:\x1b[0m\x1b[0m Temperature Data Received - Type 1 Converting and sending.");
var temp = (payload[0x4] * 10 + payload[0x5]) / 10.0;
this.emit("temperature", temp);
break;
case 2: //0x02
console.log("\x1b[31m\x1b[31mBroadlink:\x1b[0m\x1b[0m Success Data Received - Type 2 Data Successful.");
break;
case 3: //0x03
console.log("\x1b[31mBroadlink:\x1b[0m Data Received - Data Type 3 Unknown.");
////this.emit("temperature", payload);
break;
case 4: //0x04 get from check_data
console.log("\x1b[31mBroadlink:\x1b[0m Standard Data Received - Type 4 Converting and Sending.");
var data = Buffer.alloc(payload.length - 4, 0);
payload.copy(data, 0, 4);
this.emit("data", Array.prototype.slice.call(data, 0));
break;
case 25: //0x19 Scanning RF looking for remote signal lock
console.log("\x1b[31mBroadlink:\x1b[0m Data Received - Data Type 25 / 0x19 Waiting for RF Signal Lock from Remote.");
break;
case 26: //0x1a get from check_data
console.log("\x1b[31mBroadlink:\x1b[0m Data Received - Type 26 Converting and Sending.");
var data = Buffer.alloc(1, 0);
payload.copy(data, 0, 0x4);
console.log('payload', payload);
console.log('data', data);
if (data[0] !== 0x1) break;
console.log("\x1b[31mBroadlink:\x1b[0m Valid RF Signal Received - RF Signal Locked - Sending Notice to Proceed.");
this.emit("rawRFData", data);
break;
case 27: //0x1b get from check_data
console.log("\x1b[31mBroadlink:\x1b[0m Data Received - Type 27 Converting and Sending.");
var data = Buffer.alloc(1, 0);
payload.copy(data, 0, 0x4);
console.log('payload', payload);
console.log('data', data);
if (data[0] !== 0x1) break;
console.log("\x1b[31mBroadlink:\x1b[0m Valid RF Button Data Received - Sending RF Data.");
this.emit("rawRFData2", data);
break;
}
});
}
checkTemperature() {
var packet = Buffer.alloc(16, 0);
if (constants.RM4.indexOf(this.devType) > -1) {
packet[0] = 4;
packet[1] = 0;
packet[2] = 1;
} else {
packet[0] = 1;
}
this.sendPacket(0x6a, packet);
}
enterLearning() {
var packet = Buffer.alloc(16, 0);
if (constants.RM4.indexOf(this.devType) > -1) {
packet[0] = 4;
packet[1] = 0;
packet[2] = 3;
} else {
packet[0] = 3;
}
this.sendPacket(0x6a, packet);
}
checkData() {
var packet = Buffer.alloc(16, 0);
if (constants.RM4.indexOf(this.devType) > -1) {
packet[0] = 4;
packet[1] = 0;
packet[2] = 4;
} else {
packet[0] = 4;
}
this.sendPacket(0x6a, packet);
}
sendData(data) {
var packet;
if (constants.RM4.indexOf(this.devType) > -1) {
packet = Buffer.from([0xd0, 0x00, 0x02, 0x00, 0x00, 0x00]);
} else {
packet = Buffer.from([0x02, 0x00, 0x00, 0x00]);
}
packet = Buffer.concat([packet, data]);
this.sendPacket(0x6a, packet);
}
enterRFSweep() { // Step 1: Set the RM Unit to RF Learning and sweep through frequencies. User should hold down the remote button to learn
var packet = Buffer.alloc(16, 0);
if (constants.RM4.indexOf(this.devType) > -1) {
packet[0] = 4;
packet[1] = 0;
packet[2] = 0x19;
} else {
packet[0] = 0x19;
}
//packet[0] = 0x19;
console.log("\x1b[31mBroadlink:\x1b[0m RF Scan - Sending RF Sweep Command.");
this.sendPacket(0x6a, packet);
}
checkRFData() { // Step 2: Check every innterval to see if the frequency has been found.
var packet = Buffer.alloc(16, 0);
if (constants.RM4.indexOf(this.devType) > -1) {
packet[0] = 4;
packet[1] = 0;
packet[2] = 0x1a;
} else {
packet[0] = 0x1a;
}
//packet[0] = 0x1a;
console.log("\x1b[31mBroadlink:\x1b[0m RF Scan - Checking if RF Signal Detected.");
this.sendPacket(0x6a, packet);
}
checkRFData2() { // Step 3: Call the button data from the RF frequency found.
var packet = Buffer.alloc(16, 0);
if (constants.RM4.indexOf(this.devType) > -1) {
packet[0] = 4;
packet[1] = 0;
packet[2] = 0x1b;
} else {
packet[0] = 0x1b;
}
//packet[0] = 0x1b;
console.log("\x1b[31mBroadlink:\x1b[0m RF Scan - RF Signal Detected, capturing button data.");
this.sendPacket(0x6a, packet);
}
cancelRFSweep() {
var packet = Buffer.alloc(16, 0);
if (constants.RM4.indexOf(this.devType) > -1) {
packet[0] = 4;
packet[1] = 0;
packet[2] = 0x1e;
} else {
packet[0] = 0x1e;
}
//packet[0] = 0x1e;
console.log("\x1b[31mBroadlink:\x1b[0m RF Scan - Cancelling RF Sweep.");
this.sendPacket(0x6a, packet);
}
}
module.exports = RM;