module.exports = function (RED) { function diffuser(config) { //create node RED.nodes.createNode(this, config); //call this => node so whenver you want to call a node function type node and the function behind it var node = this; //fetch class var Diffuser = require("./dependencies/diffuser_class"); //make new class on creation to work with. var diffuser = new Diffuser(); //fetch name from node into the measurement code diffuser.name = config.name; diffuser.number = config.number; diffuser.id = diffuser.name+diffuser.number; diffuser.i_n_elements = config.i_elements; diffuser.i_diff_density = Number(config.i_diff_density); diffuser.i_m_water = config.i_m_water; // create internal vars this.interval_id = null; let internalTickRate = 1; function update_node_state() { //alarm has prio over warning so comes first in the if else statement if (diffuser.alarm.state == true) { //display status node.status({ fill: "red", shape: "dot", text: diffuser.alarm.text[0] }); } else if(diffuser.warning.state == true ){ //display status node.status({ fill: "yellow", shape: "dot", text: diffuser.warning.text[0] }); } else if(diffuser.idle == true){ node.status({ fill: "gray", shape: "dot", text: diffuser.o_kgo2_h + " Kg o2 / h"}); } else{ node.status({fill: "green", shape: "dot", text: diffuser.o_kgo2_h + " Kg o2 / h"}); } } //update on creation update_node_state(); function send_output(){ //define empty msgs let msgs = []; let dynList = { iPressure: diffuser.i_pressure, iMWater: diffuser.i_m_water, iFlow: diffuser.i_flow, nFlow: diffuser.n_flow, oOtr: diffuser.o_otr, oPLoss: diffuser.o_p_total, oKgo2H: diffuser.o_kgo2_h, oFlowElement: diffuser.o_flow_element, efficiency: diffuser.o_combined_eff, //threshold: diffuser.threshold //EXPERIMENTAL! } let specList = { name: diffuser.name, number: diffuser.number, //supplier: diffuser.supplier, //type: diffuser.type, density: diffuser.i_diff_density, nElements: diffuser.i_n_elements, alfaF: diffuser.i_alfa_factor } msgs[0] = {topic: "kgo2/h" , payload: {kgo2h: diffuser.o_kgo2_h , tot_p_loss : diffuser.o_p_total} ,id: diffuser.id }; msgs[1] = {topic: "object", payload : diffuser}; msgs[2] = { topic:"outputdbase", payload:[ { measurement: diffuser.name+diffuser.number, fields : dynList, tags: { group: "values", }, timestamp: new Date() }, { measurement: diffuser.name+diffuser.number, fields : specList, tags: { group: "specs", }, timestamp: new Date() }, ] } // output to broker //send outputs node.send(msgs); } //never ending functions function tick(){ update_node_state(); send_output(); } // register child on first output this timeout is needed because of node - red stuff setTimeout( () => { /*---execute code on first start----*/ let msgs = []; msgs[3] = { topic : "registerChild" , payload: diffuser }; //send msg this.send(msgs); }, 100 ); //declare refresh interval internal node setTimeout( () => { /*---execute code on first start----*/ this.interval_id = setInterval(function(){ tick() },(internalTickRate * 1000)) }, 1000 ); //-------------------------------------------------------------------->>what to do on input node.on("input", function (msg,send,done) { //change density of diffusers if(msg.topic == "density"){ diffuser.i_diff_density = Number(msg.payload); } //change input flow if(msg.topic == "air_flow"){ diffuser.i_flow = Number(msg.payload); } //change water height if(msg.topic == "height_water"){ diffuser.i_m_water = Number(msg.payload); } done(); }); // tidy up any async code here - shutdown connections and so on. node.on('close', function() { clearTimeout(this.interval_id); }); } RED.nodes.registerType("diffuser", diffuser); };