Script zur Berechnung des Feuchtegehalts

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

Moderator: Co-Administratoren

sascha91
Beiträge: 10
Registriert: 07.01.2018, 18:24

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von sascha91 » 03.10.2021, 19:23

Hallo, mit dem Skript stelle ich mich etwas dumm an.

Ich habe das Skript hier etwas Abgeändert, es soll immer gelüftet werden(Lüfter hat Wärmerückgewinnung) wenn es draussen trockener wie drinnen ist. Die Schimmelwarnung benötige ich nicht.

Allerdings wird die Variable nicht umgestellt ich denke da ist noch ein Fehler im Skript, ich hoffe mir kann da jemand helfen.

Code: Alles auswählen

! Vermietung Berechnung der Lüftungsempfehlung 
    object oTHi = dom.GetObject("Vermietung_Wandthermostat_Daten:1");
    object oTi = oTHi.DPByHssDP("TEMPERATURE");
    object oHi = oTHi.DPByHssDP("HUMIDITY");

    object oLueften = dom.GetObject("Vermietung_Lueften");

    object oTHa = dom.GetObject("Aussentemperatur_und_Feuchtigkeit_Daten:2");
    object oTa = oTHa.DPByHssDP("ACTUAL_TEMPERATURE");
    object oHa = oTHa.DPByHssDP("ACTUAL_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 = oHa.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 mit 0,5 g/kg und 0,7 K Hysterese
	if ((afau <= (afin - 0.8)) && (tin > 18.0))
	{oLueften.State(true);}
	else
	{ if ((afau >= (afin - 0.3)) || (tin <= 15.0))
	{oLueften.State(false);}
	}
	
Zuletzt geändert von alchy am 03.10.2021, 20:04, insgesamt 1-mal geändert.
Grund: Code in Codetags posten

Tyfys
Beiträge: 544
Registriert: 17.04.2021, 17:12
System: CCU
Hat sich bedankt: 27 Mal
Danksagung erhalten: 123 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von Tyfys » 03.10.2021, 20:01

Du setzt am Ende des Scriptes oLueften nach unterschiedlichen Bedingungen auf true / false

Code: Alles auswählen

! Berechnung der Lüftungsempfehlung mit 0,5 g/kg und 0,7 K Hysterese
if ((afau <= (afin - 0.8)) && (tin > 18.0))
{oLueften.State(true);}
else
{ if ((afau >= (afin - 0.3)) || (tin <= 15.0))
{oLueften.State(false);}
Was soll denn passieren, wenn weder die eine noch die andere Bedingung zutrifft?

Gruß
Harry
Gruß
Harry

Benutzeravatar
Baxxy
Beiträge: 10740
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 599 Mal
Danksagung erhalten: 2197 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von Baxxy » 03.10.2021, 20:08

sascha91 hat geschrieben:
03.10.2021, 19:23
es soll immer gelüftet werden(Lüfter hat Wärmerückgewinnung) wenn es draussen trockener wie drinnen ist.
Dann können die Temperaturprüfungen im letzten Abschnitt auch weg.

Code: Alles auswählen

&& (tin > 18.0))
|| (tin <= 15.0))

Code: Alles auswählen

if (afau <= (afin - 0.8)) {
oLueften.State(true);
}
else {
oLueften.State(false);
}
Grüße, Baxxy

Benutzeravatar
leilei
Beiträge: 110
Registriert: 12.02.2014, 02:03
Wohnort: Klagenfurt
Hat sich bedankt: 23 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von leilei » 09.03.2022, 22:26

Hallo,
geht das Skript auch für Temperaturen unter 0 Grad?
Es wäre für eine alleinstehende (voll isolierte) Garage, die innen bei der Tür Schimmel ansetzt wegen zu hoher Luftfeuchte …
Grüße leilei

Benutzeravatar
leilei
Beiträge: 110
Registriert: 12.02.2014, 02:03
Wohnort: Klagenfurt
Hat sich bedankt: 23 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von leilei » 10.03.2022, 12:46

Welche Skripte müßte ich verwenden (mit oder ohne CUxD), um:

das Hörmann-Garagentor nur bei innen höherer Luftfeuchte als außen zu öffnen (Lüftungsposition) und
evtl. einen Lüfter mit einzuschalten ...

Ich brauche keine Schimmelwarnung etc. ...
Innen: 1x HmIPW-WTH
Außen: 1x HmIP-STHO
1x Hörmannmodul HmIP-MOD-HO
CCU3
Und mit der Skriptprogrammierung hab ich´s nicht gar so drauf

Hintergrund: Hörmann bietet ein eigenes Klimasensoren-Set an, das auch am Hörmann-Bus angeschlossen wird.
Da jedoch hängt schon das ELV-Modul und somit siend die Hörmann-Sensoren so nicht verwendbar.
(https://www.tor7.de/media/pdf/12/fc/c1/ ... eitung.pdf)

Grüße leilei

MichaelN
Beiträge: 9638
Registriert: 27.04.2020, 10:34
System: CCU
Hat sich bedankt: 697 Mal
Danksagung erhalten: 1614 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von MichaelN » 10.03.2022, 12:58

Gelöscht, war Quatsch
LG, Michael.

Wenn du eine App zur Bedienung brauchst, dann hast du kein Smarthome.

Wettervorhersage über AccuWeather oder OpenWeatherMap+++ Rollladensteuerung 2.0 +++ JSON-API-Ausgaben auswerten +++ undokumentierte Skript-Befehle und Debugging-Tipps +++

schlichi
Beiträge: 387
Registriert: 26.08.2016, 19:26
System: Alternative CCU (auf Basis OCCU)
Wohnort: Erding
Hat sich bedankt: 60 Mal
Danksagung erhalten: 28 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von schlichi » 10.03.2022, 16:01

Hallo leilei,

...heute kommen die gebratenen Tauben geflogen, mit Beilage :D

Versuch´s mal damit:

Code: Alles auswählen

! xxx Berechnung der Lüftungsempfehlung xxxxxx
! Quelle: https://homematic-forum.de/forum/viewtopic.php?p=71326#p71326
! (C) basierend auf paul53
! 10.03.2022 / GS

! xxx Name des Datenkanals des Innensensors
    object oTHi = dom.GetObject("Thermostat, WoZi-, :1");			! xxx Kanal innen HmIPW-WTH (Thermostat, WoZi-, :1 ersetzen)
    object oTi = oTHi.DPByHssDP("TEMPERATURE");
    object oHi = oTHi.DPByHssDP("HUMIDITY");
	
! xxx Name der SysVar 
    object oLueften = dom.GetObject("Garage lüften");				! xxx SysVar (Garage lüften, muss angelegt sein, ggf. ersetzen)
	
! xxx Name des Datenkanals des Aussensensors
    object oTHa = dom.GetObject("Sensor, LFT-, :1");				! xxx Kanal aussen HmIPW-STHO (Sensor, LFT-, :1 ersetzen)
    object oTa = oTHa.DPByHssDP("ACTUAL_TEMPERATURE");
    object oHa = oTHa.DPByHssDP("ACTUAL_HUMIDITY");

! xxx Programmteil Lüftungsempfehlung xxxxxx

! 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 = oHa.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 mit 0,8 g/kg Hysterese und update der SysVar
	if ( afau <= ( afin - 0.8 ) ) 
			{ oLueften.State(true); }
		else 
			{ oLueften.State(false); }

! xxx Programmende xxxxxxx

Die Variable (SysVar) entsprechend, ggf. mit eigenem Namen, dann aber auch im Script ändern!
Garage.JPG
Mit Deiner Anforderung
... einen Lüfter mit einzuschalten ...
kommst Du klar?

Da war doch noch,..
... geht das Skript auch für Temperaturen unter 0 Grad?
.. ja, ist abgefragt :D , denn dann klebt die Luftfeuchte auch an deiner isolierten Garagenwand, bzw. liegt als Eiskristalle auf dem Boden.

Gruß
schlichi
... inzwischen autodidakter, fortgeschrittener Anfänger mit bestandener Einstiegsprüfung für den Expertenmodus Teil 3 (erfahrener Anwender) :roll:

Benutzeravatar
leilei
Beiträge: 110
Registriert: 12.02.2014, 02:03
Wohnort: Klagenfurt
Hat sich bedankt: 23 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von leilei » 11.03.2022, 01:03

Hi schlichi,
Danke für die rasante Antwort !!!
Da sind aber gebratene Puten mit Pommes und Salat geflogen gekommen.
Ich bewundere Euch immer wieder, wie Ihr in so kurzer Zeit funktionierende Skripte zusammenstellen könnt.
Dein Skript läuft jetzt in der Testumgebung, auch der Lüfter würde schalten.
Jetzt kann ich die mechanische Adaptierung für das Sektionaltor (Belüftungsstellung - öffnet nur oben und nicht unten) bestellen und dann das Programm darauf loslassen.
Danke leilei

Benutzeravatar
Henke
Beiträge: 1520
Registriert: 27.06.2022, 20:51
System: CCU
Hat sich bedankt: 140 Mal
Danksagung erhalten: 306 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von Henke » 30.05.2023, 00:15

Die Berechnungen sind falsch:

Web Rechner: https://rechneronline.de/barometer/luftfeuchtigkeit.php

Code: Alles auswählen

! xxx Berechnung der Lüftungsempfehlung xxxxxx
! Quelle: https://homematic-forum.de/forum/viewtopic.php?p=71326#p71326
! (C) basierend auf paul53
! 10.03.2022 / GS


! xxx Programmteil Lüftungsempfehlung xxxxxx

! Lokale Variablen
    real tin = 24; ! Temperatur in °C innen
    integer rfin = 53; ! relative Feuchte in % innen
	real afin;  ! absolute feuchte in g/kg innen
	real tau = 15.8; ! Temperatur in °C außen
    integer rfau = 45; ! 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 mit 0,8 g/kg Hysterese und update der SysVar

! xxx Programmende xxxxxxx

real _Temp = tin.ToFloat();
real _Feuchte = rfin.ToFloat();
real rA = 7.5;
real rB = 237.3;
real rDD = 6.1078 * (10.0).Pow( (rA * _Temp) / (rB + _Temp)) * _Feuchte / 100.0;
real rV = (rDD / 6.1078).Log10();
real Taupunkt = (rB * rV / (rA - rV));
real AbsFeuchte = ((10.0).Pow( 5.0) * (18.016 / 8314.3) * rDD / (_Temp + 273.15));

WriteLine ( "Abs. Feuchte: Soll(Web) 11.53 Formel Forum: " # afin.ToString(2) # " meine "  #   AbsFeuchte.ToString(2) );
WriteLine ( "q.e.d" );
Das ergibt dann:
Abs. Feuchte: Soll(Web) 11.53 Formel Forum: 9.96 meine 11.53
q.e.d

Hier die Version die ich in JavaScript unter NodeRed nutzt umgeschrieben in HM Script:

Code: Alles auswählen

! Berechnung der Lüftungsempfehlung mit Wärmedurchgangswert der Wand
! M. Henke
! Copyleft

real rInnenTemp = 24.0;
real rInnenHum = 53.0;
real rAussenTemp = 15.8;
real rAussenHum = 450.;
real rAussenMittel = rAussenTemp; ! Außentemperatur - besser Tagesdurchschnitt
real rRges = 0.5; ! Rges = Z.ZZZ empirisch ermittelt

! Rges errechnen aus gemessener Wandtemperatur und durchschnittlicher Außentemperatur
real tempWand = 0.0;

!------------------------------

if ( tempWand > 0 ){
rRges = (0.13 / (tempWand - rInnenTemp)) * (rAussenMittel - rInnenTemp);
WriteLine ( "rRges: " #  rRges.ToString(2) );
}

real rA = 7.5;
real rB = 237.3; ! für T >= 0

real _Temp = rAussenTemp;
real _Feuchte = rAussenHum;
real rDD = 6.1078 * (10.0).Pow( (rA * _Temp) / (rB + _Temp)) * _Feuchte / 100.0;
real rV = (rDD / 6.1078).Log10();
real AussenTaupunkt = (rB * rV / (rA - rV));
real AussenAbsFeuchte = ((10.0).Pow( 5.0) * (18.016 / 8314.3) * rDD / (_Temp + 273.15));

real _Temp = rInnenTemp;
real _Feuchte = rInnenHum;
real rDD = 6.1078 * (10.0).Pow( (rA * _Temp) / (rB + _Temp)) * _Feuchte / 100.0;
real rV = (rDD / 6.1078).Log10();
real Taupunkt = (rB * rV / (rA - rV));
real AbsFeuchte = ((10.0).Pow( 5.0) * (18.016 / 8314.3) * rDD / (_Temp + 273.15));

! Oberfächentemperatur der Außenwandecke in °C
real     wandTemp = rInnenTemp + ((0.13 / rRges) * (rAussenMittel - rInnenTemp));
real Esat = 611.2 * (17.62 * wandTemp / (243.12 + wandTemp)).Exp();
real EsatI = 611.2 * ((17.62 * rInnenTemp) / (243.12 + rInnenTemp)).Exp();
real E = EsatI * rInnenHum / 100.0;
real    wandrelF = (E / Esat) * 100.0;

real _Temp = wandTemp;
real _Feuchte = wandrelF;
real rDD = 6.1078 * (10.0).Pow( (rA * _Temp) / (rB + _Temp)) * _Feuchte / 100.0;
real rV = (rDD / 6.1078).Log10();
real WandTaupunkt = (rB * rV / (rA - rV));
real WandAbsFeuchte = ((10.0).Pow( 5.0) * (18.016 / 8314.3) * rDD / (_Temp + 273.15));

WriteLine ( "Innen:  Temp. " # rInnenTemp.ToString(2) # " - Feuchte "  #   rInnenHum.ToString(0) # " - Abs. Feuchte "  #   AbsFeuchte.ToString(2) # " - Taupunkt "  #   Taupunkt.ToString(2));
WriteLine ( "Wand:   Temp. " # wandTemp.ToString(2) # " - Feuchte "  #   wandrelF.ToString(0) # " - Abs. Feuchte "  #   WandAbsFeuchte.ToString(2) # " - Taupunkt "  #   WandTaupunkt.ToString(2));
WriteLine ( "Außen:  Temp. " # rAussenTemp.ToString(2) # " - Feuchte "  #   rAussenHum.ToString(0) # " - Abs. Feuchte "  #   AussenAbsFeuchte.ToString(2) # " - Taupunkt "  #   AussenTaupunkt.ToString(2));

boolean Lueften = false;

if ( wandrelF >= 90 ) { WriteLine ( "Schimmelalarm!" ); Lueften = true; }
if ( !Lueften ){
	if ( wandrelF >= 80 ) { WriteLine ( "Schimmelwarnung" ); Lueften = true; }
}

if ( !Lueften ){
! bis 60% sind gut, aber 80 an der Wand zu viel
    if ((rInnenHum > 60) || (wandrelF >= 80))    {
    ! Luft Außen zu feucht
        if (AussenAbsFeuchte <= (AbsFeuchte - 0.8))        {
                Lueften = true;
        }
    }
}

if ( Lueften ) { WriteLine ( "Lüften" ); }

schlichi
Beiträge: 387
Registriert: 26.08.2016, 19:26
System: Alternative CCU (auf Basis OCCU)
Wohnort: Erding
Hat sich bedankt: 60 Mal
Danksagung erhalten: 28 Mal

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von schlichi » 15.07.2023, 19:18

Hallo "Henke",

deine Behauptung die Berechnung sei falsch kann ich nicht nachvollziehen, auch wenn Du scheinbar einen Beweis lieferst.
Dir ist entgangen, daß die Berechnung im Script in g/kg erfolgt.
real afin; ! absolute feuchte in g/kg innen
Dein herangeführter "Beweis" lautet auf g/m³

Insofern ist Deine Behauptung irreführend.

Falls jemand die Berechnung in g/m³ benötigt, im Forum ist die Formel zu finden

Gruß
schlichi
... inzwischen autodidakter, fortgeschrittener Anfänger mit bestandener Einstiegsprüfung für den Expertenmodus Teil 3 (erfahrener Anwender) :roll:

Antworten

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