NEU! UPGRADE IP 12 verfügbar!
Verbessertes LICHTWIDGET - MQTT Geräte Manager Update - sowie viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/bCsDsqM8

Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Ab sofort kann jeder die neue VISU & IFTTT testen. Info: viewtopic.php?f=8&t=5074

Release V 4 am 15. Juni 2024
Es gibt nun einen fixen Termin. Info: viewtopic.php?f=8&t=5117

NEU! Ausführliches Video Tutorial zur VISU
Jetzt werden alle Fragen beantwortet. Das Video: https://youtu.be/_El-zaC2Rrs

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

Informationen und Diskussionen über Logik-Engine und Logik-Editor
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln

Ersteller
hans4711
Reactions:
Beiträge: 99
Registriert: Mi Nov 08, 2023 4:24 pm
Hat sich bedankt: 34 Mal
Danksagung erhalten: 57 Mal

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

#1

Beitrag 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:
Zuletzt geändert von Parsley am Fr Dez 29, 2023 8:41 pm, insgesamt 3-mal geändert.
3500 XL ID:1339

thtrp
Reactions:
Beiträge: 27
Registriert: Fr Nov 26, 2021 8:53 pm
Hat sich bedankt: 9 Mal
Danksagung erhalten: 21 Mal

#2

Beitrag 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.
Viele Grüße
Thorsten
________________________________________
Wiregate / TWS 2600 ID:596 + 2 PBM, VPN: bei Bedarf, Reboot nach Rücksprache

gbglace
Reactions:
Beiträge: 3656
Registriert: So Aug 12, 2018 10:20 am
Hat sich bedankt: 1280 Mal
Danksagung erhalten: 1687 Mal

#3

Beitrag 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.
Grüße
Göran

#1 Timberwolf 2600 Velvet Red TWS #225 / VPN aktiv / Reboot OK
#2 Timberwolf 2600 Organic Silver TWS #438 / VPN aktiv / Reboot OK
#3 PBM 3 Kanäle, #4 Modbus-Extension

Ersteller
hans4711
Reactions:
Beiträge: 99
Registriert: Mi Nov 08, 2023 4:24 pm
Hat sich bedankt: 34 Mal
Danksagung erhalten: 57 Mal

#4

Beitrag 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?
3500 XL ID:1339

Robert_Mini
Reactions:
Beiträge: 3762
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1176 Mal
Danksagung erhalten: 2080 Mal

#5

Beitrag 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
Zuletzt geändert von Robert_Mini am Di Dez 26, 2023 10:41 am, insgesamt 1-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Sunshinemaker
Reactions:
Beiträge: 219
Registriert: So Mai 22, 2022 11:45 am
Hat sich bedankt: 106 Mal
Danksagung erhalten: 129 Mal

#6

Beitrag 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.
LG Sören

TWS 3500 XL / ID 846 / VPN:offen / Reboot nach Rücksprache

Ersteller
hans4711
Reactions:
Beiträge: 99
Registriert: Mi Nov 08, 2023 4:24 pm
Hat sich bedankt: 34 Mal
Danksagung erhalten: 57 Mal

#7

Beitrag 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
  ]
}
3500 XL ID:1339

Robert_Mini
Reactions:
Beiträge: 3762
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1176 Mal
Danksagung erhalten: 2080 Mal

#8

Beitrag von Robert_Mini »

Hallo Hans!
Melde mich gleich dazu!
Lg Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Robert_Mini
Reactions:
Beiträge: 3762
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1176 Mal
Danksagung erhalten: 2080 Mal

#9

Beitrag 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
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Ersteller
hans4711
Reactions:
Beiträge: 99
Registriert: Mi Nov 08, 2023 4:24 pm
Hat sich bedankt: 34 Mal
Danksagung erhalten: 57 Mal

#10

Beitrag 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
3500 XL ID:1339
Antworten

Zurück zu „Logikengine & Logik-Editor“