HomeMatic Tutorial

HomeMatic – Raumklimaüberwachung und Entfeuchtung

Überwachung des Raumklimas und Steuerung von Klimageräten sind klassische Aufgaben der Hausautomatisierung. Der folgende Beitrag wurde in Abstimmung mit dem Nutzer „paul53“ aus dem HomeMatic-Forum erstellt und erläutert für das HomeMatic-System eine Methode zur Analyse des Raumklimas und zur Unterstützung der Bewohner bei der optimalen Raumlüftung und Schimmelvermeidung.


Features:
Berechung der absoluten Feuchte
Schimmelgefahranalyse
Lüftungsempfehlung
Entfeuchter- bzw. Lüftersteuerung
Optische Anzeige des Ergebnisses der Schimmelgefahranalyse und der Lüftungsempfehlung

1. Grundlagen und Begriffsbestimmungen

Als Grundlage für die Beschäftigung mit diesem Themenkomplex ist es sinnvoll, sich zunächst mit einigen physikalischen Rahmenbedingungen auseinanderzusetzen.

Die absolute Luftfeuchtigkeit ist die in der jeweils betrachteten Luftmasse tatsächliche enthaltene Wassermenge. Sie wird in \frac{g}{m^3} oder \frac{g}{kg} angegeben.

Als relative Luftfeuchtigkeit wird dagegen die in der jeweils betrachteten Luftmasse enthaltene Wassermenge im Verhältnis zu der Wassermenge bezeichnet, die dieselbe Luftmenge bei gleicher Temperatur maximal enthalten kann. Dieser Wert wird in der Regel in \% angegeben.

Wenn die Wassermenge 100 % relative Luftfeuchtigkeit erreicht, bezeichnet man das als Sättigung. Bei Überschreitung dieser Wassermenge bildet sich an Gegenständen (z.B. der Außenwand des Raumes) Tauwasser, da ein Teil der in der Luft enthaltenen Feuchtigkeit kondensiert. Die Temperatur, ab der dies auftritt, wird Taupunkttemperatur genannt. Diese ist wiederum abhängig vom absoluten Feuchtegehalt der Luft.

Die diesbezügliche Zusammenhänge lassen sich aus dem Mollier-h-x-Diagramm ableiten, sie im Einzelnen zu beschreiben würde den Rahmen dieses Artikels sprengen, weswegen allen an Detailinformationen interessierten Leserinnen und Lesern der u.a. Link zu dem entsprechenden Wikipedia-Artikel empfohlen wird.

Hx-Dia Prinzip 1Hx-Dia Prinzip 1.jpg by Harstu at the German language Wikipedia [GFDL or CC-BY-SA-3.0], from Wikimedia Commons, Seite „Mollier-h-x-Diagramm“. In: Wikipedia, Die freie Enzyklopädie. Bearbeitungsstand: 8. Februar 2014, 05:08 UTC. URL: http://de.wikipedia.org/w/index.php?title=Mollier-h-x-Diagramm&oldid=126124634 (Abgerufen: 8. Februar 2014, 15:22 UTC)

In der Praxis besteht die Gefahr der Schimmelbildung, wenn die relative Luftfeuchtigkeit an einer Bauteiloberfläche über mehrere Tage einen Wert von ca. 80 % erreicht. Gemeinhin wird empfohlen, dass die relative Feuchte in Wohnräumen über einen längeren Zeitraum nicht über 60 % liegen soll.

Relativ hohe Luftfeuchtigkeiten bis hin zum Auftreten von Tauwasser bilden sich vor allem an Wärmebrücken der Außenwände.

Zum Austausch der Raumluft ist ein mehrmaliges „Stoßlüften“ während des Tages das gängige und empfohlene Verfahren. Aufgrund der schwankenden absoluten Luftfeuchte in der Außenluft und der dadurch ebenfalls schwankenden Aufnahmekapazität für Luftfeuchtigkeit bei Erwärmung können – insbesondere im Sommer – klimatische Konstellationen auftreten, bei denen ein Lüften die relative Luftfeuchtigkeit innerhalb des Raumes sogar ansteigen ließe. Dadurch würde – entgegen der eigentlichen Absicht – die Gefahr einer Schimmelbildung mit dem Lüften erhöht.

Es ist daher sinnvoll, beim Lüften im Sommer die absolute Lutftfeuchtigkeit außen und innen zu vergleichen und nur dann zu lüften, wenn die absolute Außenfeuchte kleiner ist als die absolute Innenfeuchte.

2. Berechnung der absoluten Feuchte

Die HomeMatic Klimasensoren liefern derzeit nur die relative Luftfeuchtigkeit. Die absolute Luftfeuchtigkeit muss daher errechnet werden. Hierzu gibt es im HomeMatic-System mehrere Möglichkeiten.

Verwendung des CUxD

In den aktuellen Versionen berechnet der CUxD für dort angelegte Klimasensoren die Taupunkttemperatur in °C sowie die absolute Luftfeuchtigkeit in \frac{g}{m^3} nach den Näherungsformeln von wettermail.de.

HomeMatic Sensoren lassen sich über das „Thermostat Wrapper-Device“ des CUxD einbinden und die darüber errechneten Werte in der CCU weiter nutzen.

Details zu diesem Verfahren sind im CUxD-Handbuch beschrieben.

Berechnung mittels CCU-Skript

„paul53“ hat ein Script entwickelt, das auf Grundlage des Mollier-h-x-Diagramms den absoluten Luftfeuchtegehalt in \frac{g}{kg} im Temperaturbereich von 0 °C bis 34 °C in guter Näherung berechnet. Lediglich oberhalb von 34 °C beträgt die Abweichung mehr als 0.1 \frac{g}{kg} :

! Absolute Luftfeuchte 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);

Die Ermittlung der Koeffizienten für den linearen, quadratischen und kubischen Anteil in der im Skript angegebenen Formel erfolgte mittels MS Excel. Als Grundlage hierfür diente die Magnusformel zur Berechnung des Sättigungsdampfdrucks.


Wichtiger Hinweis für alle, die eines der Skripte aus dem HomeMatic-Forum schon länger einsetzen:
„paul53“ hat die Koeffizienten nach der ersten Veröffentlichung seines Skripts noch einmal optimiert, um eine höhere Genauigkeit zu erzielen. Diese Änderung hat er nachträglich im veröffentlichten Skript eingearbeitet.
Bitte prüfen, ob die Koeffizienten in den „Bestands-Skripten“ den o.a. Werten entsprechen und diese ggf. anpassen.

Eine Berechnung der Taupunkttemperatur nach den Näherungsformeln von wettermail.de ist mittels HomeMatic-Skript nicht ohne weiteres möglich, da in HomeMatic-Skript keine Logarithmusfunktionen zur Verfügung stehen. Zur Berechnung müsste man z.B. auf ein extern aufgerufenes TCL-Skript ausweichen. Wer auf diese Weise vorgehen möchte, findet im HomeMatic-Forum den ein oder anderen Ansatz.

3. Schimmelwarnung

Wie oben beschrieben, sollte die relative Luftfeuchtigkeit an kritischen Bauteiloberflächen nicht längere Zeit über 80 % liegen.

Zur Realiserung einer Schimmelwarnung ist daher zunächst die jeweils „kritischste“ Bauteiloberfläche in dem zu betrachtenden Raum empirisch zu ermitteln. Dies gelingt am besten, indem man bei sehr niedrigen Außentemperaturen im Winter mit einem IR-Thermometer in dem Raum die kälteste Stelle an den Außenwänden sucht. Mit hoher Wahrscheinlichkkeit wird diese an einer Wärmebrücke (z.B. an den Fensterlaibungen oder in den Ecken) zu finden sein.


Ideal ist eine Messreihe, während der an mehreren Tagen hintereinander Außentemperatur (t_a) , Raumtemperatur (t_i) und Oberfächentemperatur an der kältetesten Stelle der Außenwand (t_w) in °C bestimmt und in einer Tabelle notiert werden.

Eine einfache Möglichkeit zur Bewertung der Wahrscheinlichkeit für eine Schimmelbildung ist der direkte Vergleich von Wandtemperatur (t_w) und Taupunkttemperatur (t_p) , z.B. nach folgender Regel:


keine Schimmelgefahr, wenn t_w mehr als 2 °C über t_p .
Schimmelwarnung, wenn t_w zwischen 1°C bis 2 °C über t_p .
Schimmelalarm, wenn t_w unter oder bis zu 1 °C über t_p .

Die Taupunkttemperatur sollte bei dieser Methode aus den oben genannten Gründen über das „Thermostat Wrapper-Device“ des CUxD ermittelt werden.

Hier wurde jedoch ein etwas anderer Ansatz gewählt, indem zunächst die absolute Grenzfeuchte für einen Schimmelalarm (80% relative Luftfeuchtigkeit) und die absolute Grenzfeuchte für eine Schimmelwarnung (70% relative Luftfeuchtigkeit) bestimmt und für einen Vergleich mit der absoluten Luftfeuchtigkeit im Raum herangezogen werden.

Bei bekanntem Gesamtwärmedurchgangswiderstand der Wand (R_{ges} in \frac{m^2K}{W} ) lässt sich die die aktuelle Wandtemperatur (t_w) aus der jeweiligen Außentemperatur (t_a) und Raumtemperatur (t_i) wie folgt berechnen:


t_w = t_i + (\frac{0.13}{R_{ges}}*(t_a - t_i))
! Berechnung der Oberflächentemperatur der Außenwand
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));

Der R_{ges} kann berechnet werden, wenn man den genauen Aufbau der Außenwand kennt. In dem meisten Bestandsbauten dürfte dies ohne eine Kernbohrung jedoch schwierig werden. Nach Umstellung der Formel kann der Gesamtwärmedurchgangswiderstand der Wand (R_{ges} ) alternativ auch aus den empirisch ermittelten Werten der bereits angelegten Messreihe bestimmt werden. In die Formel sollte das arithmetische Mittel der jeweiligen Meßwerte eingesetzt werden:


R_{ges} = 0.13 * \frac{(t_a - t_i)}{(t_w - t_i)}

Der Wert 0,13 in der Formel ist der Wärmeübergangswiderstand von der Wandoberfläche zur Raumluft.


Ein normaler Wert für R_{ges} im Bereich einer Fensterlaibung liegt zwischen 0.5 und 1, für Außenwände / Dachschrägen weit über 1.0. Bei extremen Wärmebrücken kann er jedoch auch deutlich unter 0.5 liegen. In diesem Fall sollte man über eine Sanierung nachdenken.
Für das Skript ist es sinnvoll, immer die kälteste Stelle an der Außenwand im Raum (t_w) zu Grunde zu legen.

Nun liegen alle für die Berechnung der absoluten Grenzfeuchten erforderlichen Werte vor:

! 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);

Für die „Schimmelgefahranalyse“ (s) wird die absolute Luftfeuchtigkeit (af_{in}) des Raumes mit den absoluten Grenzfeuchten verglichen:

integer s = 0;  ! Schimmelwarnung
if (afi > afw) {s = 1;}
if (afi > afa) {s = 2;}

Wichtig für eine korrekte Schimmelgefahranalyse und eine darauf basierende Entfeuchtung ist, dass der Gesamtwärmedurchgangswiderstand (R_{ges} ) möglichst nahe der tatsächlichen Außenwandkonstruktion entspricht.

4. Lüftungsempfehlung

Oft ist nicht auf den ersten Blick erkennbar, ob die absolute Luftfeuchtigkeit in einem Innenraum größer als draußen ist und damit bedenkenlos gelüftet werden kann oder ob diese kleiner als außen ist, weswegen eine Lüftung das Schimmelrisiko erhöhen würde. Eine Anzeige für „Nicht Lüften“ oder „Lüften empfohlen“, über eine beliebige HomeMatic-Anzeige und/oder eine Systemvariable ist hier hilfreich.

anzeige04

Die Berechnung der Lüftungsempfehlung (oLueften) in Abhängigkeit von der Außentemperatur (t_{au}) , der Raumtemperatur (t_{in}) sowie der absoluten Luftfeuchtigkeit außen (af_{au}) und im Raum (af_{in}) mit 0,5 \frac{g}{kg} kann über den folgenden Codeschnipsel erfolgen:

! Berechnung der Lüftungsempfehlung mit 0,5 g/kg und 0,7 K Hysterese
if ((afau <= (afin - 0.8)) && (tau <= (tin - 1.0)) && (tin > 20.7))
{oLueften.Variable(true);}
else
{ if ((afau >= (afin - 0.3)) || (tau >= (tin - 0.3)) || (tin <= 20.0))
{oLueften.Variable(false);}
}

Ein Lüften wird immer dann empfohlen, wenn die Außenluft trockener ist als die Innenluft. Somit erfolgt im Winter immer eine Lüftungsempfehlung. Die Lüftungsempfehlung bzw. automatische Lüftung ist für die „kritischen Jahreszeiten“ gedacht (Sommer bzw. die Übergangszeit mit Außentemperaturen über 15°C) . Im Winter muss individuell entschieden werden (manuelle Lüftung).

Die Einbeziehung der Temperaturdifferenz Innen/Außen ergibt sich daraus, dass man im Sommer nicht nur zu feuchte Luft, sondern auch nicht zu warme Luft von außen einströmen lassen will, um den Raum nicht weiter aufzuheizen.


