FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: limats am 04 Juni 2016, 16:16:44

Titel: Frage zu DOELSEIF
Beitrag von: limats am 04 Juni 2016, 16:16:44
Hallo zusammen,

ich hab folgendes DOIF für meine Markisensteuerung:


define di_Markisenanforderung DOIF ([Rain] eq "rain")
    (set Markisenanforderung hoch)
DOELSEIF
([Wintergarten:temperature] < 22 or
[wunderground:solarRadiation] < 250)
    (set Markisenanforderung hoch)
DOELSE
    (set Markisenanforderung runter)


Heute hat es seit 11:00 Uhr geregnet. Um 11:30 ist die Temperatur über 22 Grad gestiegen. Da ist die Markise runter - trotz Regen.
Ich verstehe nicht ganz, wieso. Durch den Regen trifft doch eigentlich der DOIF-Zweig zu. Ich dachte, dann würde er die weiteren Zweige gar nicht mehr auswerten.

Gruß
Leo
Titel: Antw:Frage zu DOELSEIF
Beitrag von: CoolTux am 04 Juni 2016, 16:28:00
Ein list des DOIFs könnte zeigen wieso er runter gefahren ist.
Titel: Antw:Frage zu DOELSEIF
Beitrag von: igami am 04 Juni 2016, 16:47:55
Warum fasst du die ersten beiden Zweige nicht noch zusammen?
Titel: Antw:Frage zu DOELSEIF
Beitrag von: Icinger am 04 Juni 2016, 17:08:26
Um 11 Uhr hat das reading "rain" ausgelöst....

Um 11:30 war die Temp höher, also hat logischerweise der DOELSE ausgelöst. In diesem prüfst du ja nicht wirklich, ob es immer noch regnet.

Eigentlich ganz logisch.

lg, Stefan
Titel: Antw:Frage zu DOELSEIF
Beitrag von: CoolTux am 04 Juni 2016, 17:13:49
Aber es hat doch noch geregnet. Geprüft wird von rechts nach links. Und wenn Regen noch gilt dann bleibt doch der state auf cmd1. Oder übersehe ich da was?
Das DOELSE gilt doch erst wenn die anderen beiden nicht gelten.
Titel: Antw:Frage zu DOELSEIF
Beitrag von: Icinger am 04 Juni 2016, 17:20:41
Es wird nur dann geprüft, ob [1] stimmt, wenn dieses Reading grade eben triggert.

Wenn [2] triggert, wird [1] nicht geprüft.
Titel: Antw:Frage zu DOELSEIF
Beitrag von: CoolTux am 04 Juni 2016, 17:26:08
Ah ok. Hatte ich wohl falsch verstanden. Danke Dir
Titel: Antw:Frage zu DOELSEIF
Beitrag von: automatisierer am 04 Juni 2016, 17:49:17
Ich würde sagen, dass ganze DOIF ist ein wenig unglücklich formuliert...

define di_Markisenanforderung DOIF
([Rain] ne "rain" and ([Wintergarten:temperature] > 22 or [wunderground:solarRadiation] > 250)) (set Markisenanforderung runter)
DOELSE
(set Markisenanforderung hoch)

Titel: Antw:Frage zu DOELSEIF
Beitrag von: limats am 04 Juni 2016, 18:50:45
Hallo zusammen,

ist ja Wahnsinn, wie schnell hier Antworten kommen.
@automatisierer: Was ich euch vorenthalten hab, ist das Attribut wait, das auf 0:1200:1200 steht. Es soll also bei Regen sofort hochgefahren werden. Runterfahren bei Trockenheit und Reaktionen auf Temperatur und Sonne nur mit 20 min Verzögerung. Deshalb meine Aufteilung.
Titel: Antw:Frage zu DOELSEIF
Beitrag von: automatisierer am 04 Juni 2016, 20:13:08
wäre es nicht sinvoller das wait auf -300:1200:1200 zu setzen?

dann fährt die Markise schon 5 Minuten bevor es regnet ein...
Titel: Antw:Frage zu DOELSEIF
Beitrag von: automatisierer am 04 Juni 2016, 20:46:05
keiner lacht?  ???


dann machs halt so:

define di_Markisenanforderung DOIF
([Rain] eq "rain") (set Markisenanforderung hoch)
DOELSEIF
([Rain] ne "rain" and ([Wintergarten:temperature] > 22 or [wunderground:solarRadiation] > 250)) (set Markisenanforderung runter)
DOELSE
(set Markisenanforderung hoch)


das ist dann auch wieder mit deinem wait kompatibel und fährt auch nicht runter wenns regnet...


Titel: Antw:Frage zu DOELSEIF
Beitrag von: limats am 04 Juni 2016, 23:57:24
Danke. So geht's.

Wenn hier schon die Kompetenz vor Ort ist. Ein weiteres Problem mit einem anderen DOIF :


define di_Markise DOIF ([Markisenanforderung] eq "hoch")
    (set Markise pct 100)
DOELSEIF
([Markisenanforderung] eq "runter" and
[twilight:azimuth] > 110 and
[twilight:azimuth] < 190)
    (set Markise pct 50)
DOELSEIF
([Markisenanforderung] eq "runter" and
[twilight:azimuth] >= 190 and
[twilight:elevation] > 8 and
[wintergarten_schiebetuere] eq "open")
    (set Markise pct 37)
DOELSEIF
([Markisenanforderung] eq "runter" and
[twilight:azimuth] >= 190 and
[twilight:elevation] > 8 and
[wintergarten_schiebetuere] eq "closed")
    (set Markise pct 0)
DOELSE
    (set Markise pct 100)


Bis zu einem Azimuth von 110 soll die Markise nie runterfahren. Bei Azimuth zwischen 110 und 190 soll die Markise auf 50%. Bei Azimuth größer 190 soll sie ganz runter. Aber nur, wenn die Schiebetür zu ist. Bei offener Tür soll sie bei 37% stehen bleiben, damit man noch reinkommt.
Hier hab ich das Problem, dass bei Azimuth zwischen 110 und 190 das Öffnen oder Schließen der Tür die Markise hochfahren lässt.
Ich hab jetzt verstanden, dass das daran liegt, dass der erste DOELSEIF Pfad ignoriert wird, weil er durch die Tür nicht getriggert wird. Wie kriege ich hier jetzt am elegantesten ein "Tür eq egal" rein?
Wenn jemand eine elegante Möglichkeit sieht, die Problemstellung einfacher (zB. mit nur einem DOIF) zu lösen, nur her damit. Mir ist keine einfachere Lösung eingefallen, die auf das Wetter zeitverzögert, auf das Öffnen der Tür aber sofort reagiert.

Gruß
Leo

PS: das mit der negativen Wartezeit wär ne feine Sache. :-)
Titel: Antw:Frage zu DOELSEIF
Beitrag von: CoolTux am 05 Juni 2016, 07:09:11

[?wintergarten_schiebetuere] eq "open")
Titel: Antw:Frage zu DOELSEIF
Beitrag von: Per am 05 Juni 2016, 08:24:13
Zitat von: limats am 04 Juni 2016, 23:57:24
Wenn jemand eine elegante Möglichkeit sieht, die Problemstellung einfacher (zB. mit nur einem DOIF) zu lösen, nur her damit.
Ob es "einfacher" oder "eleganter" wird, wenn du alles in ein DOIF "quetschst", sei mal dahingestellt.
Aber die Hilfsvariable Markisenanforderung (inkl. der dazugehörigen set) kannst du ersatzlos streichen, wenn du stattdessen in di_Markise auf den Status von di_Markisenanforderung prüfst.
Titel: Antw:Frage zu DOELSEIF
Beitrag von: limats am 09 Juni 2016, 09:41:03
Hallo zusammen,

ich bräuchte nochmal eine Bestätigung, dass es tatsächlich so gewollt ist, dass ein DOIF-Trigger nur die Zweige *nach* dem getriggerten Zweig abarbeitet.
Falls das so ist, gäbe es vielleicht die Möglichkeit, das (optional) zu ändern?
Ansonsten leidet die Übersicht ja schon etwas, wenn ich die unrelevanten Readings zu jedem Zweig hinzufügen muss, damit er nicht ignoriert wird.
Vielleicht kann sich der Modulautor dazu äußern.

Falls es tatsächlich so ist: Kann ich die Triggerung auch durch eckige Klammern ohne Vergleich erreichen?

...
DOELSEIF
([wintergarten_schiebetuere] and
[Markisenanforderung] eq "runter" and
[twilight:azimuth] > 110 and
[twilight:azimuth] < 190)
    (set Markise pct 50)
DOELSEIF
...


Oder muss ich das mit der Regex-Variante machen?

...
DOELSEIF
([wintergarten_schiebetuere:""] and
[Markisenanforderung] eq "runter" and
[twilight:azimuth] > 110 and
[twilight:azimuth] < 190)
    (set Markise pct 50)
DOELSEIF
...


Gruß
Leo
Titel: Antw:Frage zu DOELSEIF
Beitrag von: automatisierer am 09 Juni 2016, 22:02:13
bau es doch so ein wie im ersten Beispiel - renn zur Tür - mach sie auf - renn zurück - und guck obs getriggert hat...  :-\

... wenn du zu faul zum rennen bist, kannst du dir ja auch die Commandref zu DOIF durchlesen - die ist zwar eckelhaft lang, dafür steht aber auch alles drin... ;D ;D

... wenn du das ganze DOIF in den Post packst, könnte man dein Problem evtl. eher durchschauen.
Titel: Antw:Frage zu DOELSEIF
Beitrag von: limats am 09 Juni 2016, 22:56:50
Das ganze DOIF steht ja 3 Posts weiter oben.
Klar kann ich versuchen durch probieren herauszufinden, wie es sich verhält aber ich wollte ja eine Expertenmeinung dazu haben.
Der Vorschlag von CoolTux bringt mir übrigens nichts - das Fragezeichen bewirkt ja, dass *nicht* getriggert wird. Ich brauche ja quasi das Gegenteil.

Ich glaub aber, ich hab meinen Denkfehler entdeckt. Wenn ich das DOELSE gegen ein DOELSEIF tausche, müsste es funktionieren. Testen kann ich es aber erst morgen :

([Markisenanforderung] eq "hoch")
    (set Markise pct 100)
DOELSEIF
([Markisenanforderung] eq "runter" and
[twilight:azimuth] > 110 and
[twilight:azimuth] < 190)
    (set Markise pct 50)
DOELSEIF
([Markisenanforderung] eq "runter" and
[twilight:azimuth] >= 190 and
[twilight:elevation] > 8 and
[wintergarten_schiebetuere] eq "open")
    (set Markise pct 37)
DOELSEIF
([Markisenanforderung] eq "runter" and
[twilight:azimuth] >= 190 and
[twilight:elevation] > 8 and
[wintergarten_schiebetuere] eq "closed")
    (set Markise pct 0)
DOELSEIF
([twilight:elevation] <= 8)
    (set Markise pct 100)
Titel: Antw:Frage zu DOELSEIF
Beitrag von: Damian am 10 Juni 2016, 08:19:00
Zitat von: limats am 09 Juni 2016, 22:56:50
Das ganze DOIF steht ja 3 Posts weiter oben.
Klar kann ich versuchen durch probieren herauszufinden, wie es sich verhält aber ich wollte ja eine Expertenmeinung dazu haben.
Der Vorschlag von CoolTux bringt mir übrigens nichts - das Fragezeichen bewirkt ja, dass *nicht* getriggert wird. Ich brauche ja quasi das Gegenteil.

Ich glaub aber, ich hab meinen Denkfehler entdeckt. Wenn ich das DOELSE gegen ein DOELSEIF tausche, müsste es funktionieren. Testen kann ich es aber erst morgen :


Der entscheidende Absatz in der Commandref ist:

ZitatDie Angaben werden immer von links nach rechts abgearbeitet. Zu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten. Kommt ein Device in mehreren Bedingungen vor, so wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.

Bei dir ist das dann statt
Zitatvon links nach rechts
Zitatvon oben nach unten

Gruß

Damian
Titel: Antw:Frage zu DOELSEIF
Beitrag von: StefanD am 11 Juni 2016, 13:32:22
Zitat von: limats am 04 Juni 2016, 23:57:24
Wie kriege ich hier jetzt am elegantesten ein "Tür eq egal" rein?

Wenn ich dich richtig verstehe, brauchst du nur den Trigger vom Device [wintergarten_schiebetuere], unabhängig welchen Wert state davon dann hat, korrekt?

Wenn ja, setzt du [wintergarten_schiebetuere] ohne Prüfung auf einen Wert ein, dann triggert es immer bei einer Änderung des state.
Wenn nein, habe ich die Frage nicht verstanden...  ::)

VG Stefan