Raspberry Pi automatische Lüftersteuerung mit FHEM und HomeMatic

Erstellt am 13. August 2016 von At2oo1

raspberry.tips
raspberry.tips - Raspberry Pi Projekte und Tutorials

Wer einen Gewölbe-Keller oder eine schlechte Bausubstanz hat wird das alte Feuchtigkeit und Schimmel Problem in den Kellerräumen kennen. Im Keller habe ich bereits einen passenden Lüfter installiert, konnte diesen aber bislang nicht effektiv automatisch steuern.

Hier kommt meine Hausautomatisierung mit dem Raspberry Pi auf Basis von FHEM mit HomeMatic Selbstbau CUL und meinen drahtlosen Luftfeuchtigkeitsmessern zum Einsatz, die vorhandene Schalter-Lösung wird um einen einfachen HomeMatic Schaltaktor ersetzt, die Steuerung des Lüfters wird anhand von Temperatur und Luftfeuchte Messungen zweier Temperatur und Luftfeuchte Sensoren realisiert einen für Außen und einen im Keller.

Die automatische Steuerung soll so ablaufen:

  1. Die Taupunkte über Temperatur- und Luftfeuchte-Sensoren für draußen und für den Keller berechnen
  2. Zu hohe Luftfeuchtigkeit herrscht dann wenn der Taupunkt weniger als 3°C unter der Temperatur im Keller liegt
  3. Wenn die Luftfeuchte zu hoch ist soll der Lüfter für 15 Minuten anspringen und dann nach 45 Minuten erneut prüfen
  4. Der Lüfter darf nur zwischen 08 und 21 Uhr laufen um das störende Brummen nachts zu vermeiden

Hardware

Neben den bereits vorhandenen Komponenten verwende ich folgende

  • Einen HomeMatic Schaltaktor mit einem Kanal
  • Etwas übrige Installationsleitung 3x 1,5mm² NYM-J oder 5×1,5mm² zum Verkabeln
  • Eine Aufputz Abzweigdose (eine mit min 40mm höhe, in die dünnen passt der Aktor nicht)
  • Einen 100mm Badlüfter, am Besten mit Rückstauklappe für den Einbau. Achtet auf das Förderungsvolumen

Wer die Sensoren für die Temperatur und Luftfeuchte nicht selbst bauen möchte kann natürlich auch die fertigen HomeMatic Komponenten verwenden und in FHEM einbinden. Diese sind natürlich etwas teurer

  • HomeMatic Sensor für außen, an der Nordseite anbringen
  • HomeMatic Sensor für innen, einer pro Raum

Verkabelung

Wichtig!
Arbeiten an 230V sind lebensgefährlich! Arbeitet immer mit abgeschalteter Versorgungsspannung und prüft bevor ihr startet das auch tatsächlich keine Spannung mehr anliegt. Wenn Ihr euch unsicher seit lasst die Arbeiten von einem Fachmann durchführen.

Ich habe den Aktor mit etwas doppelseitigem Klebeband in der Abzweigdose befestigt und mit 5×1,5mm NYM-J rausgeführt.

Mit dem Kabel bin ich dann in die vorhandene Aufputz Abzweigdose des Lüfters und habe wie folgt verkabelt. Besonderheit hier ist das der Lüfter neben einem Leiter Anschluss einen L1 besitzt der normalerweise mit einem Schalter zwischen L und L1 den Lüfter startet. Um den Lüfter mit dem Schaltaktor starten zu können ist die geschaltete Phase des Aktors (1) daher mit L und L1 am Lüfter verbunden.

FHEM Konfiguration

FHEM Pairing des HomeMatic Schaltaktor mit dem Selbstbau CUL

Das Pairing ist bei den Schaltaktoren leider immer sehr nervig da zum aktivieren des Pairing Modus ein Taster auf dem S1 für 4 Sekunden geschalten werden muss anstelle wie bei den anderen Geräten einfach einen kleinen Drücker am Aktor dafür vorzusehen.

Ich habe das Pairing so durchgeführt:

  • Strom ausschalten
  • Einen einfachen (Licht)schalter zwischen L und S1 klemmen
  • In Fhem für euren CUL den Pairing Modus aktivieren (Name des Geräts ist nanoCUL)
