HomeMatic Tutorial

HomeMatic – Raumklimaüberwachung und Entfeuchtung

Letzte Aktualisierung am 23. Oktober 2021

Überwachung des Raumklimas und Steuerung von Klimageräten sind klassische Aufgaben der Hausautomatisierung. Der folgende Beitrag 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:
Berechnung bzw. Abgriff der absoluten Feuchte
Schimmelgefahranalyse
Lüftungsempfehlung
Entfeuchter- bzw. Lüftersteuerung

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.

Der Ursprungsbeitrag aus 2014 wurde in Abstimmung mit dem Nutzer „paul53“ aus dem HomeMatic-Forum erstellt. Von ihm stammen viele der physikalischen Ableitungen und das alternative Skript zur Bestimmung der absoluten Luftfeuchte.

Vielen Dank!

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üglichen 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 Luftfeuchtigkeit 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 errechnet werden. Hierzu liefern die Näherungsformeln von wettermail.de eine hinreichende Genauigkeit.

Die Berechnung der Taupunkttemperatur nach diesen Näherungsformeln 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.

Jedoch gibt es weitere, weniger aufwändige Lösungen zur Errechnung der absoluten Luftfeuchtigkeit, von denen zwei mögliche Alternativen nachfolgend erläutert werden.

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 z.B. über das “Thermostat Wrapper-Device” des CUxD einbinden und die darüber errechneten Werte in der CCU weiter nutzen.

Hierzu wird im CUxD ein Gerät vom Typ “90” mit der Funktion “Thermostat” angelegt…

Klassische HomeMatic Geräte werden für den hiesigen Anwendungsfall wie folgt konfiguriert…

Der Haken bei WEATHER|USE_HMDATAPT ist zu setzen und bei WEATHER|HMSERIAL sind Seriennummer sowie Kanal des entsprechenden Sensors einzutragen.


Die nachfolgenden Skripte nutzen für die absolute Luftfeuchte die Einheit \frac{g}{kg} . Damit diese korrekt rechnen, muss bei allen CUxD Geräten unter WEATHER|MODE die voreingestellte Einheit \frac{g}{m^3} in \frac{g}{kg} geändert werden.

Bei HomeMatic-IP Geräten ist es erforderlich, die Werte “aktiv” in den CUxD zu übertragen. Hierzu gibt es verschiedene Möglichkeiten. In meiner üblichen Vorgehensweise wird der Haken bei WEATHER|USE_HMDATAPT nicht gesetzt, wodurch kein Feld für die Eingabe der Seriennummer angezeigt wird…

Die Übertragung in den CUxD geschieht wie folgt, wobei die CUxD-Seriennummer ggf. auf die eingenen Werte anzupassen ist…

dom.GetObject("CUxD.CUX9002004:1.SET_TEMPERATURE").State(dom.GetObject("UG Bad Raumregler:1").DPByHssDP("ACTUAL_TEMPERATURE").Value());
dom.GetObject("CUxD.CUX9002004:1.SET_HUMIDITY").State(dom.GetObject("UG Bad Raumregler:1").DPByHssDP("HUMIDITY").Value());

Für die späteren Berechnungen sind CUxD-Pendants für alle verwendeten Außen- und Innensensoren anzulegen, die nach erfolgreicher Konfiguration zusätzlich Taupunkt, absolute Feuchte und – sofern ausgewählt – Statistikwerte anzeigen…

Details und alternative Verfahren sind im CUxD-Handbuch beschrieben.

Berechnung mittels CCU-Skript

“paul53” hat ein Skript 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} .

Ich habe diesen Programmteil jahrelang genutzt und mit dem CUxD-Verfahren verglichen. Die Abweichungen sind in der Praxis vernachlässigbar. Wer keinen CUxD einsetzt oder dort keine zusätzlichen Geräte anlegen möchte, kann also alternativ ohne Funktionseinschränkungen den nachfolgenden Code zur Berechnung der absoluten Feuchten innen und außen verwenden…

! 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.

3. Schimmelwarnung

Zur Realisierung einer Schimmelwarnung ist zunächst die jeweils “kritischste” Bauteiloberfläche in dem zu betrachtenden Raum empirisch zu ermitteln. Dies gelingt ohne Wärmebildkamera 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 Wahrscheinlichkeit wird diese an einer Wärmebrücke (z.B. an den Fensterlaibungen oder in den Ecken) zu finden sein.

Die Messungen von Raumtemperatur, Außentemperatur und Oberflächentemperatur der Außenwand (innen an der kältesten Stelle) sollten über mehrere, möglichst kalte Tage erfolgen und in einer Messreihe dokumentiert werden, da diese zur späteren Berechnung des Gesamtwärmedurchgangswiderstandes der Außenwand benötigt werden, die erforderlich ist, wenn man den exakten Aufbau der Außenwand nicht kennt (siehe unten).


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 .

Man könnte dazu einen zusätzlichen Temperatursensor innen an genau dieser “kritischen” Stelle anbringen und die Taupunkttemperatur über ein “Thermostat Wrapper-Device” des CUxD ermitteln.

Da dies in der Praxis meist nicht so einfach ist, wurde ein etwas anderer Ansatz gewählt, indem zunächst die absoluten Grenzfeuchten für einen Schimmelalarm (80% relative Luftfeuchtigkeit) und 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;      ! Oberflächentemperatur der Außenwand in °C
real ta;      ! Außentemperatur in °C
real ti;      ! Raumtemperatur in °C
real Rges;    ! gesamter Wärmedurchgangswiderstand der Außenwand 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 den 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 Messwerte 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. Daher ist es nicht möglich, eine pauschale Empfehlung abzugeben.

4. Lüftungsempfehlung

Hier geht es um eine Lüftungsempfehlung, ausschließlich zum Zweck der Schimmelvermeidung.

Luftgüte, Virenlasten etc. sind nicht Gegenstand dieser Betrachtungen!

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 geringer 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 ist es im Winter meist sinnvoll zu Lüften. Die hier ermittelte Lüftungsempfehlung bzw. automatische Lüftung ist für die “kritischen Jahreszeiten” gedacht (Sommer bzw. Übergangszeit mit Außentemperaturen über 15°C).

Mit der Einbeziehung der Temperaturdifferenz Innen/Außen im obigen Code wird vermieden, dass im Sommer nicht nur zu feuchte Luft, sondern auch zu warme Luft von außen einströmt, um den Raum nicht weiter aufzuheizen.


Die Berücksichtigung der Raumtemperatur soll zudem eine zu starke Auskühlung des Raumes im Winter verhindern, denn die Auskühlung muss 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 wirtschaftlicher, 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 aufrechterhält. Dieses Skript lässt sich sehr einfach um eine Abfrage des Ergebnisses der Schimmelgefahranalyse erweitern, wobei über einen (optionalen) Grenzwert (hier 64 %) die relative Luftfeuchtigkeit zur Verbreiterung der Hysterese einbezogen werden kann…

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

Da bei HomeMatic-IP-Geräten der Zeitstempel – zumindest bei solch großen Zeitspannen – oftmals frühzeitig zurückgesetzt wird, sollte man bei Nutzung eines IP-Aktors besser z.B. “LastDPActionTime” oder alternativ einen einfachen Zähler mit einer zusätzlichen Systemvariablen einsetzen. Das folgende Beispielskript wird über einen Timer alle 293 Sekunden aufgerufen, nach knapp 44 Minuten springt der Zähler auf 9 und schaltet bei Bedarf den Entfeuchter. Er verbleibt auf dem Wert 9, bis der Entfeuchter das nächste Mal geschaltet wird…

object Feuchtigkeit = dom.GetObject("HmIP-RF.000XXXXXXXXXXX:1.HUMIDITY");
object Entfeuchter = dom.GetObject("HmIP-RF.000XXXXXXXXXXX:3.STATE");
object Schimmelgefahr = dom.GetObject("RaumXY_Schimmel");
object Counter = dom.GetObject("RaumXY_Entfeuchter_Timestamp");
Counter.State(Counter.Value()+1);
if (Counter.Value() > 8) {
  Counter.State(9);
  if ((Feuchtigkeit.Value() > 64) && (Entfeuchter.Value() == 0) && (Schimmelgefahr.Value() > 1)) {
     Entfeuchter.State(1);
     Counter.State(0);
  }
  if ((Feuchtigkeit.Value() < 64) && (Entfeuchter.Value() == 1)) {
     Entfeuchter.State(0);
     Counter.State(0);
  }
}

Statt eines Entfeuchters kann auch ein Wandventilator eingebunden werden. Falls dieser nicht nur die feuchte Luft nach draußen leitet, sondern einen Austausch mit der Außenluft vornimmt, 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 suboptimal isolierten Kellerraum mit manueller Lüftung (Fenster) und einem elektrischen Luftentfeuchter ohne CUxD-Nutzung

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 mit einem der bereits oben beschriebenen Skripte, das über das WebUI-Zeitmodul…

feuchte02

…oder einen CUxD SystemTimer…

feuchte03

…ca. alle 5 Minuten aufgerufen wird, z.B. wie hier für einen klassischen HomeMatic-Schaltaktor…

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

Diese Analyse und Entfeuchtungslogik sorgt hier in einem “Problemraum” seit Jahren für ein absolut Schimmel-freies Raumklima bei möglichst minimaler Laufzeit des Entfeuchters.

Die folgende Grafik zeigt beispielhaft das Erreichen der Alarm-Grenzfeuchte und das Einschalten des Entfeuchters gegen 06:15 Uhr. Obwohl die Schimmelgefahr bereits nach wenigen Minuten wieder gebannt war, lief das Gerät noch die eingestellten 45 Minuten weiter.

Die Grafik zeigt auch, dass bei einer Regelung nach der relativen Luftfeuchte, wie sie viele handelsübliche Geräte von Hause aus mitbringen, der Entfeuchter sich bei einer angenommenen Schaltschwelle von 69 % gegen 16:15 Uhr nochmals eingeschaltet hätte, obwohl zu diesem Zeitpunkt nicht einmal eine Schimmelwarnung vorlag und somit im Grunde keine aktive Entfeuchtung zur Schimmelvermeidung erforderlich gewesen wäre…

Beispiel 2: Schimmelgefahranalyse in einem isolierten Badezimmer mit Sauna unter Verwendung des CUxD

Das folgende Skript wird wie in Beispiel 1, jedoch auf die Aktualisierung der CUxD-Sensor-Pendants getriggert…

! Berechnung der Schimmelwarnung und Lueftungsempfehlung
object oTHi = dom.GetObject("RaumXY_Raumregler_CUxD:1");
object oTi   = oTHi.DPByHssDP("TEMPERATURE");
object oHi   = oTHi.DPByHssDP("HUMIDITYF");
object oAi   = oTHi.DPByHssDP("ABS_HUMIDITY");
object oTHa = dom.GetObject("Aussen_TempFeuSens_CUxD:1");
object oTa = oTHa.DPByHssDP("TEMPERATURE");
object oHa = oTHa.DPByHssDP("HUMIDITYF");
object oAa   = oTHi.DPByHssDP("ABS_HUMIDITY");
object oSchimmel = dom.GetObject("RaumXY_Schimmel");
object oLueften = dom.GetObject("RaumXY_Lueften");
! Programmteil Lüftungsempfehlung
! Lokale Variablen
real tin = oTi.Value(); ! Temperatur in °C innen
integer rfin = oHi.Value(); ! relative Feuchte in % innen
real afin = oAi.Value();  ! 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 = oAa.Value();  ! absolute Feuchte in g/kg außen
! 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);}
    }

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.

