kann DOIF Zustand nicht nachvollziehen

Begonnen von kupfermuetze, 22 September 2014, 18:34:07

Vorheriges Thema - Nächstes Thema

kupfermuetze

Hallo zusammen,

hab ein Problem mit einer DOIF Definition:
Ich möchte die Fussbodenheizung zu bestimmten Zeiten ein bzw ausschalten wenn ein Dummy auf "automatic" steht;

Komischerweise bekommt er auch den trigger (timer_3 in diesem Fall) nimmt aber (aus meiner Sicht) den Falschen Befehl:
(([07:30-08:30] or [18:00-19:30]) and [fbh.auto] eq "Automatik") (set bad.fbh on;) DOELSEIF ([fbh.auto] eq "on") (set bad.fbh on;) DOELSE (set bad.fbh off;)
Readings:
cmd_event
timer_3
2014-09-22 18:00:00
cmd_nr
3
2014-09-22 18:00:00
state
cmd_3
2014-09-22 18:00:00
timer_1_c1
23.09.2014 07:30:00
2014-09-22 07:30:00
timer_2_c1
23.09.2014 08:30:00
2014-09-22 08:30:00
timer_3_c1
23.09.2014 18:00:00
2014-09-22 18:00:00
timer_4_c1
22.09.2014 19:30:00
2014-09-21 20:28:24


Kann mir jemand erklären auf welchem Schlauch ich stehe? :-)
Danke schonmal

kupfermuetze

achso, morgen einschalten ging :-) Auch der Wechsel fbh.auto = on bzw bfh.auto = off tut

Damian

Zitat von: kupfermuetze am 22 September 2014, 18:35:43
achso, morgen einschalten ging :-) Auch der Wechsel fbh.auto = on bzw bfh.auto = off tut

Zitat aus der Doku von DOIF:

"Die Angaben werden immer von links nach rechts abgearbeitet. Es wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist. Hinzu kommt, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event auch ein Device beinhalten (Angaben in eckigen Klammern)."

Wenn um 18:00 der Timer_3 zuschlägt, dann wird die zweite Bedingung nicht überprüft, weil kein Ereignis dazu stattgefunden hat und dein DOELSE-Fall wird ausgeführt.

Tipp:

Statt DOELSE, DOELSEIF mit Bedingung für set bad.fbh off definieren. Übrigens, du brauchst kein Semikolon jeweils am Ende anzugeben.

Gruß

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

Damian

#3
So sollte es, wie du es erwartest, funktionieren:

(([07:30-08:30] or [18:00-19:30]) and [fbh.auto] eq "Automatik") or [fbh.auto] eq "on") (set bad.fbh on) DOELSE (set bad.fbh off)


Hier ist der Tipp aus der Doku:

"Mehrere Bedingungen, die zur Ausführung gleicher Kommandos führen, sollten zusammengefasst werden. Dadurch wird ein unnötiges Schalten aufgrund verschiedener Zustände verhindert."

Gruß

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

kupfermuetze

ok, dein Teil mit
ZitatHinzu kommt, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event auch ein Device beinhalten (Angaben in eckigen Klammern)."

Wenn um 18:00 der Timer_3 zuschlägt, dann wird die zweite Bedingung nicht überprüft, weil kein Ereignis dazu stattgefunden hat und dein DOELSE-Fall wird ausgeführt.
hab ich nicht verstanden (bedeutet das, dass ich immer ein Device dabei haben muss - also nie allein Uhrzeiten als Bedingung verwendet werden können?)

Ich hab das jetzt aber mal wie in deinem letzten Post geändert und werds morgen mal beobachten.

danke schonmal :-)

Damian

Zitat von: kupfermuetze am 22 September 2014, 20:28:24
(bedeutet das, dass ich immer ein Device dabei haben muss - also nie allein Uhrzeiten als Bedingung verwendet werden können?)

Nein, das heißt das nicht. Die Aussage bezieht sich nur auf devices und nicht auf Zeiten. Es gibt ja genügend Beispiele in der Doku, wo nur Uhrzeiten vorkommen.

Beispiel:

DOIF ([DEVICE1] eq "on")(set ...)DOELSEIF([DEVICE2] eq "on")(set..)DOELSE(set ...)

