Files
diffuser/diffuser.js
2026-03-12 15:20:34 +00:00

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