Die Berücksichtigung der Raumtemperatur soll eine zu starke Auskühlung des Raumes im Winter vermeiden, denn die Auskühlung muß anschließend wieder durch die Heizung kompensiert werden. Einen idealen Wert für die Raumtemperaturgrenzen gibt es nicht, denn dieser hängt stark von der Raumnutzung und individuellen Erfordernissen ab. Das hierdurch per se entstehende Dilemma „viel frische Luft“ versus „Energieeinsparung“ muss jeder für sich selbst lösen.

Der Ausschaltwert (im Beispiel 20,0 °C) ist der Wert, unter den die Raumtemperatur nicht sinken soll. Der Einschaltwert ergibt sich aus dem Ausschaltwert plus einer Hysterese (hier 0,7 K), die verhindert, dass die Anzeige im Grenzbereich ständig hin und her wechselt. Somit erhält man neben einer Empfehlung zum Lüften auch eine Empfehlung, das Lüften wieder zu beenden.

5. Steuerung eines Luftentfeuchters bzw. Lüfters

Viele Luftentfeuchter bieten die Möglichkeit, sich automatisch beim Erreichen einer bestimmten relativen Luftfeuchtigkeit einzuschalten. Aufgrund des hohen Energieverbrauchs dieser Geräte ist es aber witschaftlicher, den Entfeuchter automatisiert nur dann einzuschalten, wenn auch eine Gefahr zur Bildung von Schimmel besteht. Zur Steuerung von Luftentfeuchtern gab es bei HomeMatic-Inside mal ein Skript, das zur Schonung des Entfeuchter-Kompressors den Zustand „Ein“ bzw. „Aus“ jeweils mindestens 45 min (2700 sec) lang aufrecht erhält. Dieses Skript lässt sich sehr einfach um eine Abfrage des Ergebnisses der Schimmelgefahranalyse erweitern:

object Feuchtigkeit = dom.GetObject("RaumXY_Raumregler:1.HUMIDITY"); ! Name des Temperatur-/Feuchtesensors im Innenraum
object Entfeuchter = dom.GetObject("RaumXY_Raumregler:1.STATE"); ! Name des Aktors, an dem der Luftentdeuchter angeschlossen ist
object Schimmelgefahr = dom.GetObject("RaumXY_Schimmel"); ! Name der Systemvariablen für die Schimmelgefahranalyse (Werteliste: keine Gefahr;Warnung;Alarm)
time timestamp = Entfeuchter.Timestamp();
time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime();
integer diff = now.ToInteger() - timestamp.ToInteger();
if (diff > 2700) {
  if ((Feuchtigkeit.Value() > 64) && (Entfeuchter.Value() == 0) && (Schimmelgefahr.Value() > 1)) {
     Entfeuchter.State(1);
  }
  if ((Feuchtigkeit.Value() < 64) && (Entfeuchter.Value() == 1)) {
     Entfeuchter.State(0);
  }
}

Statt eines Entfeuchters kann auch ein Wandventilator eingebunden werden. Hierzu bietet es sich an, analog zu der Berechnung der Lüftungsempfehlung vorzugehen und das Ergebnis der Schimmelgefahranalyse (oSchimmel) mit einzubeziehen:

! Prüfen, ob Raum schon zu kalt
if (ti > 20.0)
	{ if ((afau <= (afin - 0.8)) && (ta <= (ti - 1.0)) && (Licht.Value() == 0) && (oSchimmel.Value() == 2))
		{Ventilator.State(1);}
		else
		{ if ((afau >= (afin - 0.3)) || (ta >= (ti - 0.3)) || (Licht.Value() == 1) || (oSchimmel.Value() == 1) || (oSchimmel.Value() == 0))
		{Ventilator.State(0);}
		}
	}
else
	{ if (ti <= 19.5)
	{Ventilator.State(0);}
	}

6. Beispielskripte

Für die folgenden kompletten Beispielskripte sind vorher die entsprechenden SystemVariablen anzulegen und die Gerätenamen auf die eigenen Sensoren und Aktoren anzupassen.


Name des Sensors innen: „RaumXY_Raumregler“
Systemvariable für das Lüften – Werteliste: keine Gefahr;Warnung;Alarm: „RaumXY_Schimmel“
Systemvariable für die Lüftungsempfehlung – Logikwert: wahr = ist wahr, falsch = ist falsch: „RaumXY_Lueften“
Name des Sensors außen: „Aussen_TempFeuSens“

Weiterhin sind die eigenen Wünsche/Werte für die folgenden Konstanten einzutragen:


Oberer Raumtemperaturgrenzwert in °C: „XX.X“
Unterer Raumtemperaturgrenzwert in °C: „YY.Y“
Mittels eigener Messung ermittelter Gesamtwärmeübergangswiderstand R_{ges} : „Z.ZZZ“

Bei Bedarf kann man natürlich weitere SystemVariablen für die anderen Werte (z.B. die absolute Feuchte) anlegen und in die Skripte einbauen.

Beispiel 1: Schimmelgefahranalyse in einem unisolierten Kellerraum mit manueller Lüftung (Fenster) und einem elektrischen Luftentfeuchter

Das nachfolgende Skript für die Schimmelgefahranalyse und die Lüftungsempfehlung wird immer dann aufgerufen, wenn die relative Raum- oder Außenfeuchte aktualisiert wird:

Trigger 1

    ! Berechnung der Schimmelwarnung und Lueftungsempfehlung
    object oTHi = dom.GetObject("RaumXY_Raumregler:1"); ! Name des Temperatur-/Feuchtesensors im Innenraum
    object oTi   = oTHi.DPByHssDP("TEMPERATURE");
    object oHi   = oTHi.DPByHssDP("HUMIDITY");
    object oSchimmel = dom.GetObject("RaumXY_Schimmel");! Name der Systemvariablen für die Schimmelgefahranalyse (Werteliste: keine Gefahr;Warnung;Alarm)
	object oLueften = dom.GetObject("RaumXY_Lueften"); ! Name der Systemvariablen für die Lüftungsempfehlung (Logikwert: wahr = ist wahr, falsch = ist falsch)
    object oTHa = dom.GetObject("Aussen_TempFeuSens:1"); ! Name des Temperatur-/Feuchtesensors im Außenbereich
    object oTa = oTHa.DPByHssDP("TEMPERATURE");
    object oHa = oTHa.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 = 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.285 * tin) + (0.0052 * tin * tin) + (0.0005 * tin * tin * tin));
    }
    else
    { afin = (7.62 + (0.524 * (tin-10.0)) + (0.0131 * (tin-10.0) * (tin-10.0)) + (0.00048 * (tin-10.0) * (tin-10.0) * (tin-10.0)));
    }
	afin = (afin * rfin) / (100.0 + afin * (100.0 - rfin) / 622);
	! Berechnung der absoluten Feuchte außen
	if (tau < 0.0) {tau = 0.0;}
    if (tau < 10.0)
    { afau = (3.78 + (0.285 * tau) + (0.0052 * tau * tau) + (0.0005 * tau * tau * tau));
    }
    else
    { afau = (7.62 + (0.524 * (tau-10.0)) + (0.0131 * (tau-10.0) * (tau-10.0)) + (0.00048 * (tau-10.0) * (tau-10.0) * (tau-10.0)));
    }
	afau = (afau * rfau) / (100.0 + afau * (100.0 - rfau) / 622);
	! Berechnung der Lüftungsempfehlung mit 0,5 g/kg und 0,7 K Hysterese
	if ((afau <= (afin - 0.8)) && (tau <= (tin - 1.0)) && (tin > XX.X))
	{oLueften.State(true);}
	else
	{ if ((afau >= (afin - 0.3)) || (tau >= (tin - 0.3)) || (tin <= YY.Y))
	{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 / Z.ZZZ) * (ta - ti)); ! Rges = Z.ZZZ 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
    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);
 	! Schimmelwarnung
	! 0 - keine Gefahr
	! 1 - Warnung
	! 2 - Alarm
	if ((afin > afa) && (rfin > 64 )) {oSchimmel.State(2);}
        else {
            if ((afin > afa) || (afin > afw)) {oSchimmel.State(1);}
            else {oSchimmel.State(0);}
        }

Die Aktivierung des Entfeuchters erfolgt über das bereits oben beschriebene Skript, das über das WebUI-Zeitmodul…

feuchte02

…oder einen CUxD SystemTimer…

feuchte03

…ca. alle 5 Minuten aufgerufen wird.:

object Feuchtigkeit = dom.GetObject("RaumXY_Raumregler:1.HUMIDITY"); ! Name des Temperatur-/Feuchtesensors im Innenraum
object Entfeuchter = dom.GetObject("RaumXY_Raumregler:1.STATE"); ! Name des Aktors, an dem der Luftentdeuchter angeschlossen ist
object Schimmelgefahr = dom.GetObject("RaumXY_Schimmel"); ! Name der Systemvariablen für die Schimmelgefahranalyse (Werteliste: keine Gefahr;Warnung;Alarm)
time timestamp = Entfeuchter.Timestamp();
time now = system.Date("%Y-%m-%d %H:%M:%S").ToTime();
integer diff = now.ToInteger() - timestamp.ToInteger();
if (diff > 2700) {
  if ((Feuchtigkeit.Value() > 64) && (Entfeuchter.Value() == 0) && (Schimmelgefahr.Value() > 1)) {
     Entfeuchter.State(1);
  }
  if ((Feuchtigkeit.Value() < 64) && (Entfeuchter.Value() == 1)) {
     Entfeuchter.State(0);
  }
}

Beispiel 2: Schimmelgefahranalyse in einem isolierten Badezimmer mit Sauna und einem einfachen Wandlüfter

Neben Schimmelgefahranalyse und Lüftungsempfehlung übernimmt dieses Skript die Steuerung des Wandlüfters gleich mit und bezieht auch den Status des Deckenlichtes mit ein. Hintergund dafür ist, dass eine Störung durch das Lüftergeräusch während eines Saunabades nicht gewünscht ist. Der Lüfter kann daher nur dann laufen, wenn das Deckenlicht ausgeschaltet ist.

Somit ist es sinnvoll, das Programm nicht nur dann aufgerufen, wenn relative Raum- oder Außenfeuchte aktualisiert werden, sondern zusätzlich bei einer Änderung des Status des Deckenlichtaktors:

Trigger 2

    ! Berechnung der Schimmelwarnung und Lueftungsempfehlung
    object oTHi = dom.GetObject("RaumXY_Raumregler:1"); ! Name des Temperatur-/Feuchtesensors im Innenraum
    object oTi   = oTHi.DPByHssDP("TEMPERATURE");
    object oHi   = oTHi.DPByHssDP("HUMIDITY");
    object oSchimmel = dom.GetObject("RaumXY_Schimmel");! Name der Systemvariablen für die Schimmelgefahranalyse (Werteliste: keine Gefahr;Warnung;Alarm)
    object oLueften = dom.GetObject("RaumXY_Lueften"); ! Name der Systemvariablen für die Lüftungsempfehlung (Logikwert: wahr = ist wahr, falsch = ist falsch)
    object oTHa = dom.GetObject("Aussen_TempFeuSens:1"); ! Name des Temperatur-/Feuchtesensors im Außenbereich
    object oTa = oTHa.DPByHssDP("TEMPERATURE");
    object oHa = oTHa.DPByHssDP("HUMIDITY");
    object Ventilator = dom.GetObject("BidCos-RF.AAA1234567:1.STATE"); ! Name des Aktors zur Steuerung des Wandventilators
    object Licht = dom.GetObject("BidCos-RF.BBB1234567:1.STATE"); ! Name des Deckenlichtaktors im Raum
	! 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.285 * tin) + (0.0052 * tin * tin) + (0.0005 * tin * tin * tin));
    }
    else
    { afin = (7.62 + (0.524 * (tin-10.0)) + (0.0131 * (tin-10.0) * (tin-10.0)) + (0.00048 * (tin-10.0) * (tin-10.0) * (tin-10.0)));
    }
	afin = (afin * rfin) / (100.0 + afin * (100.0 - rfin) / 622);
	! Berechnung der absoluten Feuchte außen
	if (tau < 0.0) {tau = 0.0;}
    if (tau < 10.0)
    { afau = (3.78 + (0.285 * tau) + (0.0052 * tau * tau) + (0.0005 * tau * tau * tau));
    }
    else
    { afau = (7.62 + (0.524 * (tau-10.0)) + (0.0131 * (tau-10.0) * (tau-10.0)) + (0.00048 * (tau-10.0) * (tau-10.0) * (tau-10.0)));
    }
	afau = (afau * rfau) / (100.0 + afau * (100.0 - rfau) / 622);
	! Berechnung der Lüftungsempfehlung mit 0,5 g/kg und 0,7 K Hysterese
	if ((afau <= (afin - 0.8)) && (tau <= (tin - 1.0)) && (tin > XX.X))
	{oLueften.State(true);}
	else
	{ if ((afau >= (afin - 0.3)) || (tau >= (tin - 0.3)) || (tin <= YY.Y))
	{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 / Z.ZZZ) * (ta - ti)); ! Rges = Z.ZZZ 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.285 * t) + (0.0052 * t * t) + (0.0005 * t * t * t));
    }
    else
    { afw = (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)));
    }
	afw = (afw * rf) / (100.0 + afw * (100.0 - rf) / 622);
    ! Berechnung Alarm-Grenzfeuchte
    rf = 80;
    if (t < 0.0) {t = 0.0;}
    if (t < 10.0)
    { afa = (3.78 + (0.285 * t) + (0.0052 * t * t) + (0.0005 * t * t * t));
    }
    else
    { afa = (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)));
	}
	afa = (afa * rf) / (100.0 + afa * (100.0 - rf) / 622);
 	! Schimmelwarnung
	! 0 - keine Gefahr
	! 1 - Warnung
	! 2 - Alarm
	if ((afin > afa) && (rfin > 64 )) {oSchimmel.State(2);}
        else {
            if ((afin > afa) || (afin > afw)) {oSchimmel.State(1);}
            else {oSchimmel.State(0);}
        }
	! Programmteil Ventilatorsteuerung
    ! Prüfen, ob Raum schon zu kalt
	if (ti > 20.0)
		{ if ((afau <= (afin - 0.8)) && (ta <= (ti - 1.0)) && (Licht.Value() == 0) && (oSchimmel.Value() == 2))
			{Ventilator.State(1);}
			else
			{ if ((afau >= (afin - 0.3)) || (ta >= (ti - 0.3)) || (Licht.Value() == 1) || (oSchimmel.Value() == 1) || (oSchimmel.Value() == 0))
			{Ventilator.State(0);}
			}
		}
	else
		{ if (ti <= 19.5)
		{Ventilator.State(0);}
		}	

Beispiel 3: Anzeige von Schimmelgefahranalyse und Lüftungsempfehlung

Mit einfachen WebUI-Programmen lassen sich Anzeigen für das Ergebnis der Schimmelgefahranalyse…

feuchte05

anzeige01

…oder die Lüftungsempfehlung realisieren…

feuchte04

anzeige05

7. Montage des Außensensors

Abschließend noch eine Anmerkung zur Montage des Außensensors.

Wenn dieser so montiert ist, dass er immer im Schatten liegt, genügt ein Sensor. Falls das nicht möglich ist, bringen zwei Sensoren Abhilfe, von denen dann jeweils einer in Abhängigkeit von der Tageszeit (Sonnenstand) ausgewählt wird.

Der Sensor sollte nicht in der unmittelbaren Nähe von Türen oder Fenstern montiert werden, auf keinem Fall über Tür oder Fenster. In der Nähe geöffneter Fenster/Türen mischt sich die Außenluft mit der ausströmenden Raumluft und verfälscht das Ergebnis. Dieser Effekt ist um so geringer, je weiter der Sensor von Fenster oder Tür entfernt ist.

Herzlichen Dank an „paul53“ für die Unterstützung beim Verfassen dieses Artikels.

Zum korrespondierenden Beitrag im…
HomeMatic-Forum

 

Bitte beachten...

Die Verwendung meiner Hinweise, Anleitungen, Schaltungen und Software erfolgt auf eigenes Risiko. Ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung.
Creative Commons Lizenzvertrag
Copyright © Jens-Peter Stern | SMART WOHNEN by sTeRn AV | smart-wohnen.org
  1. Hallo,
    im Script von Beispiel 2: Schimmelgefahranalyse in einem isolierten Badezimmer mit Sauna und einem einfachen Wandlüfter

    fehlen die Zeilen 8 und 9
    object oTa = oTHa.DPByHssDP(„TEMPERATURE“);
    object oHa = oTHa.DPByHssDP(„HUMIDITY“);

    • Jens

      Stimmt, war wohl ein Kopierfehler. Ist bereits oben im Beitrag geändert.
      Danke für den Hinweis.

  2. Hiran Chaudhuri

    Der gesamte Artikel ist sehr gut gelungen. Vielen Dank, dass ich einerseits meine bislang gesammelte Erfahrung bestätigt sehen darf und durch die Erläuterung noch dazulerne.

    Für mich als Anfänger mit der Homematic war es jedoch nicht ganz einfach, das Script einzusetzen. Dies liegt im Wesentlichen an der Homematic Skriptsprache, aber ein wenig auch beim Skript selbst, welches ja für Homematic gebaut wurde:

    Die Messwerte und Systemvariablen werden über
    object oTHi = dom.GetObject(„RaumXY_Raumregler:1″);
    bzw weiter oben über
    t = dom.GetObject(raum+“.Sensor“).DPByHssDP(„TEMPERATURE“).Value();
    geholt. Dabei wird keinerlei Prüfung unternommen, ob das Objekt existiert oder einen Kanal repräsentiert. Und leider steigt die Homematic Skriptbearbeitung ohne jeglichen Kommentar aus. Mein Fehler war, durch Unwissen sowohl den Kanal als auch das Gerät mit dem Namen „Badezimmer.Sensor“ benannt zu haben – laut Dokumentation kein Fehler. Nur Objekte gleichen Typs müssen eindeutige Namen haben.

    Es wäre hilfreich, wenn das Skript testet, ob wirklich ein Kanal gefunden wurde und evtl. eine Log-Meldung schreibt.

    • Jens

      Danke für den Beitrag, eine solche Prüfung würde möglicherweise helfen, individuelle Skriptfehler beim Einrichten einzugrenzen. Wenn das Skript einmal läuft, wird sie aber eigentlich ja nicht mehr benötigt. Mir ist es da lieber, das Skript schlanker zu halten aber das ist Geschmacksache. Bei Bedarf kann man es ja nach den eigenen Bedürfnissen anpassen.

  3. Super Beitrag, der mir sehr weiter geholfen hat. Danke dafür! 🙂

    Ein kleiner Fehler hat sich im Code des Beispiel 2 eingeschlichen (bei der Variable fehlen zwei Buchstaben).
    In Zeile 37 muss wie folgt lauten:
    afau = (afau * rfau) / (100.0 + afau * (100.0 – rfau) / 622);

    • Jens

      Hallo Jörn,

      danke für das positive Feedback und den Hinweis auf den Fehler im Beispiel 2.
      Ich habe das oben im Skript bereits korrigiert.

      Liebe Grüße
      Jens

  4. Wolfgang S

    Hallo zusammen,
    ich bin beim Skripteschreiben ein absoluter Anfänger und hab keine Ahnung wie ich das Dingens so in die Homematik einbauen kann, dass es auch wirklich funktioniert.
    Zur Umgebung: ich habe ein Aussenthermometer und mehrere Innenthermometer. Die Idee war jeweils ein Pärchen gegeneinander zu vergleichen und eine Empfehlung zum Lüften oder eben nicht zu geben.
    Dann habe ich mal die erste Systemvariable z.B. Garten.Abs_Feuchte definiert (als Zahl etc)
    Weiters ein HM Programm, dass alle 5 min das erste Skript laufen lässt.
    Beim Skript testen bin ich schon mit Fehlermeldung hängen geblieben.
    Das nachfolgende ging dann wenigstens ohne Fehlermeldung: http://homematic-forum.de/forum/viewtopic.php?f=31&t=9835.
    Aber der Wert, der ausgegeben wird ist immer 0,0 g/kg.
    Gibt es irgendwo eine Schritt für Schritt Anleitung?
    Gruß
    Wolfgang

    • Jens

      Hallo Wolfgang,
      da das Vorgehen hier sehr stark von den jeweiligen Gegebenheiten abhängt, gibt es da keine allgemein gültige Schritt für Schritt Anleitung, jedoch ganz unten einige Beispiele.

      So ganz ohne Skript Kenntnisse ist dieses Projekt möglicherweise jedoch eine Herausforderung.

  5. Frank Janka

    Ich verstehe die Bezeichnung irgendwie nicht:

    ! Absolute Luftfeuchte 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();

    ++++++++++++++++

    „Wohnen“ ist ein Platzhalter für den Raumnamen. Kannst Du mal ein ausgefülltes Skript posten damit man das besser nachvollziehen kann?

    Danke und Grüße

    • Jens

      Hallo Frank,

      die Codeschnipsel im oberen Teil dienen der Erläuterung der Berechnung und der Skriptbestanddteile. „Ausgefüllte Skripte“ findest du im Abschnitt 6. Beispielskripte. Die Beispiele 1 und 2 laufen bei mir im Keller bzw. in einem UG-Bad seit 2014 genau in dieser Form. Du musst nur die folgenden Paramter auf deine Situation umschreiben…

      Name des Sensors innen: „RaumXY_Raumregler“ -> Name deines Temp-/Feuchte Sensors oder Raumreglers im zu überwachenden Raum

      Systemvariable für das Lüften – Werteliste: keine Gefahr;Warnung;Alarm: „RaumXY_Schimmel“ -> Name der von dir angelegten Systemvariable

      Systemvariable für die Lüftungsempfehlung – Logikwert: wahr = ist wahr, falsch = ist falsch: „RaumXY_Lueften“ -> Name der von dir angelegten Systemvariable

      Name des Sensors außen: „Aussen_TempFeuSens“ -> Name deines Temp-/Feuchte Sensors im Außenbereich (Schatten)

      Weiterhin sind die eigenen Wünsche/Werte für die folgenden Konstanten einzutragen:

      Oberer Raumtemperaturgrenzwert in °C: „XX.X“ -> siehe Abschnitt 4. Lüftungsempfehlung

      Unterer Raumtemperaturgrenzwert in °C: „YY.Y“ -> siehe Abschnitt 4. Lüftungsempfehlung

      Mittels eigener Messung ermittelter Gesamtwärmeübergangswiderstand R_{ges} : „Z.ZZZ“ -> siehe Abschnitt 3. Schimmelwarnung

      Liebe Grüße Jens

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

n/a