set nanoCUL hmPairForSec 600
  • Strom anschalten und Lichtschalter drücken bis die LED (Mode) anfängt zu blinken (Pairing hält nur 20 Sekunden an)
  • Ein paar Minuten abwarten bis das Device in FHEM auftaucht
  • Strom abschalten und Schalter demontieren

Alternativ kann das HomeMatic Gerät mit der Serien Nummer inFHEM vorangelegt werden, das erspart das versetzen in der Pairing Modus. Hat bei mir bisher leider nicht zuverlässig funktioniert.

set nanoCUL hmPairSerial ABC1234567

Nach ein paar Minuten sollte FHEM den Aktor erkannt haben.

HomeMatic Schaltaktor in FHEM einrichten

Nachdem das Pairing abgeschlossen ist solltet ihr einen neuen Raum im Hauptmenu finden (HM_CUL o.ä.), darin findet Ihr dann den Schaltaktor, mein 1 Kanal ist mit dem Namen “HM_4024BE” aufgetaucht. Ich möchte den Aktor natürlich in Keller_Lüfter  umbenennen und in den Raum Keller verschieben. Daher setze ich in FHEM folgende Kommandos ab.

set HM_4024BE deviceRename Keller_Luefter
attr Keller_Luefter room Keller

Ihr könnt den Lüfter nun schon über die Weboberfläche schalten, die Automatisierung folgt in den nächsten Schritten. Ich gruppiere noch aus kosmetischen Gründen und ändere das Symbol je nach Status

attr Keller_Luefter group Luefter
attr Keller_Luefter devStateIcon off:vent_ventilation_level_0 on:vent_ventilation_level_3

FHEM Konfiguration – Werte für Luftfeuchte und Temperatur

Da bei mir die Temperatur und Luftfeuchte in meinem EMONCMS System über meinen Selbstbau Sensoren landen musste ich diese erst wieder aus EMONCMS in FHEM bekommen, dazu verwende ich das Modul HTTPMOD um die Daten aus meinem Online EmonCMS abzurufen, das ganze sieht so aus:

Device für Keller Luftfeuchte mit Online Abfrage aus EMONCMS, die ID am Ende der URL ist der Feed von EmonCMS:

define Keller_Luftfeuchte HTTPMOD http://xxx.de/feed/timevalue.json?apikey=xxx&id=35 300
attr Keller_Luftfeuchte userattr reading01Name reading01Regex reading02Name reading02Regex
attr Keller_Luftfeuchte group Luftfeuchte
attr Keller_Luftfeuchte icon temperature_humidity
attr Keller_Luftfeuchte reading01Name Zeit
attr Keller_Luftfeuchte reading01Regex localtime("time":"([\d]+))
attr Keller_Luftfeuchte reading02Name Luftfeuchte
attr Keller_Luftfeuchte reading02Regex "value":"([\d\.]+)
attr Keller_Luftfeuchte room Luftfeuchte
attr Keller_Luftfeuchte stateFormat {sprintf("Luftfeuchte %.1f %", ReadingsVal($name,"Luftfeuchte",0))}
attr Keller_Luftfeuchte timeout 5
attr Keller_Luftfeuchte verbose 4

Device für Keller Temperatur mit Online Abfrage aus EMONCMS, die ID am Ende der URL ist der Feed von EmonCMS:

define Keller_Temperatur HTTPMOD http://xxx.de/feed/timevalue.json?apikey=xxx&id=37 300
attr Keller_Temperatur userattr reading01Name reading01Regex reading02Name reading02Regex
attr Keller_Temperatur fp_Grundriss 673,295,1, ,
attr Keller_Temperatur group Temperatur
attr Keller_Temperatur icon temp_temperature
attr Keller_Temperatur reading01Name Zeit
attr Keller_Temperatur reading01Regex localtime("time":"([\d]+))
attr Keller_Temperatur reading02Name Temperatur
attr Keller_Temperatur reading02Regex "value":"([\d\.]+)
attr Keller_Temperatur room Temperatur
attr Keller_Temperatur stateFormat {sprintf("Temperatur %.1f C", ReadingsVal($name,"Temperatur",0))}
attr Keller_Temperatur timeout 5
attr Keller_Temperatur verbose 4

Um den später wichtigen Wert für den Taupunkt und somit die Entscheidung für das automatische Anschalten des Lüfters treffen zu können musste ich noch eine Änderung vornehmen. Ein FHEM Device braucht zur Berechnung des Taupunktes (dewPoint) zwei readings einmal temperature und humidity.

Das ganze passiert über ein notify, sobald sich der Wert Luftfeuchte oder der Wert Temperatur auf einem der Devices ändert werden über ein setreading für dem Device KellerTemperatur die benötigten Readings humidity und temperature mit den aktuellen Werten geschrieben.

define Keller_UpdateHumidity notify Keller_Luftfeuchte:Luftfeuchte:.* setreading Keller_Temperatur humidity $EVTPART1
define Keller_UpdateTemperatur notify Keller_Temperatur:Temperatur:.* setreading Keller_Temperatur temperature $EVTPART1

Jetzt benutzen wir das angepsrochene Modul dewpoint um für alle Geräte/Devices welche die Readings humidity und temperature besitzen den Taupunkt zu berechnen:

define dew_all dewpoint dewpoint .* temperature humidity dewpoint

Das Ganze sieht dann z.B. für meine Kellertemperatur, unter welcher ich ja extra die beiden Readings mit notify angelegt habe so aus:

FHEM Konfiguration – Lüfter automatisch steuern

Der Lüfter soll natürlich nur dann anlaufen wenn es sinnvoll und gewünscht ist, da ich nun für den Keller und draußen den Taupunkt habe kann ich berechnen und visualisieren ob lüften sinnvoll ist. Folgende Konfiguration verwende ich in den nächsten Tagen zum Testen:

  • Ein Job KellerLüftungsJob, der alle 30 Minuten läuft wird definiert
  • Innerhalb des Jobs lese ich mit ReadingsVal die benötigten Werte in Variablen ein (Taupunkt, Temperatur etc)
  • Prüfe dann in einer IF Abfrage ob die aktuelle Zeit zwischen 7 und 21 Uhr liegt da der Lüfter nachts nicht laufen soll
  • In weiteren IF Abfragen wird geprüft ob der Taupunkt außen niedriger ist als innen und überhapt gelüftet werden darf und der Lüfter noch nicht läuft
  • Wenn alle Bedingungen Positiv waren wird via set Keller_Luefter on-for-timer 900 der Lüfter für 15Minuten gestartet
  • Die Zeilen Log 1, “Text” erzeugen einen Eintrag in der FHEM Logdatei, Abrufbar über das Hauptmenu

Zum Einspielen in FHEM klickt ihr im Menu auf “Edit Files” > “fhem.cfg” und fügt die Konfiguration ganz unten ein, speichert dann die Konfiguration.

define KellerLueftungsJob at +*00:30:00 {\
my $taupunktAussen=ReadingsVal("Aussen_Temperatur","dewpoint","-1");;\
my $temperaturAussen=ReadingsVal("Aussen_Temperatur","Temperatur","-1");;\
my $luftfeuchteAussen=ReadingsVal("Aussen_Luftfeuchte","Luftfeuchte","-1");;\
my $taupunktKeller=ReadingsVal("Keller_Temperatur","dewpoint","-1");;\
my $temperaturKeller=ReadingsVal("Keller_Temperatur","Temperatur","-1");;\
my $luftfeuchteKeller=ReadingsVal("Keller_Luftfeuchte","Luftfeuchte","-1");;\
my $taupunktWert = $taupunktKeller - $temperaturKeller;;\
if ($hour > "07" & $hour < "21") {\
 if ($taupunktAussen < $taupunktKeller) {\
  if (Value("Keller_Luefter") eq "off") {\
   Log 1, "Luefter an fuer 900sek";;\
   fhem("\
     set Keller_Luefter on-for-timer 900\
   ");;\
  }\
  else {\
   Log 1, "Luefter laueft schon, luftfeuchte zu hoch";;\
  }\
 }\
 else {\
  Log 1, "Luefter aus luftfeuchte ok";;\
  fhem("\
   set Keller_Luefter off\
  ");;\
 }\
}\
else {\
 Log 1, "Luefter aus ruhige stunden";;\
 fhem("\
   set Keller_Luefter off\
 ");;\
}\
}

Die Steuerung muss sicherlich noch auf die Umgebung optimiert werden, hierzu brauche ich aber erst mal Daten einiger Tage um entscheiden zu können. Eine Aktualisierung poste ich dann hier.

Grafiken erstellen

Taupunkt visualisieren

Natürlich möchte ich den Taupunkt noch in einer hübschen Grafik angezeigt bekommen. Hierzu erstelle ich erst mal für alle Räume einen Taupunkt-Log als Basis für die spätere Visualisierung:

define FileLog_Taupunkte FileLog ./log/Taupunkte-%Y-%m.log (Keller_Temperatur|Schlafen_Temperatur|Wohnzimmer_Temperatur|Bad_Temperatur|Aussen_Temperatur):(dewpoint).*
attr FileLog_Taupunkte alias Log Taupunkte
attr FileLog_Taupunkte group Logfile
attr FileLog_Taupunkte logtype text
attr FileLog_Taupunkte room Logfiles

Aus der Logfile definieren wir dann die SVG Grafik und schieben Sie in den Raum Keller

define SVG_FileLog_Taupunkte_1 SVG FileLog_Taupunkte:SVG_FileLog_Taupunkte_1:CURRENT
attr SVG_FileLog_Taupunkte_1 room Keller

Die Definition was innerhalb der Grafik angezeigt wird ist in der Datei “SVG_FileLog_Taupunkte_1.gplot” hinterlegt, fügt am Besten meine Definition über “Edit Files” > “SVG_FileLog_Taupunkte_1.gplot” ein.

set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics 
set y2tics 
set grid
set ylabel "Taupunkt"
set y2label "Taupunkt"
set title 'Taupunkte'

#FileLog_Taupunkte 4:Keller_Temperatur.dewpoint\x3a:1:
#FileLog_Taupunkte 4:Schlafen_Temperatur.dewpoint\x3a:1:
#FileLog_Taupunkte 4:Aussen_Temperatur.dewpoint\x3a:1:
#FileLog_Taupunkte 4:Bad_Temperatur.dewpoint\x3a:1:
#FileLog_Taupunkte 4:Wohnzimmer_Temperatur.dewpoint\x3a:1:

plot "<IN>" using 1:2 axes x1y2 title 'Keller' ls l1 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Schlafzimmer' ls l2 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Aussen' ls l3 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Bad' ls l4 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Wohnzimmer' ls l5 lw 1 with lines

Unter Umständen müsst ihr über den Raum Keller mit Klick auf “SVG_FileLog_Taupunlte_1” noch eure File-Logs / Werte ändern falls diese anders heißen.

Weitere Visualisierungen

Natürlich wollte ich, um das richtige Lüften kontrollieren zu können, noch pro Raum eine Grafik mit den Werten für Luftfeuchte, Temperatur und Taupunkt. Diese habe ich mir im Raum Taupunkte wie folgt erstellt. Beispiel Keller:

define SVG_FileLog_KellerUebersicht_1 SVG FileLog_Taupunkte:SVG_FileLog_KellerUebersicht_1:CURRENT
attr SVG_FileLog_KellerUebersicht_1 room Keller

Hier die dazu passende gplot File, ich benutze Temperatur und Luftfeuchte aus den File Logs meiner Sensoren, für eure Sensoren müsst ihr noch einen FileLog anlegen und dann in den Einstellungen die Quelle ändern.

set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title 'Keller Uebersicht'
set ytics 
set y2tics 
set grid
set ylabel "Luftfeuchte"
set y2label "Temperatur"

#FileLog_Temperatur 4:Keller_Temperatur.Temperatur\x3a:1:
#FileLog_Taupunkte 4:Keller_Temperatur.dewpoint\x3a:1:
#FileLog_Luftfeuchte 4:Keller_Luftfeuchte.*:1:
#FileLog_Keller_Luefter 4:Keller_Luefter.pct\x3a:1:

plot "<IN>" using 1:2 axes x1y2 title 'Temperatur' ls l8 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Taupunkt' ls l7 lw 3 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Luftfeuchte' ls l3fill lw 1 with lines,\
     "<IN>" using 1:2 axes x1y1 title 'Lüfter %' ls l0fill lw 1 with lines

Raspberry Pi automatische Lüftersteuerung mit FHEM und HomeMatic
raspberry.tips