Seite 3 von 6

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 12:31 pm
von Robert_Mini
Update: Fehler gefunden. Melde mich gleich dazu.

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 1:09 pm
von gbglace
Ahh ich habe mir das auch gerade auf den Schirm gezogen. Wollte mich dann auch nochmal in den Customs üben.

Mal am Ende vergleichen was rauskommt als Lösungsoptionen.

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 2:44 pm
von Robert_Mini
Hallo zusammen!

Dieses Beispiel hat mir gerade wieder ein paar graue Haare verursacht und zeigt wiedermal eindrucksvoll, wie schnell man einen Fehler/Bug unterstellt, er sich dann anders auflöst.

Von vorne:
1) Gestern habe ich mich um den Hinweis angenommen, dass bool und multiplexer nicht zusammenspielen => in Customs sehr wohl ok.
Dazu habe ich die Formel (mit Fehlerhinweis) eingekürzt und alles funktionierte wunderbar.

2) Den Fehler in der Formel habe ich nicht gefunden. Daher heute weiter gesucht. Formel weiter reduziert und plötzlich ging es. Dachte schon, die Reihenfolge der Argumente spielt eine Rolle.
Parallel in Excel mitgerechnet. Manchmal passte es, mit weiteren Faktoren wieder nicht... BUG?

3) Am Ende ist die Lösung schon fast trivial. Hans verwendet einen Multiplexer für string und kopiert die richtige Formel für die Auswertung weiter.
Dazu wird die Formel auf den String "$formelinbenutzung" kopiert, der allerdings mit "" initialisiert wird. Ihr ahnt es schon....

Offensichtlich werden strings nur mit (vermutlich) 14 Zeichen initialisiert, außer der defaultwert ist länger. Somit wird zur Laufzeit der längere String abgeschnitten und ist dann fehlerhaft.

Das spricht in diesem Fall tatsächlich dafür, dass man diese Logik mit einem Multiplexer für die Parameter aufbaut und nicht mit strings.

lg
Robert

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 2:55 pm
von hans4711
Hallo Robert,

vielen Dank für deine Arbeit. Ich habe es leider nicht verstanden wo das Problem ist? Kann dann der Multiplexer nur 14 Zeichen verarbeiten?
Ich weiß dann ehrlich gesagt nicht wie die alternative Lösung auszusehen hat.

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 3:18 pm
von blaubaerli
Hallo Hans,

er kann mehr. Die Variable vom Typ String in einer Custom-Logik muss nur mit einer entsprechenden Länge "initialisiert" werden.

Sieh dazu auch hier: viewtopic.php?f=24&t=3937&p=44019&hilit ... nge#p44019
1. erster Spiegelpunkt.

Beste Grüße
Jens

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 3:19 pm
von Robert_Mini
Hallo Hans!

Du musst die Initalisierung

Code: Alles auswählen

["$formelinbenutzung","string",""],
in

Code: Alles auswählen

["$formelinbenutzung","string","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"],
ändern, dann kannst du auch längere Formeln verarbeiten (mindestens soviele x wie deine Formel lang ist). Ich weiß aber nicht, ob dann bei 255 Zeichen o.ä. ein Limit ist, denn ich hab es mit den langen Formeln nicht zum Laufen bekommen.

Der bessere Weg ist aus meiner Sicht:
1) Die Formel aufgeteilt in mehrere Strings, allerdings die Zahlen 7.5 bzw. 7.6 und 237.3 bzw. 240.7 als X3 und X4
Wenn kein String kopiert wird, gibt es da mit Stringlängen keine schwer zu findenden Effekte.

2) X1 uns X2 ist dann wie gehabt T und Luftfeuchte

3) X3 und X4 befüllst du per Multiplexer je nachdem ob T>=0 0der T<0 mit den dazugehörigen Zahlen (aber in einem Level, Zahl direkt als Attribut geht nicht!).

4) Am Ende wird mit den richtigen X1-X4 gerechnet - fertig.

lg
Robert

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 3:28 pm
von gbglace
Hi zusammen,

habe mich da eben auch noch ein wenig mit beschäftigt.

Die gesamte Berechnung in einer langen Formel hat er soweit getan, es gab aber einen Fehler und um den zu debuggen hatte ich es dann doch etwas weiter aufgedröselt.
Bis ich dann merkte das die beiden Faktoren (a,b), welche da temperaturabhängig ausgewählt wurden, in der Potenzformel vertauscht waren und dann kamen da absurde Zahlen raus bzw. die Logik ist da in Ergebniswertfehler gelaufen (result is NaN or INFINTY).

Aufgeteilt in insgesamt 6 Formeln (2 zur Faktorauswahl und 4 Berechnungen) tut das jetzt in dieser Form:

Code: Alles auswählen

{
  "_Meta": { // Optional
    "Description": "",
    "Version": "1.00",
    "Icon": "" // format: "data:image/svg+xml;base64,ENCODED_FILE"
  },
  "Input": [
    ["Temperatur","Temperatur","$temp","c" ],
    ["Feuchtigkeit","Feuchtigkeit","$feuchte","c" ]
  ],
  "Output": [
    ["Taupunkt","Berechneter Taupunkt","$taupunkt","a"],
    // Debugging
    ["Faktor_a", "Auswahlwert X1","$faktor_a","a"],
    ["Faktor_b", "Auswahlwert X2","$faktor_b","a"],
    ["sdd", "SDD","$sdd","a"],
    ["dd", "DD","$dd","a"],
    ["v", "v","$v","a"]
     
  ],
  "Level": [
      //Ein/Ausgänge
    ["$temp","float",0.0],
    ["$feuchte","float",0.0],
    ["$taupunkt","float",0.0],

     //Konstanten Variablen
    ["$faktor_a","float",0.0],
    ["$faktor_b","float",0.0],
    ["$sdd","float",0.0],
    ["$dd","float",0.0],
    ["$v","float",0.0],

    //Formeln
    ["$calc_faktor_a","string","(X1>=0)?7.5:7.6"],
    ["$calc_faktor_b","string","(X1>=0)?237.3:270.7"],
   
    ["$calc_sdd","string","6.1078 * 10^((X1*X3)/(X2+X3))"],
    ["$calc_dd","string","X1/100 * X2"],
    ["$calc_v","string","log10(X1/6.1078)"],
    ["$calc_taupunkt","string","X2*X3/(X1-X3)"]
    
  ],
  "Module": [

      ["CalcFormula",["$temp"], "$faktor_a", "$calc_faktor_a"],
      ["CalcFormula",["$temp"], "$faktor_b", "$calc_faktor_b"],
    
      // Berechnung sdd
      ["CalcFormula",["$faktor_a","$faktor_b","$temp"], "$sdd", "$calc_sdd"],
      // Berechnung dd
      ["CalcFormula",["$feuchte","$sdd"], "$dd", "$calc_dd"],
      // Berechnung v
      ["CalcFormula",["$dd"], "$v", "$calc_v"],
      // Berechnung taupunkt
      ["CalcFormula",["$faktor_a","$faktor_b","$v"], "$taupunkt", "$calc_taupunkt"]
  ]
}
Ich habe das gegen ein paar Werte mit einem Online-Rechner der ebenfalls diese Formeln verwendete abgeglichen, das passt in etwa. bei -5°C und 25% rFeuchte gab es kleinere Abweichungen.

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 5:57 pm
von hans4711
Danke für Eure Hilfe!!!! Die Logik funktioniert jetzt.

Hier der Code falls jemand ebenfalls die Berechnung des Taupunkts benötigt:
---> Hier in einem späteren Post die Version 2.0. Es wird zusätzlich noch die absolute Luftfeuchtigkeit berechnet viewtopic.php?f=24&t=4725&start=30#p52212

Code: Alles auswählen

/**
 * Logik zum Berechnen des Taupunkts. Der Taupunkt ist ein guter Wert um Aussenluft und Innenluft miteinander zu vergleichen um zu prüfen ob Lüften zur Feuchtigkeitsreduktion sinnvoll ist.
 * Die Entstehtung der Logik wurde hier besprochen:https://forum.timberwolf.io/viewtopic.php?f=24&t=4725
 * Die Formeln wurden von folgendem Post abgeleitet: http://dl8aap.koch-carsten.de/2020/07/taupunkt-berechnen/
 * Erklärung der Variablen aus der ursprünglichen Formel
 * var t = temperature;
* var r = humidity;
* var tp = 0.000;
* // Konstante
* var mw = 18.016; //Molekulargewicht des Wasserdampfes (kg/kmol)
* var gk = 8314.3; // universelle Gaskonstante (J/(kmol*K))
* var t0 = 273.15; // Absolute Temperatur von 0 °C (Kelvin)
* var tk = t + t0; // Temperatur in Kelvin
 
* Temp größer gleich 0 Grad:
*     a = 7.5;
*     b = 237.3;
* Temp kleiner 0 Grad:
*     a = 7.6;
*     b = 240.7;
* }
 */

