UNPKG

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
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); }