Script zur Berechnung des Feuchtegehalts

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

Moderator: Co-Administratoren

Benutzeravatar
Franke4711
Beiträge: 2
Registriert: 15.01.2019, 20:09

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von Franke4711 » 06.12.2023, 19:21

Guten Abend,

nach stundenlanger Probiererei muss ich jetzt trotzdem den Thread hier ausgraben...

Ich möchte eigentlich genau die gleiche Funktion des Garagenlüftens wie "leilei" und habe mir das Script von "schlichi" eingefügt. Leider werden meine Systemvariablen nicht beschrieben. Was mach ich verkehrt?

Hier das Script:

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("Luftqualität Garage");			        ! xxx Kanal innen HmIPW-WTH (Thermostat, WoZi-, :1 ersetzen)
    object oTi = oTHi.DPByHssDP("ACTUAL_TEMPERATURE");
    object oHi = oTHi.DPByHssDP("ACTUAL_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("Luftqualität Außen");				! 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); }


!Die absolute Luftfeuchte drinnen und draußen in eine Variable schreiben

dom.GetObject("Luftfeuchte Garage").State(afin); !Innen
dom.GetObject("Luftfeuchte Außen").State(afau); !Außen



! xxx Programmende xxxxxxx

Und hier das Programm, Geräte und Variablen:
SysVar.jpg
Programm.jpg
Geräte.jpg

Das Programm hat nur zum Testen den Taster als Auslöser. Wenn das Script funktioniert, dann soll er tagsüber alle 15 Minuten testen, ob gelüftet werden kann.

Vielen Dank für eure Hilfe!


Viele Grüße
Julian

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

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von schlichi » 06.12.2023, 20:57

Hallo,

da Du Hilfe suchst, versuche ich zu helfen. Das angepasste und mit Ausgaben (WriteLines) versehene Script ist allerdings nicht getestet!

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
! 08.12.2023 / GS

! xxx Name des Datenkanals des Innensensors
    object oTHi = (dom.GetObject(ID_CHANNELS)).Get("Luftqualität Garage");			        ! xxx Kanal innen
    object oTi = oTHi.DPByHssDP("ACTUAL_TEMPERATURE");
    object oHi = oTHi.DPByHssDP("HUMIDITY");
	
! xxx Name der SysVar 
    object oLueften = (dom.GetObject(ID_SYSTEM_VARIABLES)).Get("Garage lüften");			! xxx SysVar (Garage lüften, muss angelegt sein, ggf. ersetzen)
	
! xxx Name des Datenkanals des Aussensensors
   object oTHi = (dom.GetObject(ID_CHANNELS)).Get("Luftqualität Außen");					! xxx Kanal aussen
    object oTa = oTHa.DPByHssDP("ACTUAL_TEMPERATURE");
    object oHa = oTHa.DPByHssDP("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); }


!Die absolute Luftfeuchte drinnen und draußen in eine Variable schreiben

dom.GetObject(ID_SYSTEM_VARIABLES).Get("Luftfeuchte Garage").State(afin); !Innen
dom.GetObject(ID_SYSTEM_VARIABLES).Get("Luftfeuchte Außen").State(afau); !Außen

! xxx Programmende xxxxxxx

! xxx *********************************************************************************************
! xxx Parameter für Testprogramm Garage xxxx
! xxx *********************************************************************************************
!WriteLine(" xxx Parameter für Testprogramm Garage xxxx ");
!WriteLine(" ");
!WriteLine(oTi);
!WriteLine("Temperatur innen:	\t" # tin # " °C ");
!WriteLine(oHi);
!WriteLine("abs. Feuchte innen: \t" # afin # " g/kg ");
!WriteLine(" ");
!WriteLine(oTa);
!WriteLine("Temperatur außen: 	\t" # tau # " °C ");
!WriteLine(oHa);
!WriteLine("abs. Feuchte außen: \t" # afau # " g/kg ");
!WriteLine(" ");
!WriteLine("Lüftungsempfehlung:	\t" # oLueften.Variable());
Teste mal das Script, für die direkte Ausgabe, !-Zeichen vor WriteLine entfernen.

Wenn Fragen, mit Ausgaben, bitte melden! :wink:

Gruß
schlichi

Edit: Datenpunkte geändert
... inzwischen autodidakter, fortgeschrittener Anfänger mit bestandener Einstiegsprüfung für den Expertenmodus Teil 3 (erfahrener Anwender) :roll:

Benutzeravatar
Franke4711
Beiträge: 2
Registriert: 15.01.2019, 20:09

Re: Script zur Berechnung des Feuchtegehalts

Beitrag von Franke4711 » 21.12.2023, 13:51

Guten Tag,

ich entschuldige mich für die späte Rückmeldung.

Mein Script läuft jetzt schon knapp 2 Wochen und es sieht wie folgt aus:

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("Luftqualität Garage");			        ! xxx Kanal innen HmIP-STHO
    object oTi = oTHi.DPByHssDP("ACTUAL_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)
	object oSchimmel = dom.GetObject("Garage Schimmel");
	
	
! xxx Name des Datenkanals des Aussensensors
    object oTHa = dom.GetObject("Luftqualität Außen");				! xxx Kanal aussen HmIP-STHO
    object oTa = oTHa.DPByHssDP("ACTUAL_TEMPERATURE");
    object oHa = oTHa.DPByHssDP("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); }

! 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.5) * (ta - ti)); ! Rges = 0.5 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.State(2);}
        else {
            if (afin > afw) {oSchimmel.State(1);}
            else {oSchimmel.State(0);}}


!Die absolute Luftfeuchte drinnen und draußen in eine Variable schreiben

dom.GetObject("Luftfeuchte Garage").State(afin); !Innen
dom.GetObject("Luftfeuchte Außen").State(afau); !Außen



! xxx Programmende xxxxxxx



Vielen Dank für deine Hilfe schlichi.

Eine schöne Weihnachtszeit. Viele Grüße Julian

Antworten

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