Seite 1 von 6

[V4.0 IP5] Wie kann man den Taupunkt in einer Custom-Logik berechnen?

Verfasst: Mo Dez 25, 2023 11:14 pm
von hans4711
Hallo Zusammen,

ich arbeite mich gerade in die Custom Logiken ein. Ich müsste aus Temp und Feuchte den Taupunkt berechnen.
Das habe ich in NodeRed folgendermaßen gelöst:

Code: Alles auswählen

var msg1 = Number(msg.temp);
var msg3 = Number(msg.humidity);

var sdd = 0;
var dd = 0;
var eln = 0;
var td = 0;

if (msg1 >= 0)
{
 sdd = 6.1078*Math.pow(10,((7.5*msg1)/(237.3 + msg1)));
 dd = msg3/100.0*sdd;
 eln = Math.log10(dd/6.1078);
 td = 237.3*eln/(7.5 - eln);
}
else
{
 sdd = 6.1078*Math.pow(10,((7.6*msg1)/(240.7 + msg1)));
 dd = msg3/100.0*sdd;
 eln = Math.log10(dd/6.1078);
 td = 240.7*eln/(7.6 - eln);
    
}
return {payload :  (Math.round(100*td))/100};
Ich stehe da aber mit den Logiken jetzt voll auf dem Schlauch, hat jemand eine Idee wie ich das umsetzen kann? Mit der Freien Formel komme ich da wohl nicht weit?

Vielen Dank und viele Grüße,
Hans

Moderation: Die abschließend gebrauchsfertige Lösung ist im Post 28 dieses Threads zu finden! :handgestures-thumbupright:

Und in Post 37 gibt es jetzt noch ein Update was auch die Berechnung der absoluten Luftfeuchtigkeit enthält. :handgestures-thumbupright: :handgestures-thumbupright:

Edit 31.7.2024: Aktuelle Version in Post 59.

Re: [V4 IP5] Taupunkt berechnen

Verfasst: Di Dez 26, 2023 1:21 am
von thtrp
Hallo Hans,

ich bin jetzt zwar nicht der Experte was Logiken angeht, sprich andere werden ggf. "smarte" Lösungen finden, während mein Ansatz wohl gerade eher unter BruteForce fallen dürfte, aber über eine Verkettung von freien Formeln sollte es gehen:
  1. Festlegung der Paramter a und b anhand der Temperatur
  2. Sättigungsdampfdruck als freie Formel mit drei Eingangsvariablen (a, b, Temperatur(bei dir msg1))
  3. Dampfdruck als freie Formel mit zwei Eingangsvariablen (relative Luftfeuchte, Ergebnis von Formel 2)
...
Ich denke die Idee ist klar. Jede der vier Formeln wird damit eine eigene Logik mit freier Formel, deren Ergebnis in einer weiteren Formel verwendet werden kann. Ich würde auch die einzelnen Formeln nutzen und nicht versuchen alles ein eine einzusetzen. Das ergibt zwar mehr Logiken, aber die würde ich einer Monsterberechnung vorziehen. Über das Eingangsverhalten kannst du ja auch definieren, dass die jeweilige Formel durch ein Update der gewünschten Eingangswerte getriggert wird.

Die Potenz in einer freien Formel bekommst du mit BASIS^EXPONENT, den Logarithmus zur Basis 10 bekommst du mit log10.

Wie gesagt, ggf. geht es eleganter, aber so sollte es auch klappen.

Re: [V4 IP5] Taupunkt berechnen

Verfasst: Di Dez 26, 2023 8:33 am
von gbglace
Ja man kann das in 4 einzelnen Logiken abhandeln und dann diese im Editor verketten oder alle in eine custom Logik bauen, was dann jeweils Inputs und Outputs generiert. Einige Outputs sind dann zwar nur interne Zwischenergebnisse, das ist aber nicht weiter tragisch. Und dann sind es genau die benötigten Anzahl Module freie Formel.

Ich würde als Fan der freien Formel aber noch zwei weitere für das IF und Festlegung der Faktoren 240.6 und 7.6 bauen und diese dann als Variable verwenden, dann sind die vier eigentlichen Formeln identisch.

Re: [V4 IP5] Taupunkt berechnen

Verfasst: Di Dez 26, 2023 9:23 am
von hans4711
Da ich die Custom Logik reinkommen will, möchte ich es gerne kpl. In einer machen. Was ich noch nicht kapiert habe ist das if else mit der freien formel. Als beispiel ist als if/else wert eine Zahl benannt, ich müsste hier aber dann in die nächste logik wechseln. Kann ich da statt der angabe des Wertes einfach weiter verschachteln?

Re: [V4 IP5] Taupunkt berechnen

Verfasst: Di Dez 26, 2023 9:28 am
von Robert_Mini
Hallo Hans!

Ich würde nicht in der freien Formel mit if verschachteln.
Das kannst du mit dem Multiplexer direkt in der CustomLogik:

Einfach Comperator für >= oder < 0 und mit dem Ergebnis den Multiplexer umschalten (mit 2x freier Formel als Eingang).

Edit: Erklärungen zu den Formeln hab ich hier gefunden:
https://www.wetterochs.de/wetter/feucht ... *%20SDD(T)

Lg
Robert

Re: [V4 IP5] Taupunkt berechnen

Verfasst: Di Dez 26, 2023 1:53 pm
von Sunshinemaker
Moin, Eigentlich ganz einfach das Ganze 8-)

Berechnung des Sättigungsdampfdruckes ins hPa: 6.112*(exp((17.62*X1)/(243.12+X1))) // X1=Temperatur in °C
Berechnung des Tatsächlichen Dampfdruckes in hPa:X2/100*X1 // X1=relative Luftfeuchtigkeit in // % X2=Sättigungsdampfdruck in hPa
Berechnung des Taupinktes in °C: 235*ln(X1/6.11)/(17.1-ln(X1/6.11)) //X1= tätsächlier Dampfdruck in hPa

Ich hab das ganze in 3 Logischen aufgeteilt, zum einen weil ich die Werte noch für andere Formeln nutze und zum anderen weil es andere Leute hier gibt die sich Customlogik VIEL besser auskennen.

Re: [V4 IP5] Taupunkt berechnen

Verfasst: Di Dez 26, 2023 7:03 pm
von hans4711
Ich habe aktuell 2 Probleme:
1. Stimmt das so mit den Formeln?

Code: Alles auswählen

       //sdd = 6.1078*Math.pow(10,((7.5*msg1)/(237.3 + msg1)));
      ["$formel1","string","6.1078*(10^(7.5*$temp)/(237.3 + &temp))"],
            //dd = msg3/100.0*sdd;
      ["$formel2","string","$luft/100*$sdd"],
            //eln = Math.log10(dd/6.1078);
      ["$formel3","string","log10($dd/6.1078"],
            //td = 237.3*eln/(7.5 - eln);
      ["$formel4","string","237.3*$eln/(7.5-$eln"],

2. Ich kapiere das mit dem Verschachteln, dem Comperator und dem Multiplexer nicht

Code: Alles auswählen

{
  "_Meta": { // Optional
    "Description": "",
    "Version": "1.00",
    "Icon": "" // format: "data:image/svg+xml;base64,ENCODED_FILE"
  },
  "Input": [
      ["Temperatur","Temperatur","$temp","c" ],
      ["Luftfeuchte","Luftfeuchte","$luft","c" ]
  ],
  "Output": [
      ["Taupunkttemperatur","Taupunkttemperatur","$taupunkt","a"]
  ],
  "Level": [
      ["$Schwellwert","float",0],
      ["$Schwellwertueberschritten","float",0],
      ["$temp", "float", 0],
      ["$luft", "float", 0],
      ["$taupunkt", "float", 0],
      ["$Ausgang", "float", 0],
      
      ["$sdd","float",0],
      ["$dd","float",0],
      ["$eln","float",0],
      ["$td","float",0],
      ["$6.1078","float",6.1078],
      ["$237.5","float",237.3],
            //sdd = 6.1078*Math.pow(10,((7.5*msg1)/(237.3 + msg1)));
      ["$formel1","string","6.1078*(10^(7.5*$temp)/(237.3 + &temp))"],
            //dd = msg3/100.0*sdd;
      ["$formel2","string","$luft/100*$sdd"],
            //eln = Math.log10(dd/6.1078);
      ["$formel3","string","log10($dd/6.1078"],
            //td = 237.3*eln/(7.5 - eln);
      ["$formel4","string","237.3*$eln/(7.5-$eln"],
                  
            //sdd = 6.1078*Math.pow(10,((7.6*msg1)/(240.7 + msg1)));
      ["$formel5","string","6.1078*(10^(7.6*$temp)/(240.7 + &temp))"],
            //dd = msg3/100.0*sdd;
      ["$formel6","string","$luft/100*$sdd"],
            //eln = Math.log10(dd/6.1078);
      ["$formel7","string","log10($dd/6.1078"],
            //td = 240.7*eln/(7.6 - eln);
      ["$formel8","string","240.7*$eln/(7.6-$eln"]
      
  ],
  "Module": [
      // 
     ["Comparator" , "$temp" , "$Schwellwertueberschritten" , "$Schwellwert"],
     ["Multiplexer", ["//Hier müsste ja dann irgendwie die ganzen Formeln rein???"],"$Ausgang", "$Schwellwert"],
      // Temp >=0
  ]
}

Re: [V4 IP5] Taupunkt berechnen

Verfasst: Di Dez 26, 2023 7:41 pm
von Robert_Mini
Hallo Hans!
Melde mich gleich dazu!
Lg Robert

Re: [V4 IP5] Taupunkt berechnen

Verfasst: Di Dez 26, 2023 8:49 pm
von Robert_Mini
Hallo Hans!

Doku zur Freien Formel: https://elabnet.atlassian.net/wiki/spac ... ulbaustein

Code: Alles auswählen

["CalcFormula",["$Eingang1","$Eingang2,"...","$Eingang_n"], "$Result", "$Formula"]
Du musst die Variablen in der $Formela als X1,X2,.. Xn ausdrücken. Die Variablen (Level) im Modul selbst ($Eingang1...) können beliebig heißen, werden eben auf X1... gemappt => im obigen Beispiel X1 = $Eingang1, X2 = $Eingang2 etc.
Die Doku ist da noch etwas suboptimal.

In deinem Beispiel:

Code: Alles auswählen

["$formel1","string","6.1078*(10^(7.5*X1)/(237.3 + X1))"],  //X1=$temp
["$formel2","string","X1/100*X2"],  //X1=$luft, X2=$sdd
usw.
Sunshinemaker hat das oben schon sauber beschrieben.

Im Module dann:

Code: Alles auswählen

["CalcFormula",["$temp"], "$sdd", "$formel1"],
["CalcFormula",["$luft", "$sdd"], "$dd", "$formel2"],
...
Hinsichtlich Comperator => alles OK

Bezüglich Multiplexer:

Code: Alles auswählen

["Multiplexer", ["$td2", "$td1"],"$taupunkt","$Schwellwertueberschritten"]
Noch was:
Schau dir das an: viewtopic.php?f=24&t=2001#p21681

Schritt für Schritt und regelmäßig speichern, dann lassen sich kleine Fehler schnell finden zb in deinem Fall & statt $ o.ä.

lg
Robert

Re: [V4 IP5] Taupunkt berechnen

Verfasst: Di Dez 26, 2023 9:19 pm
von hans4711
Hallo Robert,

vielen Dank für deine Hilfe!

Formeln usw. habe ich jetzt alle angepasst, aber was ich nicht verstehe ist der Schwenk von Mulitplexer auf die Formeln.
In meinem Gedankenmodell finde ich über den Comperator heraus ob die Temp über 0 Grad ist, dann Schwellwertüberschreitung True oder unter 0 Grad dann Schwellwertüberschreitung False. Diesen Wert übergebe ich dann an den Muliplexer der dann bei False den ersten Wert nimmt, bei True den zweiten, also verzweigt?!? Jetzt müsste ich ja dann entweder die Formeln 1-4 oder die Formeln 5-8 ausführen, aber wie mache ich das im Mulitplexer? Er müsste ja dann entweder die 4 Formeln überspringen die nicht benötigt werden oder aber irgendwie verschachteln?
Du merkst, ich hänge evlt. noch irgendwo in der Hochsprache des IF/Else/Case fest