Wenn Device1 "off" sendet, dann wird DOELSE ausgeführt, auch wenn und Device2 "on" ist. Der zweite Fall wird nur ausgeführt, wenn Device2 "on" sendet.

Gruß

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

kupfermuetze


kupfermuetze

Ähm habs wohl doch nicht verstanden.
Drum deshalb mal das einfachste denkbare Beispiel:

([20:40-20:41] or [20:42-20:43]) (set bad.fbh on) DOELSE (set bad.fbh off)
aber wieder - für mich - unlogische Zustände:

state
cmd_1
2014-09-23 20:41:00
timer_1_c1
23.09.2014 20:40:00
2014-09-23 20:39:26
timer_2_c1
23.09.2014 20:41:00
2014-09-23 20:39:26
timer_3_c1
23.09.2014 20:42:00
2014-09-23 20:39:26
timer_4_c1
23.09.2014 20:43:00
2014-09-23 20:39:26


Ist doch so wie in der Doku  :-\

Damian

Zitat von: kupfermuetze am 23 September 2014, 20:41:59
Ähm habs wohl doch nicht verstanden.
Drum deshalb mal das einfachste denkbare Beispiel:

([20:40-20:41] or [20:42-20:43]) (set bad.fbh on) DOELSE (set bad.fbh off)
aber wieder - für mich - unlogische Zustände:

state
cmd_1
2014-09-23 20:41:00
timer_1_c1
23.09.2014 20:40:00
2014-09-23 20:39:26
timer_2_c1
23.09.2014 20:41:00
2014-09-23 20:39:26
timer_3_c1
23.09.2014 20:42:00
2014-09-23 20:39:26
timer_4_c1
23.09.2014 20:43:00
2014-09-23 20:39:26


Ist doch so wie in der Doku  :-\

mach mal list von deinem DOIF-Modul
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

kupfermuetze

CFGFN
   DEF        ([20:40-20:41] or [20:42-20:43]) (set bad.fbh on) DOELSE (set bad.fbh off)
   NAME       di_dummy
   NR         6513
   NTFY_ORDER 50-di_dummy
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2014-09-23 20:43:00   cmd_event       timer_4
     2014-09-23 20:43:00   cmd_nr          1
     2014-09-23 20:43:00   state           cmd_1
     2014-09-23 20:40:00   timer_1_c1      24.09.2014 20:40:00
     2014-09-23 20:41:00   timer_2_c1      24.09.2014 20:41:00
     2014-09-23 20:42:00   timer_3_c1      24.09.2014 20:42:00
     2014-09-23 20:43:00   timer_4_c1      24.09.2014 20:43:00
   Condition:
     0          DOIF_time($hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"") or DOIF_time($hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"")
   Days:
   Devices:
   Do:
     0          set bad.fbh on
     1          set bad.fbh off
   Helper:
     last_timer 4
     sleeptimer -1
   Internals:
   Readings:
   Realtime:
     0          20:40:00
     1          20:41:00
     2          20:42:00
     3          20:43:00
   State:
   Time:
     0          20:40:00
     1          20:41:00
     2          20:42:00
     3          20:43:00
   Timecond:
     0          0
     1          0
     2          0
     3          0
   Timer:
     0          0
     1          0
     2          0
     3          0
   Timerfunc:
   Timers:
     0           0  1  2  3
Attributes:

Damian

Merkwürdig, ich habe es bei mir nachgestellt und es funktioniert bei mir wie erwartet.
Hat er denn zwischendurch cmd_2 ausgeführt?

Gruß

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

kupfermuetze


Damian

Zitat von: kupfermuetze am 23 September 2014, 21:57:55
ja, hat um 20:40 auf cmd_2 gestellt

Da scheint bei dir ein Zeitversatz zu sein. Ich muss überlegen wie man das testen kann.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

kupfermuetze

sehr seltsam das alles :-/

was meinst du denn mit Vesatz?
timer_1_c1 24.09.2014 20:40:00 2014-09-23 20:40:00
timer_2_c1 24.09.2014 20:41:00 2014-09-23 20:41:00


daraus würde ICH interpretieren, dass am 23. um 20:41 das Reading Timer_2_c1 auf 24. 20:41 gestellt wurde (entsprechend für timer_1).

Damian

was liefert bei dir auf der console:

define di_test DOIF ([22:40])({print "$hms\n"})


Zeit kannst du natürlich anpassen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF