node-red-contrib-ecm1240
Version:
A node that receives input from a TCP node that is receiving data from a serial2Wifi communication being sent by a Brultech ECM1240 Energy Monitor.
158 lines (156 loc) • 6.75 kB
JavaScript
module.exports = function(RED) {
function ecm1240Node(config) {
RED.nodes.createNode(this,config);
var node = this;
node.on('input', function(msg) {
var myJSON = {};
var valHex = msg.payload.toString('hex');
//*****AC Volts*****
myJSON["AC_Volts"] = parseInt(valHex.substring(6,10),16)/10;
//*****Calculate Delta Seconds*****
LSB = valHex.substring(74,76);
myTmp1 = valHex.substring(76,78);
MSB = valHex.substring(78,80);
myHex = MSB + myTmp1 + LSB;
SecCntr = parseInt(myHex,16);
if ( isNaN(node.last_SecCntr)) {deltaSeconds = 0;}
else{deltaSeconds = SecCntr - node.last_SecCntr;}
myJSON["a_SecCntr"] = deltaSeconds;
//*****Calculate Delta channel 1 Watts*****
LSB = valHex.substring(10,12);
myTmp1 = valHex.substring(12,14);
myTmp2 = valHex.substring(14,16);
myTmp3 = valHex.substring(16,18);
MSB = valHex.substring(18,20);
myHex = MSB + myTmp3 + myTmp2 + myTmp1 + LSB;
CH1Abs_WS = parseInt(myHex,16);
if ( isNaN(node.last_CH1Abs_WS)) {CH1Abs_Watts = 0;}
else{CH1Abs_Watts = (CH1Abs_WS - node.last_CH1Abs_WS) / deltaSeconds;}
myJSON["b_CH1Abs_Watts"] = Math.round(CH1Abs_Watts);
myJSON["c_CH1Abs_wh"] = Math.round(CH1Abs_WS / 3600);
//*****Calculate Delta Channel 2 Watts*****
LSB = valHex.substring(20,22);
myTmp1 = valHex.substring(22,24);
myTmp2 = valHex.substring(24,26);
myTmp3 = valHex.substring(26,28);
MSB = valHex.substring(28,30);
myHex = MSB + myTmp3 + myTmp2 + myTmp1 + LSB;
CH2Abs_WS = parseInt(myHex,16);
if ( isNaN(node.last_CH2Abs_WS)) {CH2Abs_Watts = 0;}
else{CH2Abs_Watts = (CH2Abs_WS - node.last_CH2Abs_WS) / deltaSeconds;}
myJSON["d_CH2Abs_Watts"] = Math.round(CH2Abs_Watts);
myJSON["e_CH2Abs_wh"] = Math.round(CH2Abs_WS / 3600);
//*****Calculate Delta Power Channel 1
LSB = valHex.substring(30,32);
myTmp1 = valHex.substring(32,34);
myTmp2 = valHex.substring(34,36);
myTmp3 = valHex.substring(36,38);
MSB = valHex.substring(38,40);
myHex = MSB + myTmp3 + myTmp2 + myTmp1 + LSB;
CH1Pol_WS = parseInt(myHex,16);
if ( isNaN(node.last_CH1Pol_WS)) {CH1Pol_Watts = 0;}
else{CH1Pol_Watts = (CH1Pol_WS - node.last_CH1Pol_WS) / deltaSeconds;}
myJSON["f_CH1Pol_Watts"] = Math.round(CH1Pol_Watts);
myJSON["g_CH1Pol_wh"] = Math.round(CH1Pol_WS / 3600);
//*****Calculate Delta Power Channel 2
LSB = valHex.substring(40,42);
myTmp1 = valHex.substring(42,44);
myTmp2 = valHex.substring(44,46);
myTmp3 = valHex.substring(46,48);
MSB = valHex.substring(48,50);
myHex = MSB + myTmp3 + myTmp2 + myTmp1 + LSB;
CH2Pol_WS = parseInt(myHex,16);
if ( isNaN(node.last_CH2Pol_WS)) {CH2Pol_Watts = 0;}
else{CH2Pol_Watts = (CH2Pol_WS - node.last_CH2Pol_WS) / deltaSeconds;}
myJSON["h_CH2Pol_Watts"] = Math.round(CH2Pol_Watts);
myJSON["i_CH2Pol_wh"] = Math.round(CH2Pol_WS / 3600);
//*****Channel 1 Amperes*****
LSB = valHex.substring(66,68);
MSB = valHex.substring(68,70);
myHex = MSB + LSB;
myJSON["j_CH1_Amps"] = parseInt(myHex,16)/100;
//*****Channel 2 Amperes******
LSB = valHex.substring(70,72);
MSB = valHex.substring(72,74);
myHex = MSB + LSB;
myJSON["k_CH2_Amps"] = parseInt(myHex,16)/100;
//***** Aux1 Watts*****
LSB = valHex.substring(80,82);
myTmp1 = valHex.substring(82,84);
myTmp2 = valHex.substring(84,86);
MSB = valHex.substring(86,88);
myHex = MSB + myTmp2 + myTmp1 + LSB;
Aux1_WS = parseInt(myHex,16);
if ( isNaN(node.last_Aux1_WS)) {Aux1_Watts = 0;}
else{Aux1_Watts = (Aux1_WS - node.last_Aux1_WS) / deltaSeconds;}
myJSON["l_Aux1_Watts"] = Math.round(Aux1_Watts);
myJSON["m_Aux1_wh"] = Math.round(Aux1_WS / 3600);
//***** Aux2 Watts*****
LSB = valHex.substring(88,90);
myTmp1 = valHex.substring(90,92);
myTmp2 = valHex.substring(92,94);
MSB = valHex.substring(94,96);
myHex = MSB + myTmp2 + myTmp1 + LSB;
Aux2_WS = parseInt(myHex,16);
if ( isNaN(node.last_Aux2_WS)) {Aux2_Watts = 0;}
else{Aux2_Watts = (Aux2_WS - node.last_Aux2_WS) / deltaSeconds;}
myJSON["n_Aux2_Watts"] = Math.round(Aux2_Watts);
myJSON["o_Aux2_wh"] = Math.round(Aux2_WS / 3600);
//***** Aux3 Watts*****
LSB = valHex.substring(96,98);
myTmp1 = valHex.substring(98,100);
myTmp2 = valHex.substring(100,102);
MSB = valHex.substring(102,104);
myHex = MSB + myTmp2 + myTmp1 + LSB;
Aux3_WS = parseInt(myHex,16);
if ( isNaN(node.last_Aux3_WS)) {Aux3_Watts = 0;}
else{Aux3_Watts = (Aux3_WS - node.last_Aux3_WS) / deltaSeconds;}
myJSON["p_Aux3_Watts"] = Math.round(Aux3_Watts);
myJSON["q_Aux3_wh"] = Math.round(Aux3_WS / 3600);
//***** Aux4 Watts*****
LSB = valHex.substring(104,106);
myTmp1 = valHex.substring(106,108);
myTmp2 = valHex.substring(108,110);
MSB = valHex.substring(110,112);
myHex = MSB + myTmp2 + myTmp1 + LSB;
Aux4_WS = parseInt(myHex,16);
if ( isNaN(node.last_Aux4_WS)) {Aux4_Watts = 0;}
else{Aux4_Watts = (Aux4_WS - node.last_Aux4_WS) / deltaSeconds;}
myJSON["r_Aux4_Watts"] = Math.round(Aux4_Watts);
myJSON["s_Aux4_wh"] = Math.round(Aux4_WS / 3600);
//***** Aux 5 Watts*****
LSB = valHex.substring(112,114);
myTmp1 = valHex.substring(114,116);
myTmp2 = valHex.substring(116,118);
MSB = valHex.substring(118,120);
myHex = MSB + myTmp2 + myTmp1 + LSB;
Aux5_WS = parseInt(myHex,16);
if ( isNaN(node.last_Aux5_WS)) {Aux5_Watts = 0;}
else{Aux5_Watts = (Aux5_WS - node.last_Aux5_WS) / deltaSeconds;}
myJSON["t_Aux5_Watts"] = Math.round(Aux5_Watts);
myJSON["u_Aux5_wh"] = Math.round(Aux5_WS / 3600);
//*****DC_Input*****
LSB = valHex.substring(120,122);
MSB = valHex.substring(122,124);
myHex = MSB + LSB;
myJSON["v_qDCInput"] = parseInt(myHex,16);
//*****Brultech ECM1240 Unit Identification*****
myJSON["w_ecm1240_Unit_ID"] = parseInt(valHex.substring(64,66),16);
//*****Brultech ECM1240 Serial Number*****
myJSON["x_SerialNumber"] = parseInt(valHex.substring(58,62),16);
msg.payload = myJSON;
node.send(msg);
node.last_SecCntr = SecCntr;
node.last_CH1Abs_WS = CH1Abs_WS;
node.last_CH2Abs_WS = CH2Abs_WS;
node.last_CH1Pol_WS = CH1Pol_WS;
node.last_CH2Pol_WS = CH2Pol_WS;
node.last_Aux1_WS = Aux1_WS
node.last_Aux2_WS = Aux2_WS;
node.last_Aux3_WS = Aux3_WS;
node.last_Aux4_WS = Aux4_WS;
node.last_Aux5_WS = Aux5_WS;
});
}
RED.nodes.registerType("ecm1240",ecm1240Node);
}