Servus zusammen,
Für meinen Lüfter in der Küche wollte ich folgendes:
- Lüfter einschalten, wenn die Luftfeuchtigkeit > 50% ist aber
- nur, wenn auch trockenere Luft reinkommt, also der Taupunkt draußen deutlich kleiner als drinnen ist.
- Um auch bei niedriger Luftfeuchte in der Küche etwas Luftbewegung zu haben: alle 2h für 10 Minuten Lüften
Wenn ich die Doku richtig verstanden habe, kann DEWPOINTs FAN Funktion lüften, solange der Taupunkt drinnen größer als draußen ist (Punkt 2). Ich hab' das mal versucht, klappt aber nicht, weil selbst im Winter bei einem Taupunkt weit unter 0 der Taupunkt drinnen niemals so klein werden kann. THRESHOLD kann natürlich Punkt 1, aber nicht Punkt 2. Punkt 3 bilde ich mir halt ein ;)
Als Anfänger habe ich mir jetzt folgendes aus den Fingern gesaugt und würde mich über konstruktive Kritik sehr freuen:
# Lüftersteuerung in der Küche:
# - An alle 2h für 10min
# - An wenn Luftfeuchtigkeit > 50% und der Taupunkt draußen 10C größer als drinnen ist.
define Kueche.Hygrostat THRESHOLD Kueche.TemperatureHumidity:humidity:5:50
attr Kueche.Hygrostat state_cmd1_gt on
attr Kueche.Hygrostat state_cmd2_lt off
attr Kueche.Hygrostat state_format _sc
define Kueche.Taupunktdifferenz DOIF
attr Kueche.Taupunktdifferenz state {([Kueche.TemperatureHumidity:dewpoint] - [Wetter:dewpoint])}
define Kueche.LuefterByTime dummy
attr Kueche.LuefterByTime eventMap on off
attr Kueche.LuefterByTime setList on off
attr Kueche.LuefterByTime useSetExtensions 1
define Kueche.LuefterByTime.Aktivieren at +*02:00:00 set Kueche.LuefterByTime on-for-timer 600
define Kueche.Taupunktdifferenz.Schwellwert THRESHOLD Kueche.Taupunktdifferenz:state:2:10
attr Kueche.Taupunktdifferenz.Schwellwert state_cmd1_gt on
attr Kueche.Taupunktdifferenz.Schwellwert state_cmd2_lt off
attr Kueche.Taupunktdifferenz.Schwellwert state_format _sc
define Kueche.Luefter.Logik DOIF ([Kueche.LuefterByTime:"on"] or ([Kueche.Hygrostat:"on"] and [Kueche.Taupunktdifferenz.Schwellwert:"on"])) (set Kueche.Luefter.Schalter on) DOELSE (set Kueche.Luefter.Schalter off)
Danke für Eure Mühe :)
Markus
Hmmm, das Einschalten via [Kueche.LuefterByTime:"on"] scheint nicht zu funktionieren :( Da hab' ich wohl noch einen groben Denkfehler.
Kann es sein, daß im Falle von [Kueche.LuefterByTime:"on"] das set ... on ausgeführt wird, gleich gefolgt von einem set ... off?
define Kueche.Luefter.Logik DOIF ([Kueche.LuefterByTime:"on"] or ([Kueche.Hygrostat:"on"] and [Kueche.Taupunktdifferenz.Schwellwert:"on"])) (set Kueche.Luefter.Schalter on) DOELSE (set Kueche.Luefter.Schalter off)
Das kann auch nichts werden. Ein and auf ein weiteres Event geht nicht. Es können nicht zur selben Zeit zwei Events kommen zur Auswertung.
Ach mist, ich dachte allmählich hätte ich das verstanden :(
Wie geht es denn nun richtig? Ich dachte, ich vergleiche Zustände, nicht Events...
Nee du triggerst auf Events. Nach dem Ende die Abfrage musst umschreiben auf Zustand und wenn du es nicht brauchst als Trigger dann mit ? davor als nur Abfrage
Ich bin selbst noch absoluter Anfänger, aber vielleicht helfen die DOIF_Readings weiter?
https://fhem.de/commandref_DE.html#DOIF_Readings
Servus CoolTux,
Zitat von: CoolTux am 22 März 2018, 17:47:23
Nach dem Ende die Abfrage musst umschreiben auf Zustand
Ich bin Dir ja echt dankbar, daß Du mir helfen willst - aber mit Sätzen die von Yoda kommen könnten tu' ich mich echt schwer :p
Ernsthaft, ich hab' versucht schlau daraus zu werden, mit der DOIF-Doku daneben... Leider kein Erfolg ;(
cu
Markus
Sorry, ich war unterwegs.
define Kueche.Luefter.Logik DOIF ([Kueche.LuefterByTime:"on"] or ([Kueche.Hygrostat:"on"] and [Kueche.Taupunktdifferenz.Schwellwert:"on"])) (set Kueche.Luefter.Schalter on) DOELSE (set Kueche.Luefter.Schalter off)
Ok ich sehe gerade. Du hast die Bedingungen nach dem or verknüpft.
Also entweder ein [Evnt Kueche.LuefterByTime:"on"] oder aber ein Event [Kueche.Hygrostat:"on"] UND [Kueche.Taupunktdifferenz.Schwellwert]
Willst Du es wirklich so haben?
Deiner Beschreibung entnehme ich das du eigentlich [Kueche.Taupunktdifferenz.Schwellwert] nur abfragen willst. Du willst nicht wirklich auf die Differenz reagieren. Also
define Kueche.Luefter.Logik DOIF ( [Kueche.LuefterByTime:"on"] or ([Kueche.Hygrostat:"on"] and [Kueche.Taupunktdifferenz.Schwellwert] eq "on") ) (set Kueche.Luefter.Schalter on) DOELSE (set Kueche.Luefter.Schalter off)
Bei Fragen. Fragen
Servus CoolTux,
ja, danke! Jetzt verstehen wir uns :) Kann ich heute leider nicht mehr ausprobieren, aber morgen hoffentlich.
Vielleicht könntest Du mir noch was helfen: ich weiss, irgendwo in der FHEM-Doku war der Unterschied zwischen "auf Event reagieren" und "status abfragen" definiert, aber ich hab's beim besten Willen nicht mehr gefunden. Ich seh's ja jetzt in Deinem Beispiel, aber weisst du aus dem Stegreif wo das in der Doku steht?
Schönen Abend,
Markus
http://commandref.fhem.de/commandref_DE.html#DOIF_Ereignissteuerung
http://commandref.fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
Bitte schön
Grüße
Inzwischen hab' ich auf folgendes umgestellt und das scheint zu funktionieren:
define Kueche.Luefter.Logik DOIF (([Kueche.LuefterByTime] eq "on" ) or (([Kueche.Hygrostat] eq "on") and ([Kueche.Taupunktdifferenz.Schwellwert] eq "on")) ) (set Kueche.Luefter.Schalter on) DOELSE (set Kueche.Luefter.Schalter off)
Es werden also gar keine Events mehr abgefragt, sondern nur noch Statusübergänge (?)
Ich würde ja gerne was lernen, drum versuche ich mal zu erklären wie ich das verstehe - bitte korrigiert mich!
- Solange sich kein Zustand ändert tut sich nichts.
- Bei einem Zustandsübergang von [Kueche.LuefterByTime] nach "on" wird das DOIF aufgerufen und cmd_1 (set...on) gestartet.
- Bei einem Zustandsübergang von [Kueche.LuefterByTime] nach "off" (bzw. "weg von on") wird cmd_2 ausgeführt (set..off)
Der Teil war einfach ;)
- Bei einem Zustandsübergang von [Kueche.Hygrostat] nach "on" wird [Kueche.Taupunktdifferenz.Schwellwert] auf "on" verglichen und bei Übereinstimmung cmd_1 ausgeführt
- ... und umgekehrt!
- Wenn [Kueche.Hygrostat] "off" ist und einer der beiden anderen "off" geht der Lüfter aus.
Der zweite Teil funktioniert nur mit Statusübergängen und dem Vergleich auf den Status, weil bei einem Event das jeweils andere Event nicht gleichzeitig auftritt.
Was ich noch nicht verstehe:
Der erste Teil funktioniert auch nur mit Vergleich des Status. Wenn ich die Event-Syntax verwende, dann geht der Lüfter zwar an, aber er bleibt nicht die definierte Zeit lang an sondern geht relativ bald wieder aus.
Warum?
Zitat von: The Grue am 23 März 2018, 12:40:32
Was ich noch nicht verstehe:
Der erste Teil funktioniert auch nur mit Vergleich des Status. Wenn ich die Event-Syntax verwende, dann geht der Lüfter zwar an, aber er bleibt nicht die definierte Zeit lang an sondern geht relativ bald wieder aus.
Warum?
Bei:
([Kueche.LuefterByTime:"^on$"]) (set...) DOELSE (set...)
wird der Ausdruck ausgewertet, wenn irgend ein Event vom Device
Kueche.LuefterByTime kommt. Bei "on" wird der erste Teil ausgeführt, bei jedem anderen Event von
Kueche.LuefterByTime wird der DOELSE-Fall ausgeführt.
bei:
(["^Kueche.LuefterByTime$:^on$"]) (set...) DOELSE (set...)
wird dagegen der Ausdruck nur ausgewertet, wenn das Event "Kueche.LuefterByTime: on", hier kann also DOELSE eigentlich nie vorkommen, denn z. B. bei "Kueche.LuefterByTime: off" wird der Ausdruck erst gar nicht ausgewertet.