NEWS
Fehler beim Auslesen
-
//createState('Oelstand', 0); var Hoehe = 'hm-rpc.1.LEQ02XXXXX.21.VALUE'; //Fuellhoehe des Oeltanks var Dichte = 0.84; var Flaeche = 4; on (Hoehe, function (dp) { var Oelstand = dp.state.val * Flaeche; setState('Oelstand', Oelstand); log('Ölstand: ' + Oelstand); log('Höhe: ' + dp.state.val); });
-
Funktioniert! Vielen Dank.
Wenn ich einmal dabei bin. Hat jemand schon mal eine Mittelwertbildung geschrieben?
Also addiere x Werte, und teile das Ergebnis durch x?
Gruß
Thomas
P.S. Kann mir einer erklären warum mein Weg falsch und der von Paul richtig war?
Vielleicht versteh ich dann irgendwann was ich da eigentlich programmiere :-D.
-
@Mr. Burns:Hat jemand schon mal eine Mittelwertbildung geschrieben? `
Ja, für http://www.iobroker.net/?page_id=3670&lang=de.
@Mr. Burns:Kann mir einer erklären warum mein Weg falsch und der von Paul richtig war? `
setState('Oelstand', getState(Hoehe).val * getState(Flaeche).val);
getState(id) kann nur auf einen Datenpunkt angewendet werden, nicht auf eine Skriptvariable (Flaeche).
log(Oelstand); log(Hoehe);
Die Skriptvariable Oelstand wird nicht aktualisiert, sondern enthält ihren Initialisierungswert.
Die Skriptvariable Hoehe enthält den ID-String des Datenpunktes, nicht den Wert.
-
Danke für deine Erklärung. So ganz verstanden hab ich es nicht, aber dafür fehlen mir wahrscheinlich die Grundlagen.
Das die Scriptvariable nicht gelesen werden muss bevor ich sie weiterverarbeite versteh ich noch…ist ja schon da. Aber weshalb kann ich das einlesen des Datenpunktes überspringen...
Dein Script zur Mittelwertbildung hatte ich zwischenzeitlich auch gefunden...ist aber zu hoch für mich. Ich benötige eine feste Anzahl von werten (z.B 10 o. 20) welche gemittelt werden sollen. Da meine Werte nicht zeitabhängig gelesen Werten, sondern auf Änderung getriggert sind müßte ich das Script umschreiben...Ich werd mal den langen Weg mit zwischenvariablen versuchen und gucken wie weit ich komme.
Danke für die Hilfe!
Thomas
-
@Mr. Burns:Aber weshalb kann ich das einlesen des Datenpunktes überspringen… `
Welchen Datenpunkt meinst Du ? Wo wird etwas übersprungen ? -
Hi,
Der Datenpunkt:
var Hoehe = 'hm-rpc.1.LEQ02XXXXX.21.VALUE'; //Fuellhoehe des Oeltanks
muss der nicht eingelesen werden bevor dieser weiterverarbeitet werden kann…getState?
Hab mir die Geschichte mit dem Mittelwert noch mal angesehen.
Wenn ich Zeitvariable (n, über T oder tc wegen der umwandlung in Ganzzahlen) durch einen festen wert ersetze und den intervall Trigger durch einen ON Trigger ersetze müsste es doch eigentlich funktionieren oder...? Ich bin beruflich unterwegs und kann nicht so gut testen (VPN geht nicht überall)...
Gruß
Thomas
-
@Mr. Burns:…muss der nicht eingelesen werden bevor dieser weiterverarbeitet werden kann...getState? `
on(id, function(mein_Datenpunkt) {...callback-Funktion...});
übergibt ebenfalls den Zustand (state) des Datenpunktes an das Objekt (hier: mein_Datenpunkt), das in der callback-Funktion ausgewertet werden kann.
mein_Datenpunkt.state.val
innerhalb der callback-Funktion entspricht
getState(id).val
an beliebiger Stelle des Skripts. getState(id).val verursacht aber eine höhere CPU-Belastung, da (im Prinzip) ein zusätzlicher Datenbankzugriff erfolgt.
-
Ich möchte mich sehr für die Hilfe bedanken und das Thema hiermit abschließen.
Das auslesen umrechnen und die Mittelwertbildung des Öltanks über eine Pneumatische Füllstandsmessung…funktioniert.
`// Oelstand errechnen und gleitenden Mittelwert von "x" werten bilden // Konstanten var T = 100; // Anzahl der Werte var Dichte = 0.84; // Heizöldichte var Flaeche = 4; // Fläche des Öltanks (bei einer Rechteckigigen oder Zylindrischen Form) in m2 // IDs aller benötigten Datenpunkte var Hoehe = 'hm-rpc.1.LEQ02XXXXX.21.VALUE'; var average = 'vis.Keller.Oelstand'; var listid = 'vis.Keller.Oelstand-Liste'; var n = Math.round(T); // Anzahl der Werte var list = new Array(n); function calc() { list.pop(); var x = getState(Hoehe).val * Flaeche / Dichte; list.unshift(x); setState(listid, list.toString()); var sum = 0.0; for (var i = 0; i < n; i++) { var s = parseFloat(list[i]); sum = sum + s; } setState(average, parseFloat((sum / n).toFixed(1))); //log (n); } // Script start: Liste aus String-Datenpunkt einlesen var slist = getState(listid).val; if (slist) { list = slist.split(","); } else { // 1\. Script start: Liste und String-Datenpunkt füllen var x = getState(Hoehe).val * Flaeche / Dichte; for (var i = 0; i < n; i++) list[i] = x; calc(); } // Triggert die Funktion bei Änderung der Eingangsgröße on (Hoehe, function (dp) { calc(); });`[/i][/i]
-
@Mr. Burns:Ich möchte mich sehr für die Hilfe bedanken und das Thema hiermit abschließen.
Das auslesen umrechnen und die Mittelwertbildung des Öltanks über eine Pneumatische Füllstandsmessung…funktioniert.
`// Oelstand errechnen und gleitenden Mittelwert von "x" werten bilden // Konstanten var T = 100; // Anzahl der Werte var Dichte = 0.84; // Heizöldichte var Flaeche = 4; // Fläche des Öltanks (bei einer Rechteckigigen oder Zylindrischen Form) in m2 // IDs aller benötigten Datenpunkte var Hoehe = 'hm-rpc.1.LEQ02XXXXX.21.VALUE'; var average = 'vis.Keller.Oelstand'; var listid = 'vis.Keller.Oelstand-Liste'; var n = Math.round(T); // Anzahl der Werte var list = new Array(n); function calc() { list.pop(); var x = getState(Hoehe).val * Flaeche / Dichte; list.unshift(x); setState(listid, list.toString()); var sum = 0.0; for (var i = 0; i < n; i++) { var s = parseFloat(list[i]); sum = sum + s; } setState(average, parseFloat((sum / n).toFixed(1))); //log (n); } // Script start: Liste aus String-Datenpunkt einlesen var slist = getState(listid).val; if (slist) { list = slist.split(","); } else { // 1\. Script start: Liste und String-Datenpunkt füllen var x = getState(Hoehe).val * Flaeche / Dichte; for (var i = 0; i < n; i++) list[i] = x; calc(); } // Triggert die Funktion bei Änderung der Eingangsgröße on (Hoehe, function (dp) { calc(); });` Hi, was hast du da im Einsatz (Hardware zum Füllstand anzeigen) ? würde mich auch interessier das zu realisieren. Danke lg Tom[/i][/i] ``` `
-
Hi,
Einen Drucktransmitter 4..20mA, einen Wandler von 4..20mA auf 0..10V, Eingang auf das 12/14 Modul.
Ich hab ein Röhrchen, welches bis zum Tankboden geht. Oben ist ein T-Stück, an welchem der Drucktransmitter sitzt. auf dem anderem Anschluss des T-Stücks ist eine Membranpumpe (alte Aquarium Luftpumpe) und ein Nadelventil. Nach der Einperlmethode messe ich den Druck am Boden des Tanks.
Mittlerweile messe ich aber direkt über eine SPS und übergebe den Wert an den ioBroker.
Parallel messe ich noch den Durchfluss über ein Braun Ölzähler, auch an direkt an der SPS…
Gruß
Thomas