DOIF führt cmd4 aus, obwohl cmd2 erfüllt ist

Begonnen von odie13690, 26 Mai 2017, 18:30:59

Vorheriges Thema - Nächstes Thema

odie13690

Hallo zusammen,

kann mir jemand erklären, warum cmd4 ausgeführt wird, obwohl cmd2 erfüllt ist?

define doif_LuftpumpeEinAus DOIF ([Futterautomat_Leistung] > 2) (set Luftpumpe aus) DOELSEIF ([TemperaturKlarwasserkammer:realTemp] >= 20) (set Luftpumpe an) DOELSEIF ([TemperaturKlarwasserkammer:realTemp] > 18 and [TemperaturKlarwasserkammer:realTemp] < 20 and [08:00-20:00]) (set Luftpumpe an) DOELSE (set Luftpumpe aus)
attr doif_LuftpumpeEinAus alias Belüftung
attr doif_LuftpumpeEinAus devStateIcon automatisch:on-for-timer disabled:off-for-timer cmd_1:on-for-timer cmd_2:on-for-timer cmd_3:on-for-timer cmd_4:on-for-timer
attr doif_LuftpumpeEinAus eventMap initialize:automatisch disable:aus
attr doif_LuftpumpeEinAus group Aktoren
attr doif_LuftpumpeEinAus room Teich
attr doif_LuftpumpeEinAus sortby 8
attr doif_LuftpumpeEinAus do always
attr doif_LuftpumpeEinAus wait 0:300:300
attr doif_LuftpumpeEinAus webCmd automatisch:aus


Vielen Dank!

KernSani

Poste bitte mal ein "list" des DOIF, während es in dem beschriebenen fehlerhaftem Zustand ist.
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

odie13690

Internals:
   DEF        ([Futterautomat_Leistung] > 2) (set Luftpumpe aus) DOELSEIF ([TemperaturKlarwasserkammer:realTemp] >= 20) (set Luftpumpe an) DOELSEIF ([TemperaturKlarwasserkammer:realTemp] > 18 and [TemperaturKlarwasserkammer:realTemp] < 20 and [08:00-20:00]) (set Luftpumpe an) DOELSE (set Luftpumpe aus)
   NAME       doif_LuftpumpeEinAus
   NR         181
   NTFY_ORDER 50-doif_LuftpumpeEinAus
   STATE      cmd_4
   TYPE       DOIF
   Readings:
     2017-05-26 18:38:56   Device          TemperaturKlarwasserkammer
     2017-05-26 18:35:28   cmd             4
     2017-05-26 18:35:28   cmd_event       Futterautomat_Leistung
     2017-05-26 18:35:28   cmd_nr          4
     2017-05-26 18:38:11   e_Futterautomat_Leistung_STATE 1
     2017-05-26 18:38:56   e_TemperaturKlarwasserkammer_realTemp 21.5
     2017-05-26 18:35:28   state           cmd_4
     2017-05-26 17:23:58   timer_01_c03    27.05.2017 08:00:00
     2017-05-26 17:23:58   timer_02_c03    26.05.2017 20:00:00
     2017-05-26 18:38:56   wait_timer      26.05.2017 18:43:56 cmd_2 TemperaturKlarwasserkammer
   Condition:
     0          InternalDoIf($hash,'Futterautomat_Leistung','STATE') > 2
     1          ReadingValDoIf($hash,'TemperaturKlarwasserkammer','realTemp') >= 20
     2          ReadingValDoIf($hash,'TemperaturKlarwasserkammer','realTemp') > 18 and ReadingValDoIf($hash,'TemperaturKlarwasserkammer','realTemp') < 20 and DOIF_time($hash,0,1,$wday,$hms)
   Days:
   Devices:
     0           Futterautomat_Leistung
     1           TemperaturKlarwasserkammer
     2           TemperaturKlarwasserkammer
     all         Futterautomat_Leistung TemperaturKlarwasserkammer
   Do:
     0:
       0          set Luftpumpe aus
     1:
       0          set Luftpumpe an
     2:
       0          set Luftpumpe an
     3:
       0          set Luftpumpe aus
   Helper:
     event      temperature: 22.0,realTemp: 21.5
     globalinit 1
     last_timer 2
     sleepdevice TemperaturKlarwasserkammer
     sleepsubtimer 0
     sleeptimer 1
     timerdev   TemperaturKlarwasserkammer
     timerevent temperature: 22.0,realTemp: 21.5
     triggerDev TemperaturKlarwasserkammer
     timerevents:
       temperature: 22.0
       realTemp: 21.5
     timereventsState:
       temperature: 22.0
       realTemp: 21.5
     triggerEvents:
       temperature: 22.0
       realTemp: 21.5
     triggerEventsState:
       temperature: 22.0
       realTemp: 21.5
   Internals:
     0           Futterautomat_Leistung:STATE
     all         Futterautomat_Leistung:STATE
   Interval:
     0          -1
     1          0
   Itimer:
   Localtime:
     0          1495864800
     1          1495821600
   Readings:
     1           TemperaturKlarwasserkammer:realTemp
     2           TemperaturKlarwasserkammer:realTemp
     all         TemperaturKlarwasserkammer:realTemp
   Realtime:
     0          08:00:00
     1          20:00:00
   Regexp:
     0:
     1:
     2:
     All:
   State:
   Time:
     0          08:00:00
     1          20:00:00
   Timecond:
     0          2
     1          2
   Timer:
     0          0
     1          0
   Timers:
     2           0  1
   Trigger:
   Triggertime:
     1495821600:
       localtime  1495821600
       Hash:
     1495864800:
       localtime  1495864800
       Hash:
Attributes:
   alias      Belüftung
   devStateIcon automatisch:on-for-timer disabled:off-for-timer cmd_1:on-for-timer cmd_2:on-for-timer cmd_3:on-for-timer cmd_4:on-for-timer
   eventMap   initialize:automatisch disable:aus
   group      Aktoren
   room       Teich
   sortby     8
   wait       0:300:300
   webCmd     automatisch:aus

Damian

     2017-05-26 18:38:56   wait_timer      26.05.2017 18:43:56 cmd_2 TemperaturKlarwasserkamme

Inzwischen sollte dein verzögerter cmd_2 ausgeführt worden sein ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

odie13690

Hallo Damian,

ja, sieht erstmal so aus. cmd2 wird aber nicht ausgeführt. Hier noch ein List, wo kein Wait-Timer läuft:

Internals:
   DEF        ([Futterautomat_Leistung] > 2) (set Luftpumpe aus) DOELSEIF ([TemperaturKlarwasserkammer:realTemp] >= 20) (set Luftpumpe an) DOELSEIF ([TemperaturKlarwasserkammer:realTemp] > 18 and [TemperaturKlarwasserkammer:realTemp] < 20 and [08:00-20:00]) (set Luftpumpe an) DOELSE (set Luftpumpe aus)
   NAME       doif_LuftpumpeEinAus
   NR         181
   NTFY_ORDER 50-doif_LuftpumpeEinAus
   STATE      cmd_4
   TYPE       DOIF
   Readings:
     2017-05-26 18:54:46   Device          Futterautomat_Leistung
     2017-05-26 18:47:44   cmd             4
     2017-05-26 18:47:44   cmd_event       Futterautomat_Leistung
     2017-05-26 18:47:44   cmd_nr          4
     2017-05-26 18:54:46   e_Futterautomat_Leistung_STATE 1
     2017-05-26 18:51:30   e_TemperaturKlarwasserkammer_realTemp 21.5
     2017-05-26 18:47:44   state           cmd_4
     2017-05-26 17:23:58   timer_01_c03    27.05.2017 08:00:00
     2017-05-26 17:23:58   timer_02_c03    26.05.2017 20:00:00
     2017-05-26 18:54:46   wait_timer      no timer
   Condition:
     0          InternalDoIf($hash,'Futterautomat_Leistung','STATE') > 2
     1          ReadingValDoIf($hash,'TemperaturKlarwasserkammer','realTemp') >= 20
     2          ReadingValDoIf($hash,'TemperaturKlarwasserkammer','realTemp') > 18 and ReadingValDoIf($hash,'TemperaturKlarwasserkammer','realTemp') < 20 and DOIF_time($hash,0,1,$wday,$hms)
   Days:
   Devices:
     0           Futterautomat_Leistung
     1           TemperaturKlarwasserkammer
     2           TemperaturKlarwasserkammer
     all         Futterautomat_Leistung TemperaturKlarwasserkammer
   Do:
     0:
       0          set Luftpumpe aus
     1:
       0          set Luftpumpe an
     2:
       0          set Luftpumpe an
     3:
       0          set Luftpumpe aus
   Helper:
     event      1
     globalinit 1
     last_timer 2
     sleepdevice TemperaturKlarwasserkammer
     sleepsubtimer 0
     sleeptimer -1
     timerdev   Futterautomat_Leistung
     timerevent 1
     triggerDev Futterautomat_Leistung
     timerevents:
       1
     timereventsState:
       state: 1
     triggerEvents:
       1
     triggerEventsState:
       state: 1
   Internals:
     0           Futterautomat_Leistung:STATE
     all         Futterautomat_Leistung:STATE
   Interval:
     0          -1
     1          0
   Itimer:
   Localtime:
     0          1495864800
     1          1495821600
   Readings:
     1           TemperaturKlarwasserkammer:realTemp
     2           TemperaturKlarwasserkammer:realTemp
     all         TemperaturKlarwasserkammer:realTemp
   Realtime:
     0          08:00:00
     1          20:00:00
   Regexp:
     0:
     1:
     2:
     All:
   State:
   Time:
     0          08:00:00
     1          20:00:00
   Timecond:
     0          2
     1          2
   Timer:
     0          0
     1          0
   Timers:
     2           0  1
   Trigger:
   Triggertime:
     1495821600:
       localtime  1495821600
       Hash:
     1495864800:
       localtime  1495864800
       Hash:
