Taupunktberechnung in Homeassistant

Posted on Fr 23 September 2022 in Computer & Electronics

In einem der letzten Posts hatten wir meine 433MHz Temperatur-Sensoren in Homeassistant eingebunden. Das funktioniert nach wie vor gut und ich bin sehr zufrieden.

In dem Zusammenhang habe ich mich gefragt, wie ich eigentlich von Temperatur und relativer Luftfeuchtigkeit zum Taupunkt komme – also der Temperatur, bei das in der Luft gelöste Wasser zu kondensieren anfängt. Das kann relevant sein, wenn im Winter die Außenwände sehr kalt werden – kommen sie unter den Taupunkt wird die Wand auf Dauer feucht und es kann sich Schimmel bilden.

Das kann ja nicht so schwierig sein – also suchen wir mal die nötigen Daten dafür zusammen – dabei ist der Wikipedia Artikel zum Taupunkt hilfreich. Und dort finden wir:

$$\varphi = \frac{p_s(\tau)}{p_s(\vartheta)}$$

wobei

\(\varphi\): relative Luftfeuchtigkeit [%]

\(p_s(\tau)\): Sättigungsdampfdruck [hPa] bei Taupunkttemperatur \(\tau\)

\(p_s(\vartheta)\): Sättigungsdampfdruck bei Raumtemperatur Temperatur \(\varphi\)

Für den Sättigungsdampfdruck wird dort die Magnus-Formel angegeben, die selbigen näherungsweise angibt:

$$p_s(\vartheta) = K_1 \cdot \exp\left(\frac{K_2 \cdot \vartheta}{K_3 +\vartheta}\right)$$

wobei \(K_1 = 6.112\) hPa

Für den Sättigungsdampfdruck über Wasser gilt:

\(K_2 = 17.62\)

\(K_3 = 243.12\) °C

Für Innenräume passt das wohl, aber für den Außensensor brauchen wir auch Werte für den Winter, also die Parameter \(K_i\) für \(p\) über Eis – und dafür gelten diese Werte:

\(K_2 = 22.46\)

\(K_3 = 272.62\) °C

Und um die Sache ein wenig interessanter zu machen gibt es auch noch sogenanntes unterkühltes Wasser, also flüssiges Wasser bei unter 0°C – dann gelten wieder die ersten Werte. Aber unterkühltes Wasser kann mich mal und ich ziehe die Grenze bei 0°C , wie es sich für anständiges Wasser gehört!

Nun können wir die Magnus-Formel in die erste Gleichung einsetzen und nach \(\tau\) auflösen und bekommen

$$ \tau(\varphi, \vartheta) = K_3 \frac{ \frac{K_2 \cdot \vartheta}{K_3 + \vartheta} + \ln\varphi} {\frac{K_2 \cdot K_3}{K_3 +\vartheta} - \ln\varphi} $$

Und wenn wir das in R schreiben sieht das so aus:

tau <- function(phi, theta){
    phi = phi / 100     # percent -> fraction
    K2 = ifelse(theta >= 0, 17.62, 22.46)
    K3 = ifelse(theta >= 0, 243.12, 272.62)
    K3 * ((K2*theta)/(K3+theta) + log(phi)) / ((K2*K3)/(K3+theta) - log(phi))
}

Sehr gut – nun können wir ein bisschen mit der Funktion spielen. Z.B. die Grafik im Wikipedia-Artikel nachstellen:

Passt perfekt! Aber warum ist da nur der Bereich \(\vartheta \ge 0\) °C gezeigt?

Darum:

Da ist ein fieser Sprung bei \(\vartheta = 0\)°C!

Das ist zwar vom ästhetischen Standpunkt eine Zumutung, aber in der Praxis irrelevant, denn es geht ja darum zu sehen, ob die Gefahr besteht, dass Feuchtigkeit an der Wand kondensiert. Da es im Haus aber nie unter 0°C geht ist die erste Grafik ausreichend.

Falsches Lüften

Eine spannende Anwendung dieser ganzen Formeln ist das richtige Lüften – v.a. für kalte Keller. Viele Leute reißen einfach im Sommer die Kellerfenster auf und glauben den Keller auf diese Weise trocken zu bekommen. Das Gegenteil ist meist der Fall. Denn dabei wird warme Sommerluft in den kalten Keller gebracht. Dort kühlt sie ab und verliert dabei die Fähigkeit so viel Wasser zu halten. Mit anderen Worten: Obwohl der Wassergehalt der Luft gleich bleibt steigt ihre relative Luftfeuchtigkeit und damit auch der Taupunkt und das Wasser kondensiert an der Kellerwand. Und wenn das eine Weile so geht kann sich Schimmel bilden. Und das gilt natürlich nicht nur für den Keller.

Also ist es ratsam, bevorzugt dann zu lüften, wenn der Taupunkt draußen geringer ist, als drinnen. Und schon ist der Bereich unter Null °C doch wieder relevant, denn wenn wir im Winter wissen wollen, ob es gerade günstig wäre zu lüften, müssen wir eben auch mir Minusgraden umgehen.

Also doch nochmal genauer nachlesen. So wie ich die Sache verstehe, ist das Problem, dass eben nicht alles Wasser spontan einfriert, wenn die Temperatur unter Null °C fällt. Und so können die Parameter für Wasser noch eine Weile gelten, obwohl wir Frost haben – das oben verhöhnte unterkühlte Wasser... Hm. Im Grunde haben wir drei Alternativen:

  1. So tun, als wüssten wir nichts von der Formel über Eis und einfach die "normale" Kurve auch unter 0 °C anwenden.
  2. Mit dem Sprung leben.
  3. Irgendwie einen fließenden Übergang reinrechnen

Auf Option 3 habe ich garkeine Lust, denn entweder macht man sowas korrekt oder garnicht. Und da ich keine Lösung gefunden habe, wie man das richtig macht und ich zudem vermute, dass es auch garnicht möglich ist, ohne so Dinge wie die Dauer für die diese Temperatur schon herrscht und vermutlich noch vieles mehr zu berücksichtigen, lassen wir das schön bleiben.

Option 1 hat den Charme, dass alles schön kontinuierlich ist und einen in der Sicherheit wiegt, dass die Welt gut verstanden und wohlgeformt ist.

Option 2 ist hässlich, hat aber den Vorzug, dass man im Zweifel den Taupunkt draußen überschätzt und damit lüftungstechnisch auf der sicheren Seite ist.

Nach viel Überlegung habe ich mich entschieden, dass mir Variante 1 am sympatischsten ist. So Pi man Daumen liegen wir schlimmstenfalls um 2 Grad daneben. Von praktischer Relevanz ist das jedoch nicht, weil alle betroffenen Taupunkte unter 0 °C liegen. Im Haus wird aber keine Wand ernsthaft in die Nähe des Gefrierpunkts kommen – und wenn doch ist der Taupunkt vermutlich das geringste aller Probleme...

D.h. ich entschuldige mich in aller Form beim unterkühlten Wasser und wir setzen \(K_2 = 17.62\) und \(K_3 = 243.12\) °C.

HASSIO

Da wir nun wissen, wie man das berechnet wollen wir es auch gleich in Homeassistant umsetzten. Dazu konfigurieren wir einen template sensor:

template:
  - sensor:
    - name: "Taupunkt Wohnzimmer"
      unit_of_measurement: "°C"
      state: > 
        {% set temp = states('sensor.Temp_Wohnzimmer') | float %}
        {% set rh = states('sensor.Hum_Wohnzimmer') | float %}
        {% set K2 = 17.62 | float %}
        {% set K3 = 243.12 | float %}
        {{ (K3 * ((K2*temp)/(K3+temp) + log(rh/100)) / ((K2*K3)/(K3+temp) - log(rh/100)))  | round(1) }}

Und analog natürlich für den Außensensor und die übrigen Räume.