Zum korrespondierenden Beitrag im…

HomeMatic-Forum



Bitte beachten...

SMART WOHNEN in Stern's Haus ist ein rein privates Projekt. Support kann ich daher nur im Rahmen meiner begrenzten Freizeit leisten, hierfür bitte ich um Verständnis. Meine Hinweise, Anleitungen, Schaltungen und Software werden so angeboten, „wie sie sind“. Die Verwendung erfolgt auf eigenes Risiko, ich übernehme hierfür keinerlei Gewährleistung bzw. Haftung! Für die Einhaltung der einschlägigen technischen Vorschriften ist jeder Anwender selbst verantwortlich!
Creative Commons Lizenzvertrag
Copyright © Jens-Peter Stern | SMART WOHNEN in Stern's Haus | 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”);

    • 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.

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

    • 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

    • 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

    • 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

  6. Hallo, super Artikel. Danke dafür.
    Habe mal eine Frage: im Beispiel 2 wird ein “Wandventilator” gesteuert. Verstehe ich als einen Ventilator der die Raumluft durch ein Loch in der Außenwand nach draußen bläst.
    Wenn Luft raus geht, muss ja auch welche rein kommen. Da wenn dieser läuft wahrscheinlich kein Fenster auf ist, müsste die Luft doch durch angeschlossene Zimmer abgezogen werden. Das ganze rum gerechnet wie die Temperatur/Feuchtigkeit draußen ist könnte man sich in dem Beispiel daher doch sparen weil gar nicht mit der Außenluft getauscht wird. Oder wo ist mein Denkfehler?

    Danke und VG
    Maik

    • Hallo Maik,

      in diesem Beispiel wird tatsächlich ein einfacher Wandventilator (mit Verschlusslamellen) angesteuert. Ich stand hier damals vor der Entscheidung, eine vorhandene Wandöffnung zu verschließen oder mit einem Ventilator zu versehen. Letztlich habe ich mich für eben diesen einfachen Ventilator entschieden. Was du schreibst stimmt natürlich im Grunde. Die Luft, die rausgeblasen wird, muss auch nachfließen. Dafür gibt es die bekannten Tür-Lüftungsgitter. Bei mir dient der Ventilator dazu, nach dem Betrieb der Sauna die feuchte Luft schnell abzuziehen. Aufgrund der vorherigen Gänge ins Freie über den Flur und einen Kellerraum ist dann regelmäßig genügend frische Luft zum Austausch vorhanden. Das ist ein sehr spezieller Anwendungsfall, der aber in der Praxis prima funktioniert.

      Für andere Anwendungsfälle ist möglicherweise ein Ventilator mit Kreuzplattenwärmetauscher die bessere Lösung. Hierzu gibt es in den im Tutorial ganz unten zum HomeMatic-Forum verlinkten Beiträgen einige Diskussionen. Falls du dazu irgendwelche speziellen Fragen hast, stelle sie bitte besser im Forum, da die diesbezüglichen Überlegungen von “paul53” stammen und er wohl eher dort mitliest.

      Liebe Grüße Jens

  7. Richtig episch wäre es nun, wenn ein Entfeuchtet den Raum schützt.
    Über ioBroker könnte man den immer so einschalten, dass das beste rauskommt erreicht wird. =)

    • Hallo Paul,
      Für die Einbeziehung eines Entfeuchters braucht es nicht unbedingt den ioBroker, das geht auch mit “Bordmitteln”, siehe oben im Beispielskript 1.
      Grüße Jens

  8. Hi ..
    Super Skript – DANKE.
    Nach langem hin und hier, habe ich es zum laufen gekriegt.
    Frage: welchen Rges Wert könnte ich als “generic Value” eintragen, damit ich es nicht für mich selber Berechnen muss? 0.5?

    DANKE
    Mike

Schreibe einen Kommentar

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