Hauptmenü

Lüftersteuerung mit Laufzeiten

Begonnen von paddy325, 22 Februar 2017, 09:15:54

Vorheriges Thema - Nächstes Thema

paddy325

Hallo,

für die Steuerung eines Abluft-Ventilators in meinem Badezimmer möchte ich eine Steuerung implementieren.
Nun versuche ich schon einige Zeit die Problemstellung mit dem DOIF-Modul zu lösen. Leider fehlt mir offensichtlich
der richtige Lösungsansatz, so dass ich hoffe hier Hilfe zu finden.

Als Hardware nutze ich einen HM Temeratur-Feuchte-Sensor, einen HM Schaltaktor für den Lüfter und einen HM Wandtaster.

Folgende Logik soll ablaufen:

- 2 Betriebsarten: Automatik und Manuell
- Einschalten mit dem Taster soll immer möglich sein, egal welche Betriebsart.
- Im Automatikbetrieb soll der Lüfter ab einer bestimmten Feuchte-Schwelle eingeschaltet und bei Unterschreiten einer zweiten Schwelle ausgeschaltet werden.
- Im Manuellen Betrieb nur einschalten mit dem Taster und ausschalten bei Unterschreiten der zweiten Schwelle.
- Unabhängig von der Betriebsart soll es eine Mindest- und eine Höchstlaufzeit geben.
- Nach dem Ausschalten durch die zweite Schwelle muss eine Mindestzeit vergehen, bis der Automatikbetrieb den Lüfter wieder einschalten darf.


Zur Einstellung der Betriebsart, der Schwellen und der Mindest- sowie Maximallaufzeit habe ich einen Dummy mit entsprechenden Readings angelegt.

Im Pseudocode sollte es ungefähr so aussehen:


if(taster_event = on)
  Lüfter ein
  Laufzeit = 0
elsif(taster_event = off)
Lüfter aus
Auszeit = 0
elsif(betriebsart = automatik UND Feuchte > Schwelle1 UND Auszeit > Min_Auszeit)
Lüfter ein
Laufzeit = 0
elsif(Feuchte < Schwelle2 UND Laufzeit > Mindestlaufzeit)
Lüfter aus
Auszeit = 0
elsif(Laufzeit > Maximallaufzeit)
Lüfter aus
Auszeit = 0


Wäre nett, wenn mir einer von den Profis hier auf die Sprünge helfen könnte...


Gruß Patrick

automatisierer

Du hast doch quasi alles zusammen getragen was du an Bedingungen und Abhängigkeiten brauchst, da musst du doch nur noch die Anleitung zu DOIF lesen und das ganze umsetzen. Wenn du dein DOIF zusammen gewurschtelt hast und es nicht läuft, dann wird dir hier auf jeden Fall geholfen. Aufgabe stellen und Ergebnis abholen, klappt meisst nicht so gut.
Als Tipp noch, fang einfach mal klein an. Also, mach meinet wegen erst mal nur die Steuerung über die Luftfeuchtigkeitswerte zusammen mit der min/max Laufzeit. Und lass das DOIF danach Bedingung für Bedingung wachsen... Wie gesagt, bei Problemen wird geholfen, aber das was du da verlangst, ist ein mMn ein wenig zu komplex um dir da mal ebend eine Lösung zu präsentieren.

paddy325

Hallo,

ich habe schon recht lange mit DOIF experimentiert und auch die Anleitung(en) mehrfach gelesen.
Vielleicht war meine Frage nicht konkret genug. Das DOIF an sich funktioniert bei mir im kleinen (nur Schwellen und oder Taster).
Das Problem entsteht bei den Zeiten (Laufzeit / Auszeit), da weiß ich einfach nicht wie ich es anstellen soll (timer, wait, reading...).

Deshalb nochmal konkret die Frage:
Wie kann ich in einem DOIF auf eine, seit einem bestimmten Event (z.B Lüfter ein) vergangene Zeit prüfen?

automatisierer

#3
OK, dann hab ich dich tatsächlich falsch verstanden - sorry!

Wenn du den Lüfter über das DOIF eingeschaltet hast, dann kannst du das ausschalten ja auch direkt mit auf den Weg geben und dieses mit dem Attribut wait um die gewünschte Laufzeit verzögern (cmd_1.1 cmd_1.2).

Die Lüfterpause, kannst du evtl. mit dem Attribut cmdpause hin bekommen. Auch möglich wäre mit ReadingsAge zu prüfen, wie lange der Lüfter bereits aus ist.

Edit:
ReadingsAge("Device","Reading","Defaultwert")   >  gibt das Alter des Readings in Sekunden zurück. Wenn nicht vorhanden, dann den Defaultwert.

Per

Zitat von: paddy325 am 22 Februar 2017, 13:51:14Wie kann ich in einem DOIF auf eine, seit einem bestimmten Event (z.B Lüfter ein) vergangene Zeit prüfen?
mittels :sec.

Brockmann

Fixe Schwellwerte zum Ein- und Ausschalten könnten problematisch werden. Hast Du Dich schon mal mit den Feuchtigkeitswerten in Deinem Badezimmer im Lauf des Jahres befasst? Da ist abhängig von Jahreszeit und Wetterlage eine ziemliche Dynamik drinnen.

Du könntest auch den Status des Aktors bzw. dessen Timestamp auswerten, um zu sehen, wann der zuletzt ein- oder ausgeschaltet wurde. Ist eventuell zuverlässiger, weil das DOIF ja ständig durch den Feuchte-Sensor getriggert wird und im Prinzip jederzeit den Status ändern kann.

paddy325

Vielen Dank für Eure Antworten! Ich habe die beiden Lösungen (wait/cmpause und :sec) mal ausprobiert.

Mit wait/cmdpause habe ich es zwar mehr oder weniger ans Laufen bekommen, fand den Code aber schwer lesbar, da die Zeitbedingungen losgelöst vom Rest der Definition im wait / cmdpause Parameter stehen.

Mit :sec habe ich folgende Lösung geschrieben:

## Einschalten mit den Taster
([ba2_ve1_setup:pushbutton_state] eq "on")
  (set ba2_ve1_setup on)

## Ausschalten mit dem Taster oder wenn Maximallaufzeit erreicht
DOELSEIF ([ba2_ve1_setup:pushbutton_state] eq "off" or
         ([ba2_ve1_setup:state] eq "on" and [ticker_minute:state] and [ba2_ve1_setup:state:sec] > 1800))

  (set ba2_ve1_setup off, setreading ba2_ve1_setup pushbutton_state off)

## Einschalten im Automatikbetrieb wenn länger aus als Mindest-Auszeit
DOELSEIF ([ba2_ve1_setup:mode] eq "automatik" and [ba2_th1:humidity]>65 and
          [ba2_ve1_setup:state] eq "off" and [ticker_minute:state] and [ba2_ve1_setup:state:sec] > 900)
 
  (set ba2_ve1_setup on,  setreading ba2_ve1_setup pushbutton_state on)

## Ausschalten wenn Feuchte unter Schwelle und Minimallaufzeit erreicht
DOELSEIF ([ba2_th1:humidity]<60 and
          [ba2_ve1_setup:state] eq "on" and [ticker_minute:state] and [ba2_ve1_setup:state:sec] > 600)

  (set ba2_ve1_setup off,  setreading ba2_ve1_setup pushbutton_state off)



ticker_minute ist hier ein Dummy, der 1x pro Minute umgeschaltet wird. Dies benötige ich, damit die Bedingung auch getriggert wird wenn der Feuchtesensor sehr lange kein Event liefert (steht auf event-on-change-reading). In ersten Tests funktioniert alles wie gewünscht! :)
Die fest eingestellten Schwellen und Zeiten werden noch durch die Readings eines Dummys ersetzt.

@Brockmann: Was wäre denn besser zur Steuerung des Lüfters als die relative Luftfeuchte? Der absolute Feuchtegehalt der Luft? Oder gibt es noch andere Indikatoren dafür, dass gelüftet werden sollte?

Gruß Patrick

Brockmann

Zitat von: paddy325 am 24 Februar 2017, 23:56:32
@Brockmann: Was wäre denn besser zur Steuerung des Lüfters als die relative Luftfeuchte? Der absolute Feuchtegehalt der Luft? Oder gibt es noch andere Indikatoren dafür, dass gelüftet werden sollte?
Die relative Luftfeuchte geht schon, nur wirst Du nicht mit fixen Werten arbeiten können. Unser Badezimmer hat im Moment beispielsweise 41% Feuchte im "Ruhezustand". Im Sommer ohne Heizung liegt dieser Wert eher bei 60%. Würde man nun beispielsweise 50% als Zielwert vorgeben, würde das im Winter gut klappen, aber im Sommer läuft der Lüfter endlos.

Ich arbeite deshalb mit dynamischen Schwellwerten, die sich automatisch an die vorherrschende Luftfeuchte anpassen und dann auch darauf basierend einen Zielwert berechnen, bei dem der Lüfter wieder ausgeschaltet wird.

Es gibt aber noch andere Möglichkeiten. Wenn Du hier im Forum nach "Lüften" suchst, findest Du ein paar heiße Diskussion zu dem Thema.

Damian

Zitat von: Brockmann am 25 Februar 2017, 09:32:07
Es gibt aber noch andere Möglichkeiten. Wenn Du hier im Forum nach "Lüften" suchst, findest Du ein paar heiße Diskussion zu dem Thema.

zum Beispiel über dewpoint siehe: https://forum.fhem.de/index.php/topic,37960.msg302000.html#msg302000
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Zitat von: paddy325 am 24 Februar 2017, 23:56:32Oder gibt es noch andere Indikatoren dafür, dass gelüftet werden sollte?
Du könntest einfach den Wert mit den anderer Zimmer vergleichen. Dann hast du eine gleitende Grenze.

Wuppi68

da gibt es doch den Dewpoint ... - sogar als Funktion schon in FHEM vorhandern

als Einschaltbedingung dann wenn Dewpoint > Isttemperatur --> Lüfter ein (hat das Heating Modul nicht eine einstellbare Hysterese?)
via Schalter einfach ein On /  On-For-Timer setzen
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen