Script zur Berechnung des Feuchtegehalts

Homematic-, TCL- und Shell-Script, Toolchain, C, etc.

Moderator: Co-Administratoren

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Script zur Berechnung des Feuchtegehalts

Beitrag von paul53 » 23.08.2012, 14:49

Das folgende Script berechnet den Feuchtegehalt von Luft im Temperaturbereich von 0°C bis 34°C in guter Näherung. Oberhalb von 34°C beträgt die Abweichung mehr als 0,1 g/kg.

Code: Alles auswählen

! Feuchtegehalt berechnen und in Systemvariable schreiben

! Raumname ist Bestandteil des Kanalnamens (Raum.Sensor)
! und des Namens der Systemvariable (Raum:Feuchtegehalt)
string raum = "Wohnen";

! Lokale Variablen
real    t;   ! Temperatur in °C 
integer rf;  ! relative Feuchte in %
real    af;  ! Feuchtegehalt in g/kg

! Werte einlesen
t = dom.GetObject(raum#".Sensor").DPByHssDP("TEMPERATURE").Value(); 
rf = dom.GetObject(raum#".Sensor").DPByHssDP("HUMIDITY").Value(); 

! Berechnung Sättigungsfeuchtegehalt
if (t < 0.0) {t = 0.0;}
if (t < 10.0)
{ af = (3.78 + (0.285 * t) + (0.0052 * t * t) + (0.0005 * t * t * t));
}
else
{ af = (7.62 + (0.524 * (t-10.0)) + (0.0131 * (t-10.0) * (t-10.0)) + (0.00048 * (t-10.0) * (t-10.0) * (t-10.0)));
}
! Feuchtegehalt
af = (af * rf) / (100.0 + af * (100.0 - rf) / 622);

!In Systemvariable schreiben
dom.GetObject(raum#":Feuchtegehalt").State(af);

Es ist sinnvoll, beim Lüften im Sommer den Feuchtegehalt aussen und innen zu vergleichen, und nur dann zu lüften, wenn der Aussenfeuchtegehalt kleiner ist als der Innenfeuchtegehalt. Andernfalls wird die Luft im Raum unangenehm feucht.
Zuletzt geändert von paul53 am 17.02.2014, 17:43, insgesamt 4-mal geändert.
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Script zur Berechnung der absoluten Feuchte

Beitrag von JPS » 23.08.2012, 19:50

Interessant, kannst du noch beschreiben, welches physikalische Rational / welche Formel hinter deiner Berechnung steckt?

Anmerkung Stand Februar 2014:
Mit Unterstützung von "paul53" habe ich die wesentlichen Erkenntnisse und Empfehlungen aus diesem - zwischenzeitlich etwas
unübersichtlich gewordenen - Thread
in einem Artikel zusammengefasst. Vielleicht ist das ja für jemanden hilfreich.
Zuletzt geändert von JPS am 15.02.2014, 21:18, insgesamt 1-mal geändert.
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

alchy
Beiträge: 10744
Registriert: 24.02.2011, 01:34
System: CCU
Hat sich bedankt: 65 Mal
Danksagung erhalten: 671 Mal

Re: Script zur Berechnung der absoluten Feuchte

Beitrag von alchy » 24.08.2012, 12:21

Verwirrenderweise berechnest du die absolute Luftfeuchtigkeit in g/kg statt in in g/m³
Berechnest Du das Mischungsverhältnis (oder auch Feuchtegrad)?
Alchy

Blacklist................... almost full
Ignoranz ist die Summe aller Maßnahmen die man ergreift, um bestehende Tatsachen nicht sehen zu müssen.

© Sandra Pulsfort (*1974)

Lies bitte die Logik von WebUI Programmen und die Tipps und Tricks für Anfänger.

Wichtig auch CUxD ersetzt System.exec. Die HM Script Doku (Downloadart Skripte) hilft auch weiter.
Zum Testen von Scripten den >> HomeMatic Script Executor << von Anli benutzen.

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script zur Berechnung der absoluten Feuchte

Beitrag von paul53 » 24.08.2012, 16:14

In der Klimatechnik werden die Luftzustände mit Hilfe des Mollier-h-x-Diagramms http://de.wikipedia.org/wiki/Mollier-h-x-Diagramm ermittelt. Hier ist die absolute Feuchte (x) in g Wasser pro kg trockene Luft angegeben.

Die Ermittlung der Koeffizienten für den linearen, quadratischen und kubischen Anteil in der angegebenen Formel erfolgte mittels MS Excel. Als Grundlage diente die Magnusformel zur Berechnung des Sättigungsdampfdrucks.
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Script zur Berechnung der absoluten Feuchte

Beitrag von JPS » 25.08.2012, 22:57

Zunächst danke für den technischen Background.

Ich habe die Idee mal in mein Taupunkt-Berechnungsscript (siehe hier: http://homematic-forum.de/forum/viewtop ... 942#p57942) integriert, mit dessen Hilfe ich den Luftentfeuchter eines zuweilen etwas feuchten Kellerraumes schalte.

Das sieht nun so aus...

Code: Alles auswählen

    ! RaumXY Berechnung des Taupunktes, der Schimmelwarnung und Lüftungsempfehlung 
    object oTHi = dom.GetObject("RaumXY_Raumregler:1");
    object oTi   = oTHi.DPByHssDP("TEMPERATURE");
    object oHi   = oTHi.DPByHssDP("HUMIDITY");
    object oTaupunkt = dom.GetObject("RaumXY_Taupunkt");
    object oSchimmel = dom.GetObject("RaumXY_Schimmel");
	object oWandTemp = dom.GetObject("RaumXY_Wandtemperatur");
	object oLueften = dom.GetObject("RaumXY_Lueften");
    object oTHa = dom.GetObject("Aussen_TempFeuSens:1");
    object oTa = oTHa.DPByHssDP("TEMPERATURE");
    object oHa   = oTHi.DPByHssDP("HUMIDITY");
	! Programmteil Lüftungsempfehlung
	! Lokale Variablen
    real tin = oTi.Value(); ! Temperatur in °C innen
    integer rfin = oHi.Value(); ! relative Feuchte in % innen
	real afin;  ! absolute feuchte in g/kg innen
	real tau = oTa.Value(); ! Temperatur in °C außen
    integer rfau = oHi.Value(); ! relative Feuchte in % außen
 	real    afau; ! absolute feuchte in g/kg außen
	! Berechnung der absoluten Feuchte innen
    if (tin < 0.0) {tin = 0.0;}
    if (tin < 10.0)
    { afin = (3.78 + (0.29 * tin) + (0.0046 * tin * tin) + (0.00051 * tin * tin * tin)) * 0.01 * rfin;
    }
    else
    { afin = (7.62 + (0.51 * (tin-10.0)) + (0.0143 * (tin-10.0) * (tin-10.0)) + (0.00045 * (tin-10.0) * (tin-10.0) * (tin-10.0))) * 0.01 * rfin;
    }
	! Berechnung der absoluten Feuchte außen
	if (tau < 0.0) {tau = 0.0;}
    if (tau < 10.0)
    { afau = (3.78 + (0.29 * tau) + (0.0046 * tau * tau) + (0.00051 * tau * tau * tau)) * 0.01 * rfau;
    }
    else
    { afau = (7.62 + (0.51 * (tau-10.0)) + (0.0143 * (tau-10.0) * (tau-10.0)) + (0.00045 * (tau-10.0) * (tau-10.0) * (tau-10.0))) * 0.01 * rfau;
    }
	! Berechnung der Lüftungsempfehlung
	if (afau < afin) {oLueften.Variable(true);}
    else {oLueften.Variable(false);}	
	! Programmteil Taupunkt
	! Lokale Variablen
    var Ta = oTa.Value(); ! Temperatur aussen
    var Ti  = oTi.Value();   ! Temperatur innen
    var Hi  = oHi.Value();  ! Humidity (Feuchtigkeit) innen
    var WT = Ta + (Ti - Ta) * 0.580; ! Berechnung der Wandtemperatur. Isolationsfaktor ist anzupassen
    oWandTemp.Variable(WT);
    var Taupunkt;
	!
	! Taupunktberechnung
	if(Ti <= 0.0){Taupunkt = -20.2;}
	else {	
		if((Ti > 0.0) && (Ti <= 2.0))
			{
			if(Hi <= 20){Taupunkt = -18.6;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -15.9;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -13.7;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = -11.8;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = -10.2;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = -8.7;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = -7.3;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = -6.1;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = -4.9;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = -3.9;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = -2.9;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = -2;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = -1.1;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = -0.2;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 0.5;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 1.3;}
			if(Hi > 95){Taupunkt = 2;}
			}
	else {	
		if((Ti > 2.0) && (Ti <= 4.0))
			{
			if(Hi <= 20){Taupunkt = -16.9;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -14.2;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -12;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = -10;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = -8.4;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = -6.8;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = -5.5;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = -4.2;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = -3;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = -2;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = -1;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 0;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 0.9;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 1.7;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 2.5;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 3.3;}
			if(Hi > 95){Taupunkt = 4;}
			}
	else {	
		if((Ti > 4.0) && (Ti <= 6.0))
			{
			if(Hi <= 20){Taupunkt = -15.2;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -12.5;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -10.2;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = -8.3;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = -6.6;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = -5;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = -3.6;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = -2.3;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = -1.2;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = -0.1;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 1;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 1.9;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 2.8;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 3.7;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 4.5;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 5.3;}
			if(Hi > 95){Taupunkt = 6;}
			}
	else {	
		if((Ti > 6.0) && (Ti <= 8.0))
			{
			if(Hi <= 20){Taupunkt = -13.6;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -10.8;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -8.5;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = -6.5;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = -4.8;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = -3.2;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = -1.8;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = -0.5;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = -0.7;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 1.9;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 2.9;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 3.9;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 4.8;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 5.6;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 6.5;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 7.2;}
			if(Hi > 95){Taupunkt = 8;}
			}
	else {
		if((Ti > 8.0) && (Ti <= 9.0))
			{
			if(Hi <= 20){Taupunkt = -12.7;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -9.9;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -7.6;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = -5.6;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = -3.9;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = -2.3;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = -0.9;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 0.5;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 1.7;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 2.8;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 3.8;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 4.8;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 5.7;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 6.6;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 7.5;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 8.2;}
			if(Hi > 95){Taupunkt = 9;}
			}
	else {
		if((Ti > 9.0) && (Ti <= 10.0))
			{
			if(Hi <= 20){Taupunkt = -11.9;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -9.1;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -6.8;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = -4.7;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = -3;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = -1.4;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 0.1;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 1.4;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 2.6;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 3.7;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 4.8;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 5.8;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 6.7;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 7.6;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 8.4;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 9.2;}
			if(Hi > 95){Taupunkt = 10;}
			}
	else {	
		if((Ti > 10.0) && (Ti <= 11.0))
			{
			if(Hi <= 20){Taupunkt = -11.1;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -8.2;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -5.9;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = -3.8;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = -2.1;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = -0.5;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 1;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 2.3;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 3.5;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 4.7;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 5.7;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 6.7;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 7.7;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 8.6;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 9.4;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 10.2;}
			if(Hi > 95){Taupunkt = 11;}
			}				
	else {	
		if((Ti > 11.0) && (Ti <= 12.0))
			{
			if(Hi <= 20){Taupunkt = -10.2;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -7.4;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -5;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = -3;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = -1.2;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 0.5;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 1.9;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 3.2;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 4.5;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 5.7;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 6.7;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 7.7;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 8.7;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 9.6;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 10.4;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 11.2;}
			if(Hi > 95){Taupunkt = 12;}
			}
	else {	
		if((Ti > 12.0) && (Ti <= 13.0))
			{
			if(Hi <= 20){Taupunkt = -9.4;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -6.5;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -4.1;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = -2.1;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = -0.3;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 1.4;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 2.8;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 4.2;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 5.4;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 6.6;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 7.7;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 8.7;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 9.6;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 10.5;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 11.4;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 12.2;}
			if(Hi > 95){Taupunkt = 13;}
			}
	else {	
		if((Ti > 13.0) && (Ti <= 14.0))
			{
			if(Hi <= 20){Taupunkt = -8.6;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -5.7;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -3.3;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = -1.2;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 0.6;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 2.3;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 3.7;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 5.1;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 6.4;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 7.5;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 8.6;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 9.6;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 10.6;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 11.5;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 12.4;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 13.2;}
			if(Hi > 95){Taupunkt = 14;}
			}
	else {	
		if((Ti > 14.0) && (Ti <= 15.0))
			{
			if(Hi <= 20){Taupunkt = -7.7;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -4.8;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -2.4;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = -0.3;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 1.5;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 3.2;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 4.7;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 6.1;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 7.3;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 8.5;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 9.6;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 10.6;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 11.6;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 12.5;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 13.4;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 14.2;}
			if(Hi > 95){Taupunkt = 15;}
			}	
	else {	
		if((Ti > 15.0) && (Ti <= 16.0))
			{
			if(Hi <= 20){Taupunkt = -6.9;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -4;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -1.5;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 0.6;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 2.4;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 4.1;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 5.6;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 7;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 8.2;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 9.4;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 10.5;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 11.6;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 12.6;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 13.5;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 14.4;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 15.2;}
			if(Hi > 95){Taupunkt = 16;}
			}
	else {	
		if((Ti > 16.0) && (Ti <= 17.0))
			{
			if(Hi <= 20){Taupunkt = -6.1;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -3.1;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = -0.7;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 1.4;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 3.3;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 5;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 6.5;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 7.9;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 9.2;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 10.4;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 11.5;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 12.5;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 13.5;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 14.5;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 15.3;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 16.2;}
			if(Hi > 95){Taupunkt = 17;}
			}
	else {	
		if((Ti > 17.0) && (Ti <= 18.0))
			{
			if(Hi <= 20){Taupunkt = -5.3;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -2.3;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 0.2;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 2.3;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 4.2;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 5.9;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 7.4;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 8.8;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 10.1;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 11.3;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 12.5;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 13.5;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 14.5;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 15.4;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 16.3;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 17.2;}
			if(Hi > 95){Taupunkt = 18;}
			}
	else {	
		if((Ti > 18.0) && (Ti <= 19.0))
			{
			if(Hi <= 20){Taupunkt = -4.4;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -1.4;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 1.1;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 3.2;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 5.1;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 6.8;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 8.3;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 9.8;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 11.1;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 12.3;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 13.4;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 14.5;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 15.5;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 16.4;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 17.3;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 18.2;}
			if(Hi > 95){Taupunkt = 19;}
			}
	else {	
		if((Ti > 19.0) && (Ti <= 20.0))
			{
			if(Hi <= 20){Taupunkt = -3.6;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = -0.6;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 1.9;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 4.1;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 6;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 7.7;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 9.3;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 10.7;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 12;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 13.2;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 14.4;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 15.4;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 16.4;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 17.4;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 18.3;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 19.2;}
			if(Hi > 95){Taupunkt = 20;}
			}
	else {	
		if((Ti > 20.0) && (Ti <= 21.0))
			{
			if(Hi <= 20){Taupunkt = -2.8;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 0.2;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 2.8;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 5;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 6.9;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 8.6;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 10.2;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 11.6;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 12.9;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 14.2;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 15.3;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 16.4;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 17.4;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 18.4;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 19.3;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 20.2;}
			if(Hi > 95){Taupunkt = 21;}
			}
	else {	
		if((Ti > 21.0) && (Ti <= 22.0))
			{
			if(Hi <= 20){Taupunkt = -2;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 1.1;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 3.7;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 5.9;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 7.8;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 9.5;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 11.1;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 12.5;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 13.9;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 15.1;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 16.3;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 17.4;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 18.4;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 19.4;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 20.3;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 21.2;}
			if(Hi > 95){Taupunkt = 22;}
			}
	else {	
		if((Ti > 22.0) && (Ti <= 23.0))
			{
			if(Hi <= 20){Taupunkt = -1.1;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 1.9;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 4.5;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 6.7;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 8.7;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 10.4;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 12;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 13.5;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 14.8;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 16.1;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 17.2;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 18.3;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 19.4;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 20.3;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 21.3;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 22.2;}
			if(Hi > 95){Taupunkt = 23;}
			}
	else {	
		if((Ti > 23.0) && (Ti <= 24.0))
			{
			if(Hi <= 20){Taupunkt = -0.3;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 2.8;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 5.4;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 7.6;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 9.6;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 11.3;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 12.9;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 14.4;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 15.8;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 17;}	
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 18.2;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 19.3;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 20.3;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 21.3;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 22.3;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 23.1;}
			if(Hi > 95){Taupunkt = 24;}
			}
	else {	
		if((Ti > 24.0) && (Ti <= 25.0))
			{
			if(Hi <= 20){Taupunkt = 0.5;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 3.6;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 6.2;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 8.5;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 10.5;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 12.2;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 13.9;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 15.3;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 16.7;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 18;}	
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 19.1;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 20.3;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 21.3;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 22.3;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 23.2;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 24.1;}
			if(Hi > 95){Taupunkt = 25;}
			}
	else {	
		if((Ti > 25.0) && (Ti <= 26.0))
			{
			if(Hi <= 20){Taupunkt = 1.3;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 4.5;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 7.1;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 9.4;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 11.4;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 13.2;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 14.8;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 16.3;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 17.6;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 18.9;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 20.1;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 21.2;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 22.3;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 23.3;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 24.2;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 25.1;}
			if(Hi > 95){Taupunkt = 26;}
			}
	else {
		if((Ti > 26.0) && (Ti <= 27.0))
			{
			if(Hi <= 20){Taupunkt = 2.1;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 5.3;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 8;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 10.2;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 12.3;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 14.1;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 15.7;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 17.2;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 18.6;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 19.9;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 21.1;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 22.2;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 23.2;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 24.3;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 25.2;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 26.1;}
			if(Hi > 95){Taupunkt = 27;}
			}
	else {
		if((Ti > 27.0) && (Ti <= 28.0))
			{
			if(Hi <= 20){Taupunkt = 3;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 6.1;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 8.8;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 11.1;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 13.1;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 15;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 16.6;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 18.1;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 19.5;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 20.8;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 22;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 23.2;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 24.2;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 25.2;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 26.2;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 27.1;}
			if(Hi > 95){Taupunkt = 28;}
			}
	else {
		if((Ti > 28.0) && (Ti <= 30.0))
			{
			if(Hi <= 20){Taupunkt = 4.6;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 7.8;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 10.5;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 12.9;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 14.9;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 16.8;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 18.4;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 20;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 21.4;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 22.7;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 23.9;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 25.1;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 26.2;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 27.2;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 28.2;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 29.1;}
			if(Hi > 95){Taupunkt = 30;}
			}
	else {
		if((Ti > 30.0) && (Ti <= 32.0))
			{
			if(Hi <= 20){Taupunkt = 6.2;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 9.5;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 12.2;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 14.6;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 16.7;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 18.6;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 20.3;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 21.8;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 23.3;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 24.6;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 25.8;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 27;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 28.1;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 29.2;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 30.2;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 31.1;}
			if(Hi > 95){Taupunkt = 32;}
			}
	else {
		if((Ti > 32.0) && (Ti <= 35.0))
			{
			if(Hi <= 20){Taupunkt = 8.7;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 12;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 14.8;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 17.2;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 19.4;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 21.3;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 23;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 24.6;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 26.1;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 27.4;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 28.7;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 29.9;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 31;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 32.1;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 33.1;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 34.1;}
			if(Hi > 95){Taupunkt = 35;}
			}
	else {
		if((Ti > 35.0) && (Ti <= 40.0))
			{
			if(Hi <= 20){Taupunkt = 12.8;}
			if((Hi > 20) && (Hi <= 25)){Taupunkt = 16.2;}
			if((Hi > 25) && (Hi <= 30)){Taupunkt = 19.1;}
			if((Hi > 30) && (Hi <= 35)){Taupunkt = 21.6;}
			if((Hi > 35) && (Hi <= 40)){Taupunkt = 23.8;}
			if((Hi > 40) && (Hi <= 45)){Taupunkt = 25.8;}
			if((Hi > 45) && (Hi <= 50)){Taupunkt = 27.6;}
			if((Hi > 50) && (Hi <= 55)){Taupunkt = 29.2;}
			if((Hi > 55) && (Hi <= 60)){Taupunkt = 30.7;}
			if((Hi > 60) && (Hi <= 65)){Taupunkt = 32.1;}
			if((Hi > 65) && (Hi <= 70)){Taupunkt = 33.5;}
			if((Hi > 70) && (Hi <= 75)){Taupunkt = 34.7;}
			if((Hi > 75) && (Hi <= 80)){Taupunkt = 35.9;}
			if((Hi > 80) && (Hi <= 85)){Taupunkt = 37;}
			if((Hi > 85) && (Hi <= 90)){Taupunkt = 38;}
			if((Hi > 90) && (Hi <= 95)){Taupunkt = 39;}
			if(Hi > 95){Taupunkt = 40;}
			}
	else {
		if(Ti > 40) {Taupunkt = 40;}
	}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
    oTaupunkt.Variable(Taupunkt);
	! Schimmelwarnung
	! 0 - keine Gefahr
	! 1 - Warnung
	! 2 - Alarm
	if (WT > (Taupunkt + 2.0)) {oSchimmel.Variable(0);}
    else {
      if ((Taupunkt + 1.0) > WT) {oSchimmel.Variable(2);}
      else {oSchimmel.Variable(1);}
    }
Zusätzlich zur Schimmelwarnung erhalte ich mit der SysVar "RaumXY_Lueften" (Typ Boolean) nun noch die Empfehlung, ob gelüftet werden soll oder besser nicht.
Wenn sich das Ganze in der Praxis bewährt, habe ich damit ja vielleicht doch noch eine sinnvolle Anwendung für die Klappenanzeige. :mrgreen:
Zuletzt geändert von JPS am 26.08.2012, 23:46, insgesamt 1-mal geändert.
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script zur Berechnung der absoluten Feuchte

Beitrag von paul53 » 26.08.2012, 14:44

Anstelle der aufwändigen Ermittlung der Taupunkttemperatur würde ich einen anderen Ansatz wählen:
Berechnen der absoluten Grenzfeuchte für Schimmelalarm (80% rH) und der absoluten Grenzfeuchte für Schimmelwarnung (70% rH) und Vergleich mit der absoluten Raumfeuchte (siehe auch http://www.tbas.de/Schimmelpilzdiagramm.html).
Dazu benötigt man natürlich die Oberflächentemperatur der Außenwandecke.

Code: Alles auswählen

! Berechnung der Oberflächentemperatur der Außenwandecke
real tw;      ! Oberfächentemperatur der Außenwandecke in °C
real ta;      ! Außentemperatur in °C
real ti;      ! Raumtemperatur in °C
real Rges;    ! gesamter Wärmedurchgangswiderstand der Außenwandecke in m²*K/W

tw = ti + ((0.13 / Rges) * (ta - ti));
Den Gesamtdurchgangswiderstand (in m²*K/W) kann man berechnen, wenn man den genauen Aufbau der Außenwand kennt oder man kann ihn experimentell ermitteln (Messen aller 3 Temperaturen im Winter).

Berechnung der absoluten Grenzfeuchten:

Code: Alles auswählen

! Lokale Variablen
real    t;    ! Temperatur in °C
integer rf;   ! relative Feuchte in %
real    afw;  ! Schimmelwarn-Grenzfeuchte in g/kg
real    afa;  ! Schimmelalarm-Grenzfeuchte in g/kg
real    afs;  ! Sättigungsfeuchte der Wand in g/kg

! Berechnung der Sättigungsfeuchte der Wand
t = tw;
if (t < 10.0)
{ afs = (3.78 + (0.285 * t) + (0.0052 * t * t) + (0.0005 * t * t * t));
}
else
{ afs = (7.62 + (0.524 * (t-10.0)) + (0.0131 * (t-10.0) * (t-10.0)) + (0.00048 * (t-10.0) * (t-10.0) * (t-10.0)));
}

! Berechnung Warn-Grenzfeuchte
rf = 70;
afw = (afs * rf) / (100.0 + afs * (100.0 - rf) / 622);

! Berechnung Alarm-Grenzfeuchte
rf = 80;
afa = (afs * rf) / (100.0 + afs * (100.0 - rf) / 622);
Dann noch die Berechnung der absoluten Raumfeuchte (afi) und Vergleich.

Code: Alles auswählen

integer s = 0;  ! Schimmelwarnung 
if (afi > afw) {s = 1;}
if (afi > afa) {s = 2;}
Zuletzt geändert von paul53 am 16.02.2014, 20:10, insgesamt 4-mal geändert.
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Script zur Berechnung der absoluten Feuchte

Beitrag von JPS » 27.08.2012, 00:16

JPS hat geschrieben:...bin gerade dabei, das Script (...) anzupassen. Danach werde ich das Ganze in der Praxis testen.
So, fertig:

Code: Alles auswählen

    ! RaumXY Berechnung der Schimmelwarnung und Lüftungsempfehlung 
    object oTHi = dom.GetObject("RaumXY_Raumregler:1");
    object oTi   = oTHi.DPByHssDP("TEMPERATURE");
    object oHi   = oTHi.DPByHssDP("HUMIDITY");
    object oSchimmel = dom.GetObject("RaumXY_Schimmel");
	object oLueften = dom.GetObject("RaumXY_Lueften");
    object oTHa = dom.GetObject("Aussen_TempFeuSens:1");
    object oTa = oTHa.DPByHssDP("TEMPERATURE");
    object oHa   = oTHi.DPByHssDP("HUMIDITY");
	! Programmteil Lüftungsempfehlung
	! Lokale Variablen
    real tin = oTi.Value(); ! Temperatur in °C innen
    integer rfin = oHi.Value(); ! relative Feuchte in % innen
	real afin;  ! absolute feuchte in g/kg innen
	real tau = oTa.Value(); ! Temperatur in °C außen
    integer rfau = oHi.Value(); ! relative Feuchte in % außen
 	real    afau; ! absolute feuchte in g/kg außen
	! Berechnung der absoluten Feuchte innen
    if (tin < 0.0) {tin = 0.0;}
    if (tin < 10.0)
    { afin = (3.78 + (0.29 * tin) + (0.0046 * tin * tin) + (0.00051 * tin * tin * tin)) * 0.01 * rfin;
    }
    else
    { afin = (7.62 + (0.51 * (tin-10.0)) + (0.0143 * (tin-10.0) * (tin-10.0)) + (0.00045 * (tin-10.0) * (tin-10.0) * (tin-10.0))) * 0.01 * rfin;
    }
	! Berechnung der absoluten Feuchte außen
	if (tau < 0.0) {tau = 0.0;}
    if (tau < 10.0)
    { afau = (3.78 + (0.29 * tau) + (0.0046 * tau * tau) + (0.00051 * tau * tau * tau)) * 0.01 * rfau;
    }
    else
    { afau = (7.62 + (0.51 * (tau-10.0)) + (0.0143 * (tau-10.0) * (tau-10.0)) + (0.00045 * (tau-10.0) * (tau-10.0) * (tau-10.0))) * 0.01 * rfau;
    }
	! Berechnung der Lüftungsempfehlung
	if (afau < afin) {oLueften.Variable(true);}
    else {oLueften.Variable(false);}	
	! Programmteil Schimmelwarnung
	! Berechnung der Oberflächentemperatur der Außenwandecke
    real tw; ! Oberfächentemperatur der Außenwandecke in °C
    real ta = oTa.Value(); ! Außentemperatur in °C
    real ti = oTi.Value(); ! Raumtemperatur in °C
    tw = ti + ((0.13 / 0.268) * (ta - ti)); ! Rges = 0.268 empirisch ermittelt
	! Lokale Variablen
    real    t;    ! Temperatur in °C
    integer rf; ! relative Feuchte in %
    real    afw;  ! Schimmelwarn-Grenzfeuchte in g/kg
    real    afa;  ! Schimmelalarm-Grenzfeuchte in g/kg
    t = tw;
    ! Berechnung Warn-Grenzfeuchte
    rf = 70;
    if (t < 0.0) {t = 0.0;}
    if (t < 10.0)
    { afw = (3.78 + (0.29 * t) + (0.0046 * t * t) + (0.00051 * t * t * t)) * 0.01 * rf;
    }
    else
    { afw = (7.62 + (0.51 * (t-10.0)) + (0.0143 * (t-10.0) * (t-10.0)) + (0.00045 * (t-10.0) * (t-10.0) * (t-10.0))) * 0.01 * rf;
    }
    ! Berechnung Alarm-Grenzfeuchte
    rf = 80;
    if (t < 0.0) {t = 0.0;}
    if (t < 10.0)
    { afa = (3.78 + (0.29 * t) + (0.0046 * t * t) + (0.00051 * t * t * t)) * 0.01 * rf;
    }
    else
    { afa = (7.62 + (0.51 * (t-10.0)) + (0.0143 * (t-10.0) * (t-10.0)) + (0.00045 * (t-10.0) * (t-10.0) * (t-10.0))) * 0.01 * rf;
    }
 	! Schimmelwarnung
	! 0 - keine Gefahr
	! 1 - Warnung
	! 2 - Alarm
	if (afin > afw) {oSchimmel.Variable(1);}
    else {
      if (afin > afa) {oSchimmel.Variable(2);}
      else {oSchimmel.Variable(0);}
    }
Das Script wird auf jeden Fall schneller abgearbeitet, scheint mir auf den ersten Blick bezüglich der Warnung jedoch etwas empfindlicher zu sein als mein altes Script mit den Taupunkten. Das werde ich mir mal einige Zeit anschauen und ggf. versuchen, den Rges zu optimieren. Der nächste Winter steht ja schon vor der Tür und wird bestimmt einige Gelegenheit für diesbezügliche Messungen bieten.
Danke nochmal für den Tipp.
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

paul53
Beiträge: 2554
Registriert: 26.04.2012, 20:42
Wohnort: Berlin
Danksagung erhalten: 15 Mal

Re: Script zur Berechnung der absoluten Feuchte

Beitrag von paul53 » 11.09.2012, 11:04

Deine Auswertung von afa funktioniert nicht, da immer gilt: afa > afw

Code: Alles auswählen

       ! Schimmelwarnung
       ! 0 - keine Gefahr
       ! 1 - Warnung
       ! 2 - Alarm
       if (afin > afw) {oSchimmel.Variable(1);}
        else {
          if (afin > afa) {oSchimmel.Variable(2);}
          else {oSchimmel.Variable(0);}
        }
Du kannst es machen wie oben beschrieben (ohne else), oder so:

Code: Alles auswählen

        if (afin > afa) {oSchimmel.Variable(2);}
        else {
          if (afin > afw) {oSchimmel.Variable(1);}
          else {oSchimmel.Variable(0);}
        }
Damit die Lüftungsempfehlung im Grenzbereich nicht ständig pendelt, würde ich eine Hysterese verwenden (0.5 g/kg) und Messungenauigkeiten berücksichtigen:

Code: Alles auswählen

  ! Berechnung der Lüftungsempfehlung
   if (afau < afin - 0.8) {oLueften.Variable(true);}
   else 
   { if (afau >= afin - 0.3) {oLueften.Variable(false);}
   }
Versionen: HM-CC-TC 2.1, HM-LC-Sw1 1.9, HM-CC-RT-DN 1.1, HM-MOD-RPI-PCB 1.2.1 (keine CCU)

Benutzeravatar
JPS
Beiträge: 1093
Registriert: 07.08.2010, 22:51
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 8 Mal
Danksagung erhalten: 20 Mal
Kontaktdaten:

Re: Script zur Berechnung der absoluten Feuchte

Beitrag von JPS » 14.09.2012, 22:00

Ja, du hast natürlich Recht. Ich hatte mich schon gewundert, warum sich bei der Schimmel-Variablen so wenig ändert aber bislang noch nicht die Zeit gehabt, das nochmal zu verifizieren. Herzlichen Dank !

Seit einigen Tagen habe ich es nun korrigiert und es funktioniert nun gut. Das zugehörige Entfeuchter-Script habe ich so umgestellt, dass der Entfeuchter nur noch bei Schimmelalarm (nicht mehr bei Warnung) läuft. Das scheint mir in der Praxis ein guter Kompromiss zu sein. Wenn es jetzt kälter wird, werde ich versuchen, den Rges noch etwas genauer zu bestimmen und dann mal sehen.

Die Hysterese der Lüftungsempfehlung habe ich eben erst eingebaut, da mir dieser Absatz vorher nicht aufgefallen war (hast du wohl nachgetragen). Daher kann ich noch nicht absehen, wie sie sich in der Praxis verhält. Ich werde mir allerdings wirklich mal diese Klappenanzeige zur Anzeige der Lüftungsempfehlung zulegen und in dem Durchgangs-Kellerraum installieren, dann sieht man sofort, ob die Tür bei Aufenthalten im Garten besser auf oder zu bleibt.

Falls jemand das komplette korrigierte Script benötigt:

Code: Alles auswählen

    ! RaumXY Berechnung der Schimmelwarnung und Lüftungsempfehlung 
    object oTHi = dom.GetObject("RaumXY_Raumregler:1");
    object oTi   = oTHi.DPByHssDP("TEMPERATURE");
    object oHi   = oTHi.DPByHssDP("HUMIDITY");
    object oSchimmel = dom.GetObject("RaumXY_Schimmel");
	object oLueften = dom.GetObject("RaumXY_Lueften");
    object oTHa = dom.GetObject("Aussen_TempFeuSens:1");
    object oTa = oTHa.DPByHssDP("TEMPERATURE");
    object oHa   = oTHi.DPByHssDP("HUMIDITY");
	! Programmteil Lüftungsempfehlung
	! Lokale Variablen
    real tin = oTi.Value(); ! Temperatur in °C innen
    integer rfin = oHi.Value(); ! relative Feuchte in % innen
	real afin;  ! absolute feuchte in g/kg innen
	real tau = oTa.Value(); ! Temperatur in °C außen
    integer rfau = oHi.Value(); ! relative Feuchte in % außen
 	real    afau; ! absolute feuchte in g/kg außen
	! Berechnung der absoluten Feuchte innen
    if (tin < 0.0) {tin = 0.0;}
    if (tin < 10.0)
    { afin = (3.78 + (0.29 * tin) + (0.0046 * tin * tin) + (0.00051 * tin * tin * tin)) * 0.01 * rfin;
    }
    else
    { afin = (7.62 + (0.51 * (tin-10.0)) + (0.0143 * (tin-10.0) * (tin-10.0)) + (0.00045 * (tin-10.0) * (tin-10.0) * (tin-10.0))) * 0.01 * rfin;
    }
	! Berechnung der absoluten Feuchte außen
	if (tau < 0.0) {tau = 0.0;}
    if (tau < 10.0)
    { afau = (3.78 + (0.29 * tau) + (0.0046 * tau * tau) + (0.00051 * tau * tau * tau)) * 0.01 * rfau;
    }
    else
    { afau = (7.62 + (0.51 * (tau-10.0)) + (0.0143 * (tau-10.0) * (tau-10.0)) + (0.00045 * (tau-10.0) * (tau-10.0) * (tau-10.0))) * 0.01 * rfau;
    }
	! Berechnung der Lüftungsempfehlung
    if (afau < afin - 0.8) {oLueften.Variable(true);}
    else
    { if (afau >= afin - 0.3) {oLueften.Variable(false);}
    }
	! Programmteil Schimmelwarnung
	! Berechnung der Oberflächentemperatur der Außenwandecke
    real tw; ! Oberfächentemperatur der Außenwandecke in °C
    real ta = oTa.Value(); ! Außentemperatur in °C
    real ti = oTi.Value(); ! Raumtemperatur in °C
    tw = ti + ((0.13 / 0.268) * (ta - ti)); ! Rges = 0.268 empirisch ermittelt
	! Lokale Variablen
    real    t;    ! Temperatur in °C
    integer rf; ! relative Feuchte in %
    real    afw;  ! Schimmelwarn-Grenzfeuchte in g/kg
    real    afa;  ! Schimmelalarm-Grenzfeuchte in g/kg
    t = tw;
    ! Berechnung Warn-Grenzfeuchte
    rf = 70;
    if (t < 0.0) {t = 0.0;}
    if (t < 10.0)
    { afw = (3.78 + (0.29 * t) + (0.0046 * t * t) + (0.00051 * t * t * t)) * 0.01 * rf;
    }
    else
    { afw = (7.62 + (0.51 * (t-10.0)) + (0.0143 * (t-10.0) * (t-10.0)) + (0.00045 * (t-10.0) * (t-10.0) * (t-10.0))) * 0.01 * rf;
    }
    ! Berechnung Alarm-Grenzfeuchte
    rf = 80;
    if (t < 0.0) {t = 0.0;}
    if (t < 10.0)
    { afa = (3.78 + (0.29 * t) + (0.0046 * t * t) + (0.00051 * t * t * t)) * 0.01 * rf;
    }
    else
    { afa = (7.62 + (0.51 * (t-10.0)) + (0.0143 * (t-10.0) * (t-10.0)) + (0.00045 * (t-10.0) * (t-10.0) * (t-10.0))) * 0.01 * rf;
    }
 	! Schimmelwarnung
	! 0 - keine Gefahr
	! 1 - Warnung
	! 2 - Alarm
	if (afin > afa) {oSchimmel.Variable(2);}
        else {
            if (afin > afw) {oSchimmel.Variable(1);}
            else {oSchimmel.Variable(0);}
        }
Nochmals danke!
Verwendung meiner Hinweise und Skripte auf eigenes Risiko | Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung

Wildshunter
Beiträge: 98
Registriert: 10.09.2009, 22:10

Re: Script zur Berechnung der absoluten Feuchte

Beitrag von Wildshunter » 02.10.2012, 21:35

Hallo!
Erstmal vielen Dank für das Script, ich habe es jetzt mal hier testweise für das Badezimmer eingesetzt.
Momentan herrschen folgende Temperaturen und Luftfeuchtigkeiten:

Bad: 19,5 Grad und 64% Luftfeuchtigkeit (wird gerade gelueftet)
Aussensensor: 16,7Grad und 69% Luftfeuchtigkeit

Was mich wundert: die Variablen zeigen nun:

Empfehlung Lueften!
Schimmel 0: Keine Gefahr

Hmmmm..... kann die Empfehlung stimmen, bin mir hier unsicher....

Danke

Antworten

Zurück zu „Softwareentwicklung für die HomeMatic CCU“