{
  "_Meta": { // Optional
    "Description": "",
    "Version": "1.00",
    "Icon": "" // format: "data:image/svg+xml;base64,ENCODED_FILE"
  },
  "Input": [
    ["Temperatur","Temperatur","$temp","c" ],
    ["feuchtefeuchte","feuchtefeuchte","$feuchte","c" ]
  ],
  "Output": [
    ["Taupunkt","Berechneter Taupunkt","$taupunkt","a"]

  ],
  "Level": [
      //Ein-Ausgänge
    ["$temp","float",0.0],
    ["$feuchte","float",0.0],
    ["$taupunkt","float",0.0],
    
    //Formeln
    ["$formelinbenutzung","string","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"], //Reservierung des Speicherplatzes, sonst werden nur 14 Zeichen reserviert
        //Formel jeweils einmal mit den Konstanten für Temperaturen >0 Grad, und einmal für Temperaturen <0 Grad
    //var sdd = 6.1078 * Math.pow(10, (a*t)/(b+t));
    ["$formel1plus","string","6.1078 * 10^((7.5*X1)/(237.3+X1))"],
    ["$formel1minus","string","6.1078 * 10^((7.6*X1)/(240.7+X1))"],
    
    //var dd = sdd * (r/100);
    ["$formel2plus","string","X1 * (X2/100)"],
    ["$formel2minus","string","X1 * (X2/100)"],
    
    //var af = Math.pow(10,5) * mw/gk * dd/tk;
    ["$formel3plus","string","10^5 * 18.016/8314.3 * X1/(X2 + 273.15)"],
    ["$formel3minus","string","10^5 * 18.016/8314.3 * X1/(X2 + 273.15)"],

    //var v = Math.log10(dd/6.1078);
    ["$formel4plus","string","log10(X1/6.1078)"],
    ["$formel4minus","string","log10(X1/6.1078)"],
    
    //tp = Math.round( ((b*v) / (a-v))*100)/100;
    ["$formel5plus","string","((237.3*X1) / (7.5-X1))*100/100"],
    ["$formel5minus","string","((240.7*X1) / (7.6-X1))*100/100"],
    
    //Variablen für die Berechnungen
    ["$schwellwert","float",0.0],
    ["$schwellwertueberschreitung","bool",false],
    ["$schwellwertueberschreitungint","integer",0],
    ["$sdd","float",0.0],
    ["$dd","float",0.0],
    ["$af","float",0.0],
    ["$v","float",0.0]
  ],
  "Module": [
      //Comparator, prüft ob die Temp postiv oder negativ ist, True bei Plusgraden, False bei Minusgraden
      ["Comparator" , "$temp" , "$schwellwertueberschreitung" , "$schwellwert"],

      //Formel 1
      ["Multiplexer", ["$formel1minus", "$formel1plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$temp"], "$sdd", "$formelinbenutzung"],

      //Formel 2
      ["Multiplexer", ["$formel2minus", "$formel2plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$sdd","$feuchte"], "$dd", "$formelinbenutzung"],

      //Formel 3
      ["Multiplexer", ["$formel3minus", "$formel3plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$dd","$temp"], "$af", "$formelinbenutzung"],

      //Formel 4
      ["Multiplexer", ["$formel4minus", "$formel4plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$dd"], "$v", "$formelinbenutzung"],
      
      //Formel 5      
      ["Multiplexer", ["$formel5minus", "$formel5plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$v"], "$taupunkt", "$formelinbenutzung"]
  ]
}
@StefanW Ein Hinweis in der Doku das Stringvariablen 12 Zeichen haben wenn bei der Deklaration kein Wert mitgegeben wird wäre klasse

Ich würde diesen Post gerne beim ersten Beitrag markieren, ich kann leider den ersten Beitrag nicht mehr bearbeiten? Wie kann ich das machen?

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 6:03 pm
von blaubaerli
Hallo Hans,
hans4711 hat geschrieben: Do Dez 28, 2023 5:57 pm Ich würde diesen Post gerne beim ersten Beitrag markieren, ich kann leider den ersten Beitrag nicht mehr bearbeiten? Wie kann ich das machen?
wenn du mir genau erklärst, was du dir da vorstellst, kann ich das gerne für dich übernehmen.

Das Editieren der Posts ist nur für eine bestimmte Zeit möglich. Nach Ablauf dieser Frist geht das absichtlich "nur" noch mit den Rechten eines Moderators. (Frag mich bitte nicht nach der genauen Zeitspanne :-))

Beste Grüße
Jens

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 6:18 pm
von Robert_Mini
hans4711 hat geschrieben: Do Dez 28, 2023 5:57 pm Danke für Eure Hilfe!!!! Die Logik funktioniert jetzt.
...
@StefanW Ein Hinweis in der Doku das Stringvariablen 12 Zeichen haben wenn bei der Deklaration kein Wert mitgegeben wird wäre klasse
1) Gerne - danke für deine Ausdauer.

2) Wo in der Doku würdest du solch Information erwarten? Ich ergänze das gerne, bin aber etwas betriebsblind.

lg
Robert