Attributes:
   alias      Belüftung
   devStateIcon automatisch:on-for-timer disabled:off-for-timer cmd_1:on-for-timer cmd_2:on-for-timer cmd_3:on-for-timer cmd_4:on-for-timer
   eventMap   initialize:automatisch disable:aus
   group      Aktoren
   room       Teich
   sortby     8
   wait       0:300:300
   webCmd     automatisch:aus

Damian

Es liegt am Futterautomat, der dein Modul triggert und den Waittimer abbricht, da aber state 1 nicht größer 2 ist bleibt es beim cmd_4.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

odie13690

Das ist ja ok. Müsste dann nicht erst cmd2

([TemperaturKlarwasserkammer:realTemp] >= 20) (set Luftpumpe an)

geprüft und ausgeführt werden?

Damian

Zitat von: odie13690 am 26 Mai 2017, 19:18:25
Das ist ja ok. Müsste dann nicht erst cmd2

([TemperaturKlarwasserkammer:realTemp] >= 20) (set Luftpumpe an)

geprüft und ausgeführt werden?

Um 18:51:30  kam e_TemperaturKlarwasserkammer_realTemp 21.5

durch wait       0:300:300

sollte um 18:56:30 cmd_2 ausgeführ werden, es kam aber nicht dazu, weil

um 18:54:46 e_Futterautomat_Leistung_STATE 1 kam und führte zum Zurücksetzen des Timers
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

odie13690

OK, also Wait-Timer verlängern, oder? Wie bekomme ich es hin, dass 5 min nach ausführen von cmd1, cmd2 oder cmd3 ausgeführ wird?

Damian

Zitat von: odie13690 am 26 Mai 2017, 19:34:29
OK, also Wait-Timer verlängern, oder? Wie bekomme ich es hin, dass 5 min nach ausführen von cmd1, cmd2 oder cmd3 ausgeführ wird?

Ich muss noch prüfen, ob es ein bug oder feature ist, denn eigentlich sollte der Timer nur zurückgesetzt werden, wenn ein neuer Zweig ausgeführt wird, der Trigger 18:54:46 e_Futterautomat_Leistung_STATE 1 führt aber gar nicht zu einer Ausführung eines anderen Zweiges.

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

Damian

Zitat von: Damian am 26 Mai 2017, 19:39:27
Ich muss noch prüfen, ob es ein bug oder feature ist, denn eigentlich sollte der Timer nur zurückgesetzt werden, wenn ein neuer Zweig ausgeführt wird, der Trigger 18:54:46 e_Futterautomat_Leistung_STATE 1 führt aber gar nicht zu einer Ausführung eines anderen Zweiges.

Es funktioniert doch alles, wie beabsichtigt, denn durch e_Futterautomat_Leistung_STATE 1kommt ja wieder dein DOELSE zum Tragen und damit wird dein Timer korrekterweise zurückgesetzt, weil cmd_4 dran kommt. Um das zu verhindert musst du statt DOELSE dir ein DOELSEIF überlegen, der bei e_Futterautomat_Leistung_STATE 1 nicht zuschlägt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

odie13690

Das ist mir grad zu hoch. Ich war davon ausgegangen, dass die cmd's der Reihe nach abgearbeitet werden. Warum kommt nach cmd1 cmd4?

Ich hätte erwartet, dass nach Auslösen von cmd1, nach welcher Zeit auch immer, wieder von vorn begonnen wird. In diesem Fall wäre cmd1 nicht mehr erfüllt und cmd2 wird geprüft (und ggf. ausgelöst). Warum werden cmd2 und cmd3 übersprungen?

Damian

Deswegen:

Zitat aus der Commanref zu DOIF:

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

odie13690

Auslösendes Event ist das jenige, das sich zuletzt geändert hat? Das könnte bei meinem DoIf der Futterautomat oder die Temperatur sein, richtig? Da kann ich noch keinen Zusammenhang zur Luftpumpe (dazugehöriges Device) erkennen.

Wenn also die Leistung des Futterautomats über 2 W steigt und damit ein Event auslöst, ist das dazugehörige Device der Futterautomat. Weil cmd2 und cmd3 zu einem anderen Device gehören, werden sie übersprungen?

Woher weiß ich die (dazugehörige) Triggerzeit?

Damian

ich weiß nicht, was deine Definition beabsichtigt. Du hast drei Zustände, von denen immer einer geschaltet wird, abhängig davon, welcher Trigger kommt.  Es ist immer besser nur einen Zustand zum Einschalten und nur einen zum Ausschalten zu definieren. DOELSE bei mehreren DO-IF-Zweigen ist immer mit Vorsicht zu genießen.

Es gibt das Attribut checkall, dabei werden, egal welcher Trigger kommt, immer alle Zweige der Reihe nach geprüft - vielleicht ist es das, was du willst.


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