Ankündigung KNX Data Secure Unterstützung im
KNX Logger und im KNX Busmonitor


Wir haben den KNX Buslogger und den KNX Busmonitor um KNX Data Secure erweitert

Zudem gibt es einen KNX Diagnose Monitor und das Hochladen des ETS Projektes ist nun 100-fach schneller

Alle Informationen hier: viewtopic.php?f=21&t=5886

[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

Robert_Mini
Reactions:
Beiträge: 3900
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1263 Mal
Danksagung erhalten: 2208 Mal

#11

Beitrag von Robert_Mini »

Achso:
Du musst beide Berechnungen ausführen, für >=0 das Ergebnis auf $td1 und für <0 auf $td2 schreiben.
Der Multiplexer wählt nur aus.

In Einzellogikzellwn könnte man das nur selektiv berechnen, in CustomLogiken kann man nicht einzelne Module überspringen!

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

blaubaerli
Reactions:
Beiträge: 2664
Registriert: Sa Sep 15, 2018 10:26 am
Wohnort: Kerpen
Hat sich bedankt: 995 Mal
Danksagung erhalten: 785 Mal

#12

Beitrag von blaubaerli »

Hallo Hans,

da gibt es schon ein paar Hinweise im Forum :-) die habe ich mir gebookmarked:

Knowledge Base - 4.6.7.7_ CUSTOM: IF-THEN (ELSE) Lösungen

und

viewtopic.php?f=24&t=1585&p=16639#p16638

Beste Grüße
Jens

PS: Ich bekomme da auch regemäßig Kringel in den Hirnwindungen. Robert ist da schlicht der Foren-Guru :handgestures-thumbsup: :handgestures-thumbsup: :bow-yellow:
Zuletzt geändert von blaubaerli am Di Dez 26, 2023 9:31 pm, insgesamt 1-mal geändert.
wiregate1250 & timberwolf168 (2600er), VPN offen, Reboot nach Vereinbarung
Bitte WIKI lesen.

gbglace
Reactions:
Beiträge: 4066
Registriert: So Aug 12, 2018 10:20 am
Hat sich bedankt: 1410 Mal
Danksagung erhalten: 1889 Mal

#13

Beitrag von gbglace »

Ich bin ja immer noch dabei eher dieses Wertepärchen je nach größer oder kleiner 0° in je eine Variable zu packen.
Ob die Auswahl nun durch einen Multiplexer oder einem Ausdruck in einer freien Formel passiert ist Geschmackssache.
Wichtig ist ja eher, dass nach dieser Auswahl zwei Variablen existieren, wodurch die 4 Formeln nur einmal in der gesamten Customlogik notiert sein müssen und berechnet werden müssen.
Das macht die Wartung der Customlogik einfacher.
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
#PV 43,2 kWh Akku; 3x VE MP2 5000; 6,7 kWp > 18 Panele an 4x HM1500 + 1 HM800 WR; Open-DTU

Robert_Mini
Reactions:
Beiträge: 3900
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1263 Mal
Danksagung erhalten: 2208 Mal

#14

Beitrag von Robert_Mini »

Hallo Göran!

Danke für den Hinweis, macht speziell in diesem Fall Sinn, da die Formeln dient und komplex sind.
Wenn es eine Fallunterscheidung wäre, die anders behandelt wird, ginge es nur so wie dargestellt.

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

Ersteller
hans4711
Reactions:
Beiträge: 124
Registriert: Mi Nov 08, 2023 4:24 pm
Hat sich bedankt: 40 Mal
Danksagung erhalten: 65 Mal

#15

Beitrag von hans4711 »

@Robert_Mini irgendwie klappt es nicht ganz:
* Ich kann den Comperator Ausgang nicht mit dem mulitplexer Selektor koppeln weil der Multiplexer ein integer erwartet, der Comperator aber Bool ausgibt.
* Ich dachte ich Mappe true/false in 1/0 über eine Freie Formel (X1==true?1:0). Die Freie Formel erwartet aber einen Float als Eingang und kein Bool
* Ich habe die Abfolge mit Standardlogiken nachgebaut, daher habe ich auch die Fehlermeldungen der falschen Casts

Hast du dafür eine Lösung?
So sieht der Code aktuell aus, ich habe die Formel jetzt zu einer zusammengefasst

Code: Alles auswählen

/**
 * New custom logic
 *
 * 
 */

{
  "_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": [
    ["Taupunkt","Berechneter Taupunkt","$taupunkt","a"],
    ["Comperator","True postiv, False, negativ","$comp","a"],
    //Zur Fehlersuche
    ["Multi","True postiv, False, negativ","$multi","a"],
    ["IFElse","True postiv, False, negativ","$schwellwertueberschreitungint","a"]
    
  ],
  "Level": [
      //Ein/Ausgänge
    ["$temp","float",0.0],
    ["$luft","float",0.0],
    ["$taupunkt","float",0.0],
    
    //Formeln
    ["$formelminusgrade","string","((240.7*(log10(((6.1078 * (10^(7.6*X1)/(240.7+X1))) * (X1/100))/6.1078))) / (7.6-(log10(((6.1078 * (10^(7.6*X2)/(240.7+X2))) * (X2/100))/6.1078))))*100/100"],
    ["$formelplusgrade","string","((237.3*(log10(((6.1078 * (10^(7.5*X1)/(237.3+X1))) * (X1/100))/6.1078))) / (7.5-(log10(((6.1078 * (10^(7.5*X2)/(237.3+X2))) * (X2/100))/6.1078))))*100/100"],
    ["$formelinbenutzung","string",""],
    ["$formeltointeger","string","(X1==true)?1:0"],
    
    //Variablen für die Berechnungen
    ["$schwellwert","float",0.0],
    ["$schwellwertueberschreitung","bool",false],
    ["$schwellwertueberschreitungint","integer",0],
    
    //Troubleshooting
    ["$comp","bool",false],
    ["$multi","bool",false]
    
    
      
  ],
  "Module": [
      //Comparator, prüft ob die Temp postiv oder negativ ist, True bei Plusgraden, False bei Minusgraden
      ["Comparator" , "$luft" , "$comp" , "$schwellwert"], //nur für Fehlersuche
      ["Comparator" , "$luft" , "$schwellwertueberschreitung" , "$schwellwert"],
      ["CalcFormula",["$schwellwertueberschreitung"], "$schwellwertueberschreitungint", "$formeltointeger"],
      
      //Mulitplexer, speichert die richtige Formel in der Variable "formelinbenutzung", diese soll dann der freien Berechnung übergeben werden
      ["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$multi","$schwellwertueberschreitung"], //nur für Fehlersuche
      ["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$formelinbenutzung","$schwellwertueberschreitung"],
      
      
      //Berechnung des Taupunkts
      ["CalcFormula",["$temp","$luft"], "$taupunkt", "$formelinbenutzung"]
      
  ]
}
Bild
Bild
Zuletzt geändert von hans4711 am Mi Dez 27, 2023 11:19 pm, insgesamt 1-mal geändert.
3500 XL ID:1339

Robert_Mini
Reactions:
Beiträge: 3900
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1263 Mal
Danksagung erhalten: 2208 Mal

#16

Beitrag von Robert_Mini »

Hallo Hans!

Göran hatte das zwar etwas anders gemeint (Umschalter der Parameter), ich finde den Ansatz mit Umschalten der Formel aber ziemlich elegant :-).

Hab das bei mir nun getestet und im Wesentlichen einen Fehler in den Formel gefunden. Daher hab ich mal einfach "X1+X2" und "X1-X2" hinterlegt und dann funktioniert es auch schon. $temp statt $luft am comperator war auch falsch.

In Customlogiken kann man sehr wohl bool auf int und umgekehrt schreiben, man muss eben wissen was man tut. Insbesondere bei float auf bool kommt da schnell MIST raus....

Code: Alles auswählen

/**
 * New custom logic
 *
 * 
 */

{
  "_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": [
    ["Taupunkt","Berechneter Taupunkt","$taupunkt","a"],
    ["Comperator","True postiv, False, negativ","$comp","a"],
    //Zur Fehlersuche
    ["Multi","True postiv, False, negativ","$multi","a"],
    ["IFElse","True postiv, False, negativ","$schwellwertueberschreitungint","a"]
    
  ],
  "Level": [
      //Ein/Ausgänge
    ["$temp","float",0.0],
    ["$luft","float",0.0],
    ["$taupunkt","float",0.0],
    
    //Formeln
   // ["$formelminusgrade","string","((240.7*(log10(((6.1078 * (10^(7.6*X1)/(240.7+X1))) * (X1/100))/6.1078))) / (7.6-(log10(((6.1078 * (10^(7.6*X2)/(240.7+X2))) * (X2/100))/6.1078))))*100/100"],
   // ["$formelplusgrade","string","((237.3*(log10(((6.1078 * (10^(7.5*X1)/(237.3+X1))) * (X1/100))/6.1078))) / (7.5-(log10(((6.1078 * (10^(7.5*X2)/(237.3+X2))) * (X2/100))/6.1078))))*100/100"],
   
    ["$formelminusgrade","string","X1+X2"],
    ["$formelplusgrade","string","X1-X2"],
    ["$formelinbenutzung","string",""],
   // ["$formeltointeger","string","(X1==true)?1:0"],
    
    //Variablen für die Berechnungen
    ["$schwellwert","float",0.0],
    ["$schwellwertueberschreitung","bool",false],
    ["$schwellwertueberschreitungint","integer",0],
    
    //Troubleshooting
    ["$comp","bool",false],
    ["$multi","bool",false]
    
    
  ],
  "Module": [
      //Comparator, prüft ob die Temp postiv oder negativ ist, True bei Plusgraden, False bei Minusgraden
      ["Comparator" , "$temp" , "$comp" , "$schwellwert"], //nur für Fehlersuche
      ["Comparator" , "$temp" , "$schwellwertueberschreitung" , "$schwellwert"],
      //["CalcFormula",["$schwellwertueberschreitung"], "$schwellwertueberschreitungint", "$formeltointeger"],
      
      //Mulitplexer, speichert die richtige Formel in der Variable "formelinbenutzung", diese soll dann der freien Berechnung übergeben werden
      ["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$multi","$schwellwertueberschreitung"], //nur für Fehlersuche
      ["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$formelinbenutzung","$schwellwertueberschreitung"],
      
      
      //Berechnung des Taupunkts
      ["CalcFormula",["$temp","$luft"], "$taupunkt", "$formelinbenutzung"]
      
  ]
}
Zum Standardbaustein melde ich mich noch.

lg
Robert
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Robert_Mini am Mi Dez 27, 2023 11:57 pm, insgesamt 1-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Robert_Mini
Reactions:
Beiträge: 3900
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1263 Mal
Danksagung erhalten: 2208 Mal

#17

Beitrag von Robert_Mini »

Bool als Selektor beim Multiplexer im Standardbaustein geht tatsächlich nicht.

@Stefan: hier ist aus meiner Sicht die Prüfung zu streng und es gibt keinen Eingangsmodifizierer, der Bool auf Int erlaubt. Ich wüsste da jetzt auch keinen einfachen Workaround...

Auch der MouseOver Text ist da aus meiner Sicht falsch: Ganzzahl (INT) passt, aber Ziel Datentyp sollte auch INT sein vermute ich mal.

lg
Robert
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Robert_Mini
Reactions:
Beiträge: 3900
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1263 Mal
Danksagung erhalten: 2208 Mal

#18

Beitrag von Robert_Mini »

Für den Formelfehler gebe ich auf, hab's in 1/2h nicht gefunden...

lg
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Ersteller
hans4711
Reactions:
Beiträge: 124
Registriert: Mi Nov 08, 2023 4:24 pm
Hat sich bedankt: 40 Mal
Danksagung erhalten: 65 Mal

#19

Beitrag von hans4711 »

Vielen Dank für Eure Hilfe!!!

Jetzt bin ich ein gutes Stück weiter, die Formeln habe ich jetzt um komplexität rauszunehmen wieder auf den ursprünglichen 5 gelassen und habe einfach vor jeder Formel einen Multiplexer gebaut.
Leider kann ich die Formeln wohl nicht wie benötigt umbauen.
Es kommt folgende Fehlermeldung:

28.12.2023 10:35:21 Logic_24 Taupunktrechner calc_formula3 Error while analyzing formula "6.1078 * 10^(7."
28.12.2023 10:35:22 src/le_math_expr.cpp#23:muparser: Missing parenthesis

Was mache ich da bei der Formel mit dem pow falsch?

Code: Alles auswählen

/**
 * New custom logic
 *
 * 
 */

{
  "_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"],
    ["Comperator","True postiv, False, negativ","$comp","a"],
    ["Multi","True postiv, False, negativ","$multi","a"],
    ["IFElse","True postiv, False, negativ","$schwellwertueberschreitungint","a"]
    
  ],
  "Level": [
      //Ein/Ausgänge
    ["$temp","float",0.0],
    ["$feuchte","float",0.0],
    ["$taupunkt","float",0.0],
    
    //Formeln
    //["$formelminusgrade","string","((240.7*(log10(((6.1078 * (10^(7.6*X1)/(240.7+X1))) * (X1/100))/6.1078))) / (7.6-(log10(((6.1078 * (10^(7.6*X2)/(240.7+X2))) * (X2/100))/6.1078))))*100/100"],
//    ["$formelminusgrade","string","X1+X2"],
//    ["$formelplusgrade","string","((237.3*(log10(((6.1078 * (10^(7.5*X1)/(237.3+X1))) * (X1/100))/6.1078))) / (7.5-(log10(((6.1078 * (10^(7.5*X2)/(237.3+X2))) * (X2/100))/6.1078))))*100/100"],
    //["$formelplusgrade","string","X1*X2"],
    ["$formelinbenutzung","string",""],
    ["$formeltointeger","string","(X1==true)?1:0"],
    
    //neue Formeln
    //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],
    
    //Troubleshooting
    ["$comp","bool",false],
    ["$multi","bool",false]
    
    
      
  ],
  "Module": [
      //Comparator, prüft ob die Temp postiv oder negativ ist, True bei Plusgraden, False bei Minusgraden
      ["Comparator" , "$temp" , "$comp" , "$schwellwert"], //nur für Fehlersuche
      ["Comparator" , "$temp" , "$schwellwertueberschreitung" , "$schwellwert"],
      //["CalcFormula",["$schwellwertueberschreitung"], "$schwellwertueberschreitungint", "$formeltointeger"],
      
      ["Multiplexer", ["$formel1minus", "$formel1plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$temp"], "$sdd", "$formelinbenutzung"],
      
      ["Multiplexer", ["$formel2minus", "$formel2plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$sdd","$feuchte"], "$dd", "$formelinbenutzung"],

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

      ["Multiplexer", ["$formel4minus", "$formel4plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$dd"], "$v", "$formelinbenutzung"],
      
      ["Multiplexer", ["$formel5minus", "$formel5plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$v"], "$taupunkt", "$formelinbenutzung"]
      
      //Mulitplexer, speichert die richtige Formel in der Variable "formelinbenutzung", diese soll dann der freien Berechnung übergeben werden
      //["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$multi","$schwellwertueberschreitung"], //Nur für Fehlersuche
      //["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$formelinbenutzung","$schwellwertueberschreitung"],
      
      
      //Berechnung des Taupunkts
      //["CalcFormula",["$temp","$feuchte"], "$taupunkt", "$formelinbenutzung"]
      
  ]
}
Zuletzt geändert von hans4711 am Do Dez 28, 2023 11:32 am, insgesamt 1-mal geändert.
3500 XL ID:1339

Robert_Mini
Reactions:
Beiträge: 3900
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1263 Mal
Danksagung erhalten: 2208 Mal

#20

Beitrag von Robert_Mini »

Hallo Hans!

Danke für deine Ausdauer, ich ärgere mich gerade über den muparser, da liegt offensichtlich ein Problem vor, das ich gerade weiter einschränken, aber nicht lösen konnte. Ich poste die weitere Problembehandlung separat.

Vielleicht hast du zwischenzeitlich eine andere Logik als Custom Logik zu lösen, möchte ungern deinen Schwung bremsen :-)

lg
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297
Antworten

Zurück zu „Logikengine & Logik-Editor“