Bitte um review: meine erste etwas komplexere Steuerung

Begonnen von The Grue, 22 März 2018, 15:24:53

Vorheriges Thema - Nächstes Thema

The Grue

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

The Grue

#1
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?

CoolTux


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.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

The Grue

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...

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Aldeyn

Ich bin selbst noch absoluter Anfänger, aber vielleicht helfen die DOIF_Readings weiter?
https://fhem.de/commandref_DE.html#DOIF_Readings

The Grue

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

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

The Grue

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

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

The Grue

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?

Damian

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.


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF