Raumklima mit dem Raspberry PI überwachen, oder: Wann lüften?

Mit relativ einfachen Mitteln ist es möglich einige das Raumklima betreffend interessante Größen zu bestimmen, die etwa Auskunft darüber geben ob das Öffnen eines Fensters zu trockener Luft führt, oder ob Schimmelgefahr besteht. Mit Hilfe eines RaspyRFM Funkmoduls, der Timeseries-Datenbank influxDB und der Datenvisualisierung Grafana können informative Diagramme über Temperatur, absolute und relative Luftfeuchtigkeit, Taupunkt und mehr erzeugt werden, auf welche einfach über einen Webbrowser zugegriffen werden kann. An Hardware wird benötigt:

Zunächst die erforderliche Software, wie in diesem Beitrag unter “Installation” beschrieben, installieren.

Zunächst alle erforderlichen Bibliotheken und das RaspyRFM Python-Softwarepacket installieren. Im ist ein Skript enthalten welches die Sensordaten empfängt, dekodiert und auf einer HTML Seite zur Verfügung stellt:

apps/868gw.py
Found RaspyRFM twin
RFM69 found on CS 1
Init complete.
mqtt init error
Waiting for sensors…
id: 98  room Druckerraum    T:  15.2 °C  RH: 43 %  battery: OK   init: false
id: 18  room Hauptraum      T:  20.9 °C  RH: 33 %  battery: OK   init: false
id: 8   room Nebenraum      T:  21.6 °C  RH: 32 %  battery: OK   init: false
id: 98  room Druckerraum    T:  15.1 °C  RH: 43 %  battery: OK   init: false
id: 18  room Hauptraum      T:  20.9 °C  RH: 33 %  battery: OK   init: false

Die Raumzuordnungen und weitere Parameter können in der Datei apps/868gw.conf eingetragen werden:

{
    "sensors": [
        {
            "id": "18",
            "name": "Hauptraum",
            "tMin": 19.5,
            "tMax": 24,
            "rhMax": 60,
            "rhMin": 40,
            "idOutside": "68",
            "Tsurf": 16,
            "awWarn": 80
        },
        {
            "id": "8",
            "name": "Nebenraum",
            "tMin": 20,
            "tMax": 25,
            "rhMax": 60,
            "rhMin": 40,
            "idOutside": "68"
        },
        {
            "id": "68",
            "name": "Aussen",
            "isOutside": true
        }
    ]
}

Über die Parameter tMin, tMax, rhMin, rhMax können pro Sensor Grenzwerte konfiguriert werden ab wann die Werte im Webinterface in rot dargestellt werden. Mit idOutside wird der Außensensor referenziert welcher für die weiter unten noch genauer erklärten Berechnungen herangezogen wird.

Das Webinterface kann standardmäßig über die Adresse http://<IP Raspberry>:8080 aufgerufen werden. Der Port kann über die obige Konfigurationsdatei geändert werden.

Weboberfläche lacrossegw

Für jeden Raum werden oben Temperatur und relative Luftfeuchtigkeit angezeigt. Dort wird neben der relativen Luftfeuchtigkeit ggf. noch ein Warnsymbol bei schwacher Batterie angezeigt. Im obigen Bild ist beim Raum “Küche” noch ein Wolkenicon zu sehen; weil der Raum zu feucht ist (62 %) und die absolute Luftfeuchtigkeit draußen deutlich geringer würde Lüften zur Verminderung der relativen Luftfeuchtigkeit führen, rechentheoretisch um -13 Prozentpunkte r. H. (die kleine Zahl neben der relativen Luftfeuchtigkeit)
Bei Klick auf einen Raum werden weitere Messwerte eingeblendet:

  • Absolute Luftfeuchtigkeit (AH) in g / m³
  • AHratio, Verhältnis zwischen absoluter Luftfeuchtigkeit innen und außen. Ist die absolute Luftfeuchtigkeit draußen höher (positives AHratio) wird die relative Luftfeuchtigkeit beim Lüften steigen und umgekehrt.
  • Taupunkt
  • TF80, Temperatur bei der eine Luftfeuchtigkeit von 80 % erreicht wird (Schimmelgefahr!). Unterschreitet die Temperatur einer Wandfläche im Raum den TF80 Wert droht dort Schimmelbildung. Maßnahmen: Lüften (nur wenn die absolute Luftfeuchtigkeit draußen geringer ist!), Entfeuchten mit Lufttrockner, Heizen.
  • TF60, siehe TF80
  • aw Wert; wenn in der Konfiguration zum entsprechenden Sensor die Bauteiletemperatur Tsurf angegeben wird, gibt der aw Wert die relative Luftfeuchtigkeit an der Oberfläche an. Ab 80 % besteht Schimmelgefahr! Über den Wert awWarn in der Konfiguration kann die Warnschwelle eingestellt werden.

Unten werden zwei Säulendiagramme dargestellt, in denen jeweils die Temperaturen bzw. relative Luftfeuchtigkeiten aller Räume dargestellt werden. Die gelbe horizontale Linie ist jeweils der Wert vom Außensensor so dass mit einem Blick abgelesen kann ob Lüften zur Temperaturerhöhung / -erniedrigung bzw. zur Erhöhung / Erniedrigung der relativen Luftfeuchtigkeit im entsprechenden Raum führt.

Relative und absolute Luftfeuchtigkeit

Spricht man von “Luftfeuchtigkeit”, ist damit meist die relative Luftfeuchtigkeit in % gemeint. Eine bestimmte Menge Luft kann abhängig von dessen Temperatur unterschiedlich viel Wasser speichern. Wärmere Luft kann größere Mengen an Wasserdampf aufnehmen als kalte. Diese relative Luftfeuchtigkeit gibt an, wieviel Wasserdampf die Luft im Verhältnis zum Aufnahmevermögen bei der momentanen Temperatur enthält. Das bedeutet, dass sich die relative Luftfeuchtigkeit in einem geschlossenen Raum ändert, wenn die sich dessen Temperatur, etwa durch Heizen oder Abkühlen, verändert. Hier einige Beispiele:
– Im Wohnzimmer herrscht eine Temperatur von 20 °C bei einer relativen Luftfeuchtigkeit von 50 %. Nun wird die Raumtemperatur auf 22 °C durch Heizen erhöht. Da die wärmere Luft mehr Wasserdampf aufnehmen könnte, aber noch die selbe Masse an Wasserdampf vorhanden ist beträgt die relative Luftfeuchtigkeit nun 45 %.
– Das Badezimmer hat eine Temperatur von 25 °C und er herrscht eine Luftfeuchtigkeit von 60 %. Durch Abkühlung sinkt die Lufttemperatur auf 20 °C. Die kleinere Aufnahmefähigkeit der abgekühlten Luft von Wasserdampf sorgt dafür dass die relative Luftfeuchtigkeit auf 80 % steigt.
Die relative Luftfeuchtigkeit in Räumen sollte ca. 40 % – 60 % betragen. Zu trockene Luft führt zur Austrocknung der Schleimhäute so dass man sich leichter Infektionen einfangen kann, zu feuchte Luft dagegen führt in Räumen zu Schimmelbefall. Bei Erreichen von 100 % relativer Luftfeuchtigkeit kann die Luft keinen weiteren Wasserdampf aufnehmen, so dass die Luft beginnt zu kondensieren.

Im Gegensatz zur Relativen gibt die absolute Feuchtigkeit an, welche Masse an Wasserdampf die Raumluft enthält. Sie wird in der Einheit g / m³ angegeben. Findet kein Luftaustausch statt und wird kein Wasserdampf, z. B. an Wände etc., abgegeben oder aufgenommen, bleibt die absolute Luftfeuchtigkeit auch beim Ändern der Temperatur konstant. Eine Raumluft mit der Temperatur 20 °C enthält z. B. bei einer relativen Luftfeuchtigkeit von 60 % die Masse von rund 10 g pro m³ Raumluft, d. h. die absolute Luftfeuchtigkeit beträgt hier 10 g / m³. Die absolute Luftfeuchigkeit kann errechnet werden, wenn Temperatur und relative Luftfeuchtigkeit bekannt sind.

Lüften oder nicht Lüften?

Angenommen an einem Wintertag wird im Badezimmer geduscht, so dass dort die relative Luftfeuchtigkeit auf 70 % bei einer Temperatur von 22 °C steigt. Außen herrscht eine Temperatur von 2 °C bei 85 % relativer Luftfeuchtigkeit. Kann die Luftfeuchtitkeit im Badezimmer unter diesen Bedingungen durch Öffnen des Fensters gesenkt werden?
Die korrekte Antwort lautet: JA!
Obwohl die Außenluft eine höhere relative Luftfeuchtigkeit hat als die Raumluft nach dem Duschen, muss hier aber die jeweilige absolute Luftfeuchtigkeit herangezogen werden:

TRHAH
Badezimmer22 °C70 %13,6 g/m³
Außen2 °C85 %4,7 g/m³
Relative und absolute Luftfeuchtigkeit

Die kleine Zahl gibt die theoretisch erreichbare Veränderung der relativen Raumluftfeuchtigkeit an, wenn die beiden Luftmassen innen und ausgetauscht werden würden und die Luft innen wieder auf die vorherige Raumtemperatur gebracht werden würde. Bei einem Wert unter etwa -10 % würde die Raumluft beim Lüften trockener werden, bei über +10 % feuchter.

API

Das Script lacrossegw bietet einen Endpunkt unter http://<ip>:8081/data an über den auf die gemessenen und berechneten Werte aller Sensoren zugegriffen werden kann:

{
  "sensors":[
    {
      "id": "a4", eindeutige ID des Sensors
      "T": 24.8, Temperatur in °C
      "RH": 66, relative Luftfeuchtigkeit in %
      "DEW": 18, Taupunkt in °C
      "AH": 15, absolute Luftfeuchtigkeit in g / m³
      "SDD": 31.28001543349199, Sättigungsdampfdruck in hPa
      "DD": 20.644810186104714, Dampfdruck in hPa
      "DEW80": 21.6, TF80 Wert in °C, siehe http://www.tf80.de/
      "DEW60": 26.4, TF60 Wert in °C, siehe http://www.tf80.de/
      "aw": 70, relative Luftfeuchtigkeit an konfigurierter Oberflächentemperatur
      "rssi": -77.5, RSSI in dBm des zuletzt empfangenen Pakets
      "batlo": false, Batterie-schwach-Flag
      "init": false, Flag nach Batteriewechsel
      "room": "Hauptraum",
      "tMin": 24.8, Minimaltemperatur in °C seit Skriptstart
      "tMax": 29.6, Maximaltemperatur in °C seit Skriptstart
      "rhMin": 47, Minimale relative Luftfeuchtigkeit in % seit Skriptstart
      "rhMax": 67, Maximale relative Luftfeuchtigkeit in % seit Skriptstart
      "tStatus": "high", Temperaturgrenze high | ok | low, konfigurierbar über 868gw.conf
      "AHratio": 4, Verhältnis der absoluten Luftfeuchtigkeit außen/innen in %
      "RHvent": 68, theoretisch erzielbare Luftfeuchtigkeit nach "idealem Lüften"
      "rhStatus": "high", Feuchtigkeitsgrenze high | ok | low, konfigurierbar über 868gw.conf
    }
  ]
}

Messwerte in influxDB speichern und mit Grafana visualisieren

influxDB

InfluxDB auf dem Raspberry installieren, z. B. nach dieser Anleitung.

InfluxDB Client für Python installieren:

sudo pip3 install influxdb

Das Pythonskript apps/lacrossegw.py von oben legt beim ersten Start automatisch alles Nötige an:

  • Eine Datenbank “sensors” mit einer Datenverweildauer von einer Stunde
  • Eine retention policy jeweils für eine Woche und ein Jahr
  • Ein continous query jeweils 3 Minuten und 3 Stunden

Dieses Datenbankschema speichert die Rohdaten der Sensoren, welche pro Sensor ca. alle 10 s empfangen werden, für eine Stunde zwischen. Alle 3 Minuten werden die Durchschnittswerte der vergangen 3 Minuten berechnet und in eine “retention policy” gespeichert. Diese reduzierten Datenpunkte werden ihrerseits für eine Woche aufgehoben und alle 3 Stunden wieder gemittelt und abgespeichert. Auf diese Weise kann die Grafanavisualisierung schnell einen größeren Zeitraum anzeigen ohne unnötig viel Datenpunkte. Die auf alle 3 Stunden reduzierten Daten werden für ein Jahr behalten, sollen größere Zeiträume vorgehalten werden kann einfach die obige retention policy abgeändert werden.

influxDB 2

Alternativ zur alten influxDB können die Messwerte auch in eine influxDB2 Datenbank geschrieben werden. Dazu zunächst influxDB2 z. B. nach dieser Anleitung installieren oder einen Account bei influxDB Cloud anlegen. Anschließend den passenden Pythonclient installieren:

pip3 install influxdb-client

Über das Webinterface von influxDB2 können nun alle Einstellungen vorgenommen werden die dann in die Konfigurationsdatei 868gw.conf unter dem Ast influxdb2 eingetragen werden müssen (bucket, token, org und url).

Grafana auf dem Raspberry PI installieren, z. B. nach dieser Anleitung

Nun steht standardmäßig unter der URL http://<Raspberry IP>:3000 das Grafana Webinterface zur Verfügung. Nach der Verknüpfung mit der influxDB in Grafana können Dashboards erstellt werden: