Taupunktgesteuerte Kellerlüftung und Temperaturabhängig

Begonnen von Ruggy, 20 Dezember 2020, 23:14:33

Vorheriges Thema - Nächstes Thema

Ruggy

Hallo,

ich hoffe mein langer Text schreckt nicht ab. Im unteren Teil habe ich geschrieben, was ich steuern möchte; oben die Hintergründe zu dem Vorhaben.

Habe durch die Suchfunktion nur etwas ältere Beiträge bis 2017 gefunden, welche sich mit dem Thema beschäftigt haben.
Leider sind meine FHEM Kenntnisse/Perl-Kenntnisse nicht besonders gut und ich konnte nur immer ein Stück weit folgen und bin dann ausgestiegen. Vor allem wenn mit DOIF "verschachtelt" wird.
Es wurde auch mit Threshold gearbeitet. Dies habe ich mir auch in der Commandref angesehen aber bzgl. meinen Vorhaben auch nicht weiter gekommen.

Gibt es zwischenzeitlich noch andere (einfachere Lösungen einer Taupunktgesteuerten Kellerlüftung, welche auch Temperaturabhängig verschieden steuern sollte.


Möchte kurz mein Vorhaben erklären:

Im Haus meiner Eltern befindet sich ein alter Gewölbekeller, welcher eigentlich immer feucht und kühl ist (Erdfeuchte/Erdtemperatur).
Die Kellertemperatur schwankt so zwischen 9-13 Grad (je nach Jahreszeit); die relative Luftfeuchtigkeit ist immer über 80 bis 90 %.
Jetzt gerade ist außen eine Temperatur von ca. -0,5 °C, einer relative Luftfeuchtigkeit von 97 % und eine absolute Luftfeuchtigkeit von ca. 4,5 g/m3. Im Keller ist eine Temperatur von ca. 9 °C einer relative Luftfeuchtigkeit von 93,5 % (es regnet also bald ;-) ) und einer absoluten Luftfeuchtigkeit von ca. 8,25 g/m3.
Ich möchte den Keller nicht Trocken bekommen (ist sowieso nicht möglich) aber etwas trockener.

In den Keller ist schon sehr lange eine Öffnung mit einen Rohr 15 cm Durchmesser. Über diese Öffnung "zirkulierte" mehr oder weniger das ganze Jahr die Luft.

Um den Keller etwas trockener zu bekommen habe ich jetzt ein zweites Rohr am anderen Ende vom Keller nach außen gelegt. In jedem Rohr ist Rohrlüfter, welche ich über FHEM und Smart+ Steckdosen ein- und ausschalte (jeder einzeln). Einer bläst die Luft herein, der andere hinaus.

Mit zwei Xiaomi Temperatur/Feuchtesensoren (einer im Keller; einer außen im Freien) lasse ich mir den "dewpoint" berechnen und in einer Grafik darstellen. Nach dieser entscheide ich dann, ob ich die Lüfter ein oder ausschalte. Da mache ich halt nur, wenn ich gerade zeit habe und dran denke.

Einige werden jetzt wahrscheinlich die Hände über den Kopf zusammen schlagen, aber sowei meine Kenntnisse hierzu :-\

Seit ich mich entschlossen habe, ein zweites Rohr in den Keller zu legen (ist schon ne Zeit lang her, weil es relativ aufwändig war), war das Ziel natürlich, dass alles automatisch geht. Deshalb bin ich eigentlich damals über professionelle Lüftungssteuerungen auf FHEM gestoßen und mir gedacht, dass ich damit ja genau das machen könnte.



Folgene Steuerung habe ich mir gedacht:

Die Lüfter sollen grundsätzlich nur dann einschalten, wenn der Taupunkt außen 2 °C kleiner ist als innen (also trockener).

Die Lüfter sollen Jahreszeitabhängig verschieden lange laufen um im Winter ein auskühlen oder aber auch im Sommer ein aufheizen des Kellers zu vermeiden. Hier weiß ich jedoch nicht wie ich Sommer und Winter in FHEM unterscheiden soll oder sollte es nur Temperaturabhängig geregelt werden (z.B. Kellertemperatur darf 9 °C nicht unterschreiten und 12,5°C nicht überschreiten; evlt. längere oder kürzere Lüftungsintervalle)
Im Sommer sollen die Lüfter dann 10 min laufen und dann 60 Pause machen, dann wieder 10 min laufen usw.
Im Winter sollen die Lüfter dann 10 min laufen und dann 120 min Pause machen, dann wieder 10 min laufen usw.

Wegen den "Lärm" sollen sie nur zwischen 8:00 und 22:00 Uhr laufen (wobei wahrscheinlich gerade im Sommer in den Nachstunden trockener wäre; evlt. wäre es hier eine Möglichkeit, dass dann nur z.B. alle 180 min die Lüfter eingeschalten werden?).

Kann man diese vielen Abfragen und Anweisungen alles in die Steuerung unterbringen?
Kann/muss ich das mit Threshold lösen oder mit vielen vielen DOIF?

Oder ist mein geplantes "Lüftungsverhalten" grundsätlich nicht richtig/zielführend?

Vielen Dank
Viele Grüße

Ruggy

amenomade

Zuerst: das Modul Astro liefert die Jahreszeit, falls eine Steuerung nach Datum nicht reichen würde.

Das ganze sollte mit nur einem DOIF machbar sein. Um dieses DOIF zu simplifizieren, würde ich aber doch THRESHOLD dazu benutzen, um zu entscheiden, ob auf Grund Taupunkt es theoretisch belüftet werden muss oder nicht.

Dann im DOIF alle andere Bedingungen:
DOIF ([threshold hat gesagt, es muss belüftet werden] and [08:00-22:00] and $month > 4 and $month < 10) (set Lüfter on-for-timer 10)
DOELSEIF (das gleiche ausser bis auf: and ($month<=4 or $month>=10)) (set Lüfter on-for-timer 10) DOELSE (set Lüfter aus)
Mit attribut repeatcmd 70:130
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

gvzdus

Genau Deine Überlegung, Ruggy, habe ich mir auch gemacht. Auch bei mir ist der Keller nicht trocken zu kriegen - und alles leidet, wenn die Feuchtigkeit kondensiert.
Es wäre nett, wenn Du über das Ergebnis mal berichtest - gerne mit Graphen.
Falls Du den Eindruck hast, dass FHEM Dir feindlich ggü. steht, können wir gerne mal eine Screensharing-Session per Skype machen.

Ruggy

Vielen Dank schon mal für die Tipps.

Habe es jetzt schon mal geschafft, dass ich beide Lüfter gleichzeitig einschalten kann (schon mal ein Anfang)   ;)

define KELLER_LUEFTER_ALLE dummy
attr KELLER_LUEFTER_ALLE eventMap on off
attr KELLER_LUEFTER_ALLE room Keller

define Luefter_On notify KELLER_LUEFTER_ALLE:on set set HUEDevice17,HUEDevice15 on
define Luefter_Off notify KELLER_LUEFTER_ALLE:off set set HUEDevice17,HUEDevice15 off


Werde mir jetzt dann mal an die Umsetzung nach der vorgeschlagenen Steuerung von @amenomade machen. Hier bin ich mir aber nicht ganz sicher, ob ich dass schaffe. Werde es aber erst mal versuchen.
Evlt. müsste ich aber auf das "Skype-Angebot" von @gvzdus zurück kommen. Danke schon mal für das Angebot.
Aber evlt. schaffen wir es auch hier.


@gvzdus
Gerne stelle ich Dir alle Infos zur Verfügung, welche ich habe.
Gerne auch Graphen. Hier kann ich aber auch immer nur einen Tag mir anzeigen lassen. Evlt. gibt es eine Möglichkeit, einen Graph über einen längeren Zeitraum zur Verfügung zu stellen?

Hier kurz mal welche "Hardware" ich verwendet habe:
Als Rohre habe ich die orangen KG-Rohre DN-150 verwendet.
Als Rohrventilator einfach beim bekannten Versandriesen mit "A" Rohrventilator 150mm eingeben. Die Marke beginnt mit S. (weiß nicht ob ich hier links oder Herstellernamen einstellen darf). Er ist relativ leise, aber es gibt wahrscheinlich leisere.

Weil die Rohre ziemlich lange sind (ca. 4 m) dröhnt es etwas (denke es liegt an der Länge). Die Rohre habe ich alle paar Meter mit Rohrschellen befestigt und mit so einen "Dämmschlauch" gedämmt. Ist dadurch etwas leiser geworden.

Habe dann noch versucht die Rohrventilatoren mit "Segelstutzen" vom Rohr zu entkoppeln (Suchbegriff "Segeltuchstutzen DN 150 Balg Entkopplung" beim anderen Versandriesen mit "E" eingeben). Hat auch ein bischen etwas gebracht, aber nicht all zu viel (hätte mir hier mehr erhofft). Hierfür habe ich mir mit den 3D-Drucker Adapter zwischen den KG-Rohren und den Segeltuchstutzen gedruckt. Bei Bedarf kann ich Dir die Dateien zur Verfügung stellen (fallst Du keine Möglichkeit zum Drucken/drucken lassen hast, würden wir denke ich auch eine Lösung finden.

gvzdus

Wow, 4 Meter bei 15 cm Durchmesser ist ja schon Einiges an Widerstand.

Dass das "dewpoint"-Modul Dir die Taupunktberechnung liefert, hast Du ja vermutlich schon festgestellt.

Ich verstehe nicht ganz, wieso Du Graphen nur tageweise siehst. Die billigste Methode ist doch, auf einen Filelogger ein SVG draufzusetzen. Und dieser Graph hat doch dann die "Knöpfe" zum Zoom-Out.


Ruggy

#5
Ja, 4m ist schon ne Menge.

Ging aber leider nicht anders. Man merkt aber am Ausgang (nach den 4 Metern schon, dass sich etwas tut). Auch an den Feuchtigkeitswerten macht es sich bemerkbar. Aber die steigen halt auch bald wieder nach dem Ausschalten. Wobei auch mein sporadisches manuelle Lüften bisher nicht sinnvoll war. Jedoch habe ich auf jeden Fall eine Verbessung des Geruchs im Keller festgestellt.

Zeichne die Werte mit DbLog auf und lasse sie mir so anzeigen u.a. den dewpoint. Ich kann immer einen Tag sehen und kann mit den Pfeiltasten die Tage zurück und vor blättern. Am jeweiligen Tag kann ich dann hineinzoomen und auch heraus.
Aber mehrere Tage gleichzeitig bzw. eine Woche oder Monat kann ich mir nicht anzeigen lassen.

In der commandref ist folgendes Beispiel:
define dewpoint dewpoint indoor
define dewpoint dewpoint outdoor
define TH_room THRESHOLD indoor:dewpoint:0:outdoor:dewpoint AND TH_hum:state:on ventilator|set @ on|set @ off|2


Benötige ich die ersten beiden Zeilen mit dewpoint, da ich den berechneten dewpoint ja schon von meinen Thermometern habe. Oder würde hier nur die dritte Zeile reichen? So z.B.?
define Threshold_Keller THRESHOLD KEL_LUFTFEUCHTIGKEIT:dewpoint:0:AUS_LUFTFEUCHTIGKEIT:dewpoint ventilator|set @ on|set @ off|2[/code]

Das mit der min. Luftfeuchtigkeit würde ich weglassen, weil ich diese wahrscheinlich nie unterschreiten werde. Wie ich meine Lüfter mit in die Formel bringe habe ich auch noch nicht geschafft.
Als "Ventilator" muss wahrscheinlich mein "KELLER_LUEFTER_ALLE" in die Formel? Aber was bedeutet dann "on|set @ off|2"?

gvzdus

#6
Mit meinen FHEM-Kenntnissen (und weil ich Deine Situation nicht gut nachstellen kann) würde ich erst mal den Zwischenschritt über ein Delta im Taupunkt gehen:

define deltadewpoint dummy
define calcdelta notify (KEL|AUS)_LUFTFEUCHTIGKEIT:dewpoint.* { my $a=ReadingsVal("KEL_LUFTFEUCHTIGKEIT", "dewpoint", 0)-ReadingsVal("AUS_LUFTFEUCHTIGKEIT", "dewpoint", 0); fhem ("set deltadewpoint " . $a) }


... und dann mal gucken, ob in deltadewpoint sauber das Delta bei jedem Update eines der beiden Temperatursensoren reinläuft. (Falls mein Trockencode richtig ist). Hinweis: Wenn Du meine Defines in der WebGUI-"Kommandozeile" eingibst, musst Du das Semikolon vor fhem (" verdoppeln.

Ruggy

Ich würde deine Defines oben in der Zeile eingeben, wenn ich FHEM im Browser öffne; denke das meinst Du?

Meinst Du dann so mit den zwei ;;?
Wo kann ich den den Befehl noch eingeben?


define calcdelta notify (KEL|AUS)_LUFTFEUCHTIGKEIT:dewpoint.* { my $a=ReadingsVal("KEL_LUFTFEUCHTIGKEIT", "dewpoint", 0)-ReadingsVal("AUS_LUFTFEUCHTIGKEIT", "dewpoint", 0);; fhem ("set deltadewpoint " . $a) }


Was wird mit den Befehl dann gemacht? Wird dadurch der dewpoint der zwei Xiaomi "Thermometer" in eine datei geschrieben?

gvzdus

Ja, die Zeile oben.

2 Semikolons:
Ich gebe ein Notify mit Perl-Kommando (an den geschweiften Klammern erkennbar) i.d.R. erst ganz leer ein (also nur {} ), und editiere dann recht bequem, indem ich auf "DEF" bei "Internals" klicke. Dann hat man einen "schönen" Editor - und da musst Du nur 1 Semikolon eingeben.

Die Idee ist, dass Du Dir erst einmal ein dummy-Device erzeugst, dass die Differenz der Taupunkte innen / außen beinhaltet. Das kannst Du in die Datenbank wegloggen, die Updates kontrollieren, und dann darauf mit Threshold für die Ventilatorsteuerung arbeiten.
Ich finde, gerade am Anfang ist es bei FHEM hilfreich, mit Zwischenschritten zu arbeiten, um zu dem "Das habe ich schon geschafft, wie mache ich jetzt ...?" zu kommen.

Ruggy

Habe die Befehle so eingegeben.

Hier ein List vom deltadewpoint:

Internals:
   CFGFN     
   FUUID      5fe0eb17-f33f-f59f-e80b-ec58da6542b958ca
   NAME       deltadewpoint
   NR         1200
   STATE      5.8
   TYPE       dummy
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1608576285.51868
           VALUE      5.8
   READINGS:
     2020-12-21 19:44:45   state           5.8
Attributes:
   room       Kellerlüftung


Hier ein List von calcdelta:

Internals:
   CFGFN     
   DEF        (KEL|AUS)_LUFTFEUCHTIGKEIT:dewpoint.* { my $a=ReadingsVal("KEL_LUFTFEUCHTIGKEIT", "dewpoint", 0)-ReadingsVal("AUS_LUFTFEUCHTIGKEIT", "dewpoint", 0); fhem ("set deltadewpoint " . $a) }
   FUUID      5fe0eb52-f33f-f59f-d120-dc8c0132d5471c97
   NAME       calcdelta
   NR         1203
   NTFY_ORDER 50-calcdelta
   REGEXP     (KEL|AUS)_LUFTFEUCHTIGKEIT:dewpoint.*
   STATE      2020-12-21 19:44:45
   TRIGGERTIME 1608576285.51564
   TYPE       notify
   Helper:
     DBLOG:
       state:
         DbLog:
           TIME       1608575826.8177
           VALUE      active
   READINGS:
     2020-12-21 19:37:06   state           active
Attributes:
   room       Kellerlüftung

gvzdus

Das wirkt doch erst mal gut: "State ist 5.8", das ist die Differenz im Taupunkt Keller - Außen.

Ruggy

Könnte das so funktionieren?

Wenn ich es richtig verstanden habe sollten die Lüfter in den

- Sommermonaten (Mai bis September) einschalten, wenn der Taupunkt von außen mindestens 2 ° weniger hat als im Keller und es zwischen 8:00 und 23:00 Uhr ist und zwar dann für 30 Minuten (?oder sollte ich hier nicht als Zeiteinheit 1.800 schreiben; Sekunden)?

- Wintermonaten (Oktober bis April einschalten, wenn Taupunkt außen mindestens 2 ° weniger hat als im Keller und zwischen 8:00 und 23:00 Uhr ist und dann für 20 Minuten?

define TAUPUNKT_LUEFTUNG_KG DOIF ([deltadewpoint:state >2] and [08:00-23:00] and $month > 4 and $month < 10) (set KELLER_LUEFTER_ALLE on-for-timer 30) DOELSEIF ([deltadewpoint:state >2] and [08:00-23:00] and ($month<=4 or $month>=10)) (set KELLER_LUEFTER_ALLE on-for-timer 20) DOELSE (set KELLER_LUEFTER_ALLE off)


Wie bekomme ich noch folgendes hinein, dass sich die ganze Regelung z.B. nach 70 Minuten im Sommer und 130 Minuten im Winter wiederholt?

Mit attribut repeatcmd 70:130

Ruggy

Wie sollte folgender Abschnitt aussehen?
In Klammern oder nicht in Klammern?

So
...$month > 4 and $month < 10)...
oder so
...($month > 4 and $month < 10))...

gvzdus

Also, ich würde mich jetzt erst mal freuen, wenn der olle Lüfter überhaupt dreht. Sommer/Winter-Umschaltung kannst ja auch machen, indem Du mit "at" repeatCmd jeweils im Sommer / Winter umschaltest.

Bei meinem Versuch des Testens mit dummy-Device klappt das hier:
([deltadewpoint:state]>2 and [07:00-23:00] and ($month>4 and $month<10)) (set KELLER_LUEFTER_ALLE on) DOELSEIF ([deltadewpoint:state]>2 and [07:00-23:00] and ($month<=4 or $month>=10)) (set KELLER_LUEFTER_ALLE on2) DOELSE (set KELLER_LUEFTER_ALLE off)

Zeiten sind geändert, und statt "on-for-timer" setze ich meinen Dummy KELLER_LUEFTER_ALLE nur fest auf Werte.
Die wesentliche Abweichung zu Dir:

Statt
[deltadewpoint:state >2]
schreibe ich
[deltadewpoint:state]>2


Ruggy

Habe es jetz so mal versucht; bisher schalten sie nicht ein.
Habe den Taupunktwert zu Testzwecken auf 1 verringert, weil dieser momentan unter 2 (1.9) ist.

soll das on2 heißen oder ist die "2" zuviel?

([deltadewpoint:state]>1 and [07:00-23:00] and ($month>4 and $month<10)) (set KELLER_LUEFTER_ALLE on) DOELSEIF ([deltadewpoint:state]>2 and [07:00-23:00] and ($month<=4 or $month>=10)) (set KELLER_LUEFTER_ALLE on2) DOELSE (set KELLER_LUEFTER_ALLE off)