Zitat von exxtreme
Beitrag anzeigen
array[2]
0: array[2]
0: object
menge: 5627
1: object
typ: "inhalt"
einheit: "liter"
quelle: "drucksensor"
ort: "zisterne"
1: array[2]
0: object
menge: 71
1: object
typ: "inhalt"
einheit: "prozent"
quelle: "drucksensor"
ort: "zisterne"
// zistern litering table (got from manufacturer GRAF)
// first column = fillheight in mm
// second column = liter
const literingTable = [
[0, 0],
[100, 368],
[200, 976],
[300, 1621],
[400, 2339],
[500, 3153],
[600, 3796],
[700, 4609],
[800, 5341],
[900, 6057],
[1000, 6731],
[1100, 7301],
[1200, 7515],
[1260, 7550]
];
//var msg;
var msg2;
var msg3;
var msg4;
// pressure Sensor parameters
const max_height = 2; // 2m
const max_mA = 20; // mA at max_height
const min_mA = 4; // mA at zero height
// index to table for lowest level in zistern where water
// can still be pumped. Below pump cant reach the water
const percent_0_index = 2 // eg, 2 is 976l
//const lowest_level_Tindex = 2;
// Main starts here
var y;
var measured_mA = msg.payload; // get mA value from Sensor as input
var measured_mA_mean;
measured_mA_mean = context.get('measured_mA_mean');
if (context.get('Startup') == 341487) {
context.set("Startup", 0)
measured_mA_mean = measured_mA;
}
measured_mA_mean = (measured_mA_mean * 2 + measured_mA) / 3;
context.set('measured_mA_mean', measured_mA_mean);
if (measured_mA < min_mA){
// if its below allowed range, then exit
node.warn("Error ! Input Value below 4mA")
return;
}
var high_mm = (max_height * 1000 / (max_mA - min_mA) * (measured_mA_mean - min_mA));
//var x = Math.round(high_mm);
var x = high_mm;
//search for fitting table area, getting index into table as i
for(var i = 0; i < literingTable.length; i++) {
if (literingTable[i][0] > x) break; // if "end entry" found, then exit
}
i = i - 1; // correct index to "start entry"
// check if index was inside table and not the last entry
if (i<literingTable.length-1){
// was inside table
// get values from table
var x1 = literingTable[i+0][0];
var y1 = literingTable[i+0][1];
var x2 = literingTable[i+1][0];
var y2 = literingTable[i+1][1];
// and calculate the value in between
y=(y1+((x-x1)/(x2-x1)*(y2-y1)));
}
else{
// was the last entry,
// so return last entry as fixe value from table
// no calcuation needed
y=literingTable[i+0][1]
}
// calculate percentage from table index 2 as 0% to last table index as 100%
var percent = 100 / (literingTable[literingTable.length-1][1] - literingTable[percent_0_index][1]);
percent = Math.round(((percent * (y - literingTable[percent_0_index][1])) * 1) * 1e0) / 1e0;
if (percent < 0){
percent = -1;
}
y = Math.round(y);
msg.payload = [
[ // first value
{ // influxdb2 fields
"menge": y
},
{ // influxdb2 tags
"typ": "inhalt",
"einheit": "liter",
"quelle": "drucksensor",
"ort": "zisterne"
}
],
[ // second value
{ // influxdb2 fields
"menge": percent
},
{ // influxdb2 tags
"typ": "inhalt",
"einheit": "prozent",
"quelle": "drucksensor",
"ort": "zisterne"
}
]
];
return [msg];
// Der Code hier wird ausgeführt,
// wenn der Node gestartet wird
if (context.get("Startup") === undefined) {
context.set("Startup", 341487)
}
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.


Einen Kommentar schreiben: