node-red-contrib-miio-localdevices
Version:
Node for Node-Red to control Mi Devices locally via node-mihome (Humidifiers, Air Purifiers, Heaters, Fans, Vacuums, Lights - list of devices to be enlarged). See latest updates in documentation.
90 lines (80 loc) • 3.41 kB
JavaScript
const EventEmitter = require('events');
const mihome = require('node-mihome');
module.exports = function(RED) {
function MIIOsendcommandNode(config) {
RED.nodes.createNode(this,config);
var node = this;
node.config = config;
node.MIdevice = RED.nodes.getNode(config.devices);
node.status({}); //cleaning status
node.on('input', function(msg) {
node.status({fill:"gray",shape:"dot",text:"Connecting..."});
// 1) initialization of local MIIO Protocol
mihome.miioProtocol.init();
// 2) working with current device
if (node.MIdevice) {
// 2.1) defining outgoing msg structure
msg.name = node.MIdevice.name + " - " + node.MIdevice.room;
msg.address = node.MIdevice.address;
msg.model = node.MIdevice.model;
// 2.2) sending Single and JSON commands separately
if (node.config.command == "Custom") {
SendCustomJsonCMD ();
} else {
SendSingleCMD ();
};
};
// functions in USE:
// A) For single command
function SendSingleCMD () {
// A.1) sending data to config-node
SingleCMD = node.config.command;
SinglePayload = msg.payload;
node.MIdevice.emit('onSingleCommand', SingleCMD, SinglePayload);
// A.2) starting msg and status
node.status({fill:"green",shape:"dot",text:"Command: sent"});
msg.payload = {[SingleCMD]: SinglePayload};
node.send(msg);
// A.3) check for not multiplying error warns
ErrorSingleCMDRepeatCheck = 0;
// A.4) getting errors from config-node + sending them only once
node.MIdevice.on('onSingleCMDSentError', (SingleCMDErrorMsg, SingleCMDErrorCube) => {
if (SingleCMDErrorCube === node.config.command && ErrorSingleCMDRepeatCheck == 0) {
node.warn(`Mihome Exception. IP: ${node.MIdevice.address} -> ${SingleCMDErrorMsg}`);
node.status({fill:"red",shape:"ring",text:"Command: error"});
ErrorSingleCMDRepeatCheck++;
};
});
// A.5) cleaning status after 5 sec timeout
setTimeout(() => {
node.status({});
}, 5000);
};
// B) For CustomJSON command
function SendCustomJsonCMD () {
// B.1) sending data to config-node
CustomJsonCMD = msg.payload;
node.MIdevice.emit('onJsonCommand', CustomJsonCMD);
// B.2) starting msg and status
node.status({fill:"green",shape:"dot",text:"Command: sent"});
msg.payload = CustomJsonCMD;
node.send(msg);
// B.3) check for not multiplying error warns
ErrorJsonCMDRepeatCheck = 0;
// B.4) getting errors from config-node + sending them only once
node.MIdevice.on('onJsonCMDSentError', (JsonCMDErrorMsg, JsonCMDErrorCube) => {
if (JsonCMDErrorCube === node.config.command && ErrorJsonCMDRepeatCheck == 0) {
node.warn(`Mihome Exception. IP: ${node.MIdevice.address} -> ${JsonCMDErrorMsg}`);
node.status({fill:"red",shape:"ring",text:"Command: error"});
ErrorJsonCMDRepeatCheck++;
};
});
// B.5) cleaning status after 15 sec timeout
setTimeout(() => {
node.status({});
}, 15000);
};
});
};
RED.nodes.registerType("MIIOsendcommand",MIIOsendcommandNode);
}