162 lines
4.8 KiB
JavaScript
162 lines
4.8 KiB
JavaScript
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);
|
|
}; |