Willkommen im Loxone Community Forum. Um alle Funktionen nutzen und sehen zu können, registriere dich bitte zuerst. Dies gilt auch für das herunterladen von Dateien.
Na, der Formelbaustein beherrscht doch alles, was Du brauchst. Das hat mit Loxone ja wenig zu tun sondern eher mit mathematischen Grundkenntnissen Der Formelbaustein kann ARCCOS und auch Quadratwurzel (SQRT). Der Rest sind doch nur Klammern.
Hallo Thomas,
da Du keine Angaben zum Medium machst, hoffe ich dass Du darin Wasser bevorraten willst. Wenn das aber zum Beispiel ein Tank zur Heizöllagerung sein sollte, brauchst Du dafür geignete Füllstands-Messeinrichtungen die für eine entsprehende Ex-Zulassung der Messeinrichtung.
Gruß Michael
Haustechnik UG: MS2, 7 Extensionen, WAGO 750er I/O-Module, 19"-Notbedienebene, EMA-Anlage ELT-Allgemein UG: MS1, 4 Extensionen Notbedienebene, RM+WM-Anlage, Mehrere Shellys Wohnung OG: MS1, 8 Extensionen, Notbedienebene, Mehrere Shellys Wohnung EG: konvent. E-Installation, Autarke EZR-Regelkreise (0-10V) für Stat.-HZG mit Aufschaltung (Schwellwert) des Heizkreises auf den Miniserver UG, Zeitsteuerung EG-Wohnung aus Miniserver UG). Mehrere Shellys LoxBerry-Nutzer: Stats4Lox, Testserver: 2xMS-GEN1
Hier mein eine etwas allgemeinere Art bei einer unförmige Zisterne die Füllmenge zu erfassen.
Das ganze hab ich zwar über KNX und NodRed am laufen, liefert am Ende aber die Daten dann auch in Loxone.
Auch wäre das relativ einfach als PicoC Code direkt in Loxone umzusetzen.
Code für die Umrechung von mA zu Liter (ist für eine NodeRed "function Node")
Für die Umrechnung nutze ich eine Ausliterungstabelle ( [ATTACH]n387628[/ATTACH] [ATTACH]n387628[/ATTACH] ) vom Zisternen Hersteller (Graf) in welcher er die Daten des Füllstands in Bezug zur Füllhöhe angibt. Die Zisterne ist extrem unförmig.
Für die Messpunkte zwischen den Tabellendaten wird einfach eine Gerade angenommen.
Da diese 7500 l Flachzisterne doch ziemlich unförmig ist war das zumindest eine sehr gangbarer Weg.
Ich kommen damit trotz der unförmigkeit der Zisterne auf eine Genauigkeit von ca. 10L (mit definierter Entnahme bei unterschiedlichen Ständen ausgelitert)
Code:
Code:
// cistern measurement table (got from manufacturer GRAF)
// data below are from a 7500l flat plastic cistern
//
// 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]
];
// 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 cistern where water
// can still be sourced. Below, pump can't reach the water
const percent_0_index = 2 // eg, 2 is 200mm
// Main starts here
var y;
var measured_mA = msg.payload; // get mA value from Sensor as input
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 - min_mA))).toFixed(0);
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 = (percent * (y - literingTable[2][1])).toFixed(0) * 1;
if (percent < 0){
percent = -1;
}
msg = { topic: "L", payload: y };
msg2 = { topic: "%", payload: percent };
return [msg, msg2];
Coole Lösung. Etwas einfacher wäre es vermutlich noch, sich im Excel die Ausgleichsgerade der Tabelle anzeigen zu lassen und dann einfach die entsprechende Formel der Ausgleichsgeraden zur Berechnung zu verwenden. Dann brauchst Du die komplizierte Interpolation nicht.
Ich habe das programmtechnisch sehr cool gelöste Beispiel von Labmaster noch einmal etwas einfacher mit Excel gelöst: Tabelle in Excel bringen und im Diagramm eine Trendlinie hinzufügen. In diesem Fall "Polynomisch 6. Grades" - damit legt sich die Trendlinie recht genau an die tatsächliche Gerade heran. Dann "Formel im Diagramm anzeigen".
Die erzeugte Geradengleichung kann man dann einfach in den Formelbaustein bringen und sich das Ergebnis anzeigen lassen. Damit spart man sich die komplizierte Interpolation, die ansonsten notwendig ist.
Nachteil: Etwas ungenauer je nach Komplexität der Zisternenform. In diesem Beispiel wird im oberen Bereich ein höherer Wert angezeigt. Nimmt man ein Polynom 5. Grades, ist der Wert leicht niedriger. Hier muss man einen Kompomiss finden.
Vorteil: Sehr einfache Umsetzung im Formelbaustein ohne PicoC.
Ich habe das programmtechnisch sehr cool gelöste Beispiel von Labmaster noch einmal etwas einfacher mit Excel gelöst: Tabelle in Excel bringen und im Diagramm eine Trendlinie hinzufügen. In diesem Fall "Polynomisch 6. Grades" - damit legt sich die Trendlinie recht genau an die tatsächliche Gerade heran. Dann "Formel im Diagramm anzeigen".
...
irgendwo hier im Forum gab es mal einen Thread dazu, weshalb ich es dann auch genauso so versucht habe, war aber mit der Zisternen Form einfach nicht gut hinzubekommen und die Polynome wurde immer länger und ungenauer.
Aus dem Grund ist es dann die programmtechnisch etwas aufwendigere Variante geworden.
Zuletzt geändert von Labmaster; 16.04.2023, 09:32.
Ja, ein Polynom ist dann immer ein Kompomiss. Wobei das Polynom oben in meiner Excel sehr genau ist - außer im volleren Bereich der Zysterne. Aber im mittleren Bereich (z. B. bei 600mm) ist es ziemlich gut. Wenn die einzelnen Punkte zu weit auseinander liegen, dann ist auch eine Interpolation wie bei Dir wieder ungenau. Es kommt also halt immer drauf an ;-) Aber wenn man kein NodeRed oder ein LoxBerry mit XL hat und das wirklich über PicoC machen müsste, würde ich das Polynom vorziehen. PicoC ist auf dem MS einfach zu fehleranfällig.
Hallo,
ich wollte die Lösung von Prof.Mobilux auch bei meiner Zisterne anwenden.
Dazu habe ich die Füllstandkurve des Herstellers im Excel nachgebaut, leider funktioniert die Berechnung mit der Trendlinie nicht - ersuche daher um Unterstützung was ich falsch gemacht habe
In Deiner Formel steht:
=-0,0004*C246+0,0974*C245-.. (in Zelle C246 und C245 steht aber nichts)
korrekt wäre:
=-0,0004*C24^6+0,0974*C24^5-..
Aber selbst wenn ich den Fehler korrigiere, lande ich nicht beim richtigen Ergebnis, da hat Excel anscheinend eine falsche Trendlinie berechnet. Ich habe noch einmal ein neues xy-Diagramm erstellt und dazu eine Trendlinie 4. Grades erstellt, das spuckt Excel dann wie folgt aus:
Hallo Michael,
danke für deine Mühe und Rückmeldung.
Ich habe das xy-Diagramm auch nochmals neu erstellt, die Trendlinie hinzugefügt und mir die Formel im Diagramm anzeigen lassen.
Dann kommt jedoch auch bei polynomisch Grad 4 dieser Wert y = 0,8227x4 - 28,68x3 + 300,67x2 - 517,56x + 269,98 und nicht deiner?
Keine Ahnung was ich da falsch mache - habe die beiden Screenshots angefügt.
Wenn ich mit deiner Formel rechne dann komme ich in den Bereich der Füllstandkurve +/-. Ideal wäre sicher polynomisch 6
Kannst Du mir bitte die Formel in mein Excel einarbeiten, dann sehe ich was ich falsch gemacht habe
Dein Diagramm ist ein Linien-Diagramm, wie da Excel die Trendlinie ausrechnet ist für mich unlogisch. Ich habe irgendwann für mich festgestellt, dass nur bei dem xy-Diagramm-Typ eine korrekte Formel von Excel ausgespuckt wird.
Ich habe jetzt mehrere Variante durchgespielt und mich zig mal vertippt ;-)
Ein Polynom 3. Grades sieht schon ganz gut aus - Excel-Formel = -B3^3*9*10^-7+B3^2*0,0024+1,272*B3
Mit Polynom 4. Grades wird es noch besser - Excel-Formel =B3^4*5*10^-10-B3^3*3*10^-6+B3^2*0,0051+0,1863*B3
Hier mal das Ergebnis plus die Abweichung zur Vorgabe:
Ergebnisse:
Bei Polynom 5. oder 6. Grades produziert Excel irgendwie Murks oder ich vertippe mich bei den 10er Potenzen. Der 4. Grad scheint mir aber von der Genauigkeit vollkommen ausreichend.
Excel rechnet schon richtig nur müssten die Werte in der Formel auf mehr Dezimalstellen erweitert werden.
Wenn man die Dezimalstellen Beispielsweise auf 30 erweitert kommt dann bei 6. Grad folgendes heraus:
Wir verarbeiten personenbezogene Daten über Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen, Werbung zu personalisieren und Websiteaktivitäten zu analysieren. Wir können bestimmte Informationen über unsere Nutzer mit unseren Werbe- und Analysepartnern teilen. Weitere Einzelheiten finden Sie in unserer Datenschutzrichtlinie.
Wenn Sie unten auf "Einverstanden" klicken, stimmen Sie unserer Datenschutzrichtlinie und unseren Datenverarbeitungs- und Cookie-Praktiken wie dort beschrieben zu. Sie erkennen außerdem an, dass dieses Forum möglicherweise außerhalb Ihres Landes gehostet wird und Sie der Erhebung, Speicherung und Verarbeitung Ihrer Daten in dem Land, in dem dieses Forum gehostet wird, zustimmen.
Kommentar