FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: SirBen am 12 Mai 2020, 10:27:21

Titel: [gelöst]DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: SirBen am 12 Mai 2020, 10:27:21
Moin,
ich habe folgendes DOIF bei dem immer nur der erste Block ausgeführt wird. Die ersten 4 Blöcke werden gleichzeitig getriggert:

{if ([myAbfall:Biotonne_days] > 1)
  {set_Reading("Bio","#ffffff",1)}
elsif ([myAbfall:Biotonne_days] == 0 and [$SELF:Bio] ne "#32A054")
  {set_Reading("Bio","#AD3333",1);::DebianMailnbl("email.com","Warnung",'Die Biotonne muss an die Straße gestellt werden!',"")}
}
{if ([myAbfall:Hausmll14-tglich_days] > 1)
  {set_Reading("Haus","#ffffff",1)}
elsif ([myAbfall:Hausmll14-tglich_days] == 0 and [$SELF:Haus] ne "#32A054")
  {set_Reading("Haus","#AD3333",1);::DebianMailnbl("email.com","Warnung",'Die Hausmülltonne muss an die Straße gestellt werden!',"")}
}
{if ([myAbfall:Altpapier_days] > 1)
  {set_Reading("Altpapier","#ffffff",1)}
elsif ([myAbfall:Altpapier_days] == 0 and [$SELF:Altpapier] ne "#32A054")
  {set_Reading("Altpapier","#AD3333",1);::DebianMailnbl("Email.com","Warnung",'Die Altpapiertonne muss an die Straße gestellt werden!',"")}
}
{if ([myAbfall:GelberSack_days] > 1)
  {set_Reading("Gelb","#ffffff",1)}
elsif ([myAbfall:GelberSack_days] == 0 and [$SELF:Gelb] ne "#32A054")
  {set_Reading("Gelb","#AD3333",1);::DebianMailnbl("email.com","Warnung",'Die gelben Säcke müssen an die Straße gestellt werden!',"")}
}
{if ([$SELF:ToggleColor] == 1)
{
  {if (get_Reading("Bio") ne "#32A054")
    {set_Reading("Bio","#32A054",1)}
   else
    {set_Reading("Bio","#ffffff",1)}
  };
  set_Reading("ToggleColor","0")
}
elsif ([$SELF:ToggleColor] == 2)
{
  {if (get_Reading("Haus") ne "#32A054")
    {set_Reading("Haus","#32A054",1)}
   else
    {set_Reading("Haus","#ffffff",1)}
  };
  set_Reading("ToggleColor","0")
}
elsif ([$SELF:ToggleColor] == 3)
{
  {if (get_Reading("Altpapier") ne "#32A054")
    {set_Reading("Altpapier","#32A054",1)}
   else
    {set_Reading("Altpapier","#ffffff",1)}
  };
  set_Reading("ToggleColor","0")
}
elsif ([$SELF:ToggleColor] == 4)
{
  {if (get_Reading("Gelb") ne "#32A054")
    {set_Reading("Gelb","#32A054",1)}
   else
    {set_Reading("Gelb","#ffffff",1)}
  };
  set_Reading("ToggleColor","0")
}
}


Die ToggleColor Funktion funktioniert wie gewünscht.

Um 00:02 Uhr wird täglich myAbfall aktualisiert und die Events für alle 4 Abfälle kommen gleichzeitig.
Es wird aber nur der erste Block (Biotonne) ausgeführt.

READINGS:
     2020-05-12 09:35:19   Altpapier       #32A054
     2020-05-12 00:02:02   Bio             #ffffff
     2020-05-12 00:02:02   Device          myAbfall
     2020-04-17 00:00:00   Gelb            #ffffff
     2020-05-05 17:48:32   Haus            #ffffff
     2020-05-12 09:35:19   ToggleColor     0
     2020-05-12 00:02:02   block_01        executed
     2020-05-04 00:00:00   block_02        executed
     2020-05-12 09:35:19   block_05        executed
     2020-05-12 00:02:02   e_DOIF_Abfall_Bio #ffffff
     2020-05-04 00:00:00   e_DOIF_Abfall_Haus #ffffff
     2020-05-12 09:35:19   e_DOIF_Abfall_ToggleColor 3
     2020-05-12 00:02:02   e_myAbfall_Altpapier_days 0
     2020-05-12 00:02:02   e_myAbfall_Biotonne_days 6
     2020-05-12 00:02:02   e_myAbfall_GelberSack_days 1
     2020-05-12 00:02:02   e_myAbfall_Hausmll14-tglich_days 7
     2020-04-24 20:34:50   mode            enabled
     2020-04-22 00:02:01   state           cmd_13


Kann mir jemand behilflich sein?
Vielen Dank und Gruß
Ben
Titel: Antw:DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: xenos1984 am 12 Mai 2020, 11:55:34
Das ist ja auch der Sinn der Sache bei DOIF. Sobald eine Bedingung erfüllt ist, wird der zugehörige Zweig ausgeführt und danach die Ausführung beendet. D.h. es wird immer (nur) der erste Zweig ausgeführt, für den die Bedingung erfüllt ist.
Titel: Antw:DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: Damian am 12 Mai 2020, 12:03:22
Zitat von: xenos1984 am 12 Mai 2020, 11:55:34
Das ist ja auch der Sinn der Sache bei DOIF. Sobald eine Bedingung erfüllt ist, wird der zugehörige Zweig ausgeführt und danach die Ausführung beendet. D.h. es wird immer (nur) der erste Zweig ausgeführt, für den die Bedingung erfüllt ist.

Das trifft aber nur für den FHEM-Modus zu, nicht für den Perl-Modus.

Das Problem wird hier tatsächlich der gemeinsame Event-Block sein. In diesem Fall würde ich die Abfragen in einen Block packen.



{
if ([myAbfall:Biotonne_days] > 1)
  {set_Reading("Bio","#ffffff",1)}
elsif ([myAbfall:Biotonne_days] == 0 and [$SELF:Bio] ne "#32A054")
  {set_Reading("Bio","#AD3333",1);::DebianMailnbl("email.com","Warnung",'Die Biotonne muss an die Straße gestellt werden!',"")}

if ([myAbfall:Hausmll14-tglich_days] > 1)
  {set_Reading("Haus","#ffffff",1)}
elsif ([myAbfall:Hausmll14-tglich_days] == 0 and [$SELF:Haus] ne "#32A054")
  {set_Reading("Haus","#AD3333",1);::DebianMailnbl("email.com","Warnung",'Die Hausmülltonne muss an die Straße gestellt werden!',"")}

....


Titel: Antw:DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: SirBen am 12 Mai 2020, 12:36:14
Danke für die Antwort. Ich habe das mal so abgeändert. Mal gucken ob es funktioniert.

In der Commandref hatte ich das hier gefunden:
Es können beliebig viele Ereignisblöcke definiert werden, die unabhängig von einander durch einen oder mehrere Trigger ausgewertet und zur Ausführung führen können:

DOIF
{ if (<Bedingung mit Triggern>) ... }
{ if (<Bedingung mit Triggern>) ... }
...


Daher dachte ich, es müsste so funktionierten.

Was auch noch nicht so recht funkioniert ist, der selbsttrigger.
Bei ToggleColor wird das Reading mittels
set_Reading("Haus","#ffffff",1)
geändert.
Müsste dann nicht auch das hier:
elsif ([myAbfall:Hausmll14-tglich_days] == 0 and [$SELF:Haus] ne "#32A054")
  {set_Reading("Haus","#AD3333",1);::DebianMailnbl("email.com","Warnung",'Die Hausmülltonne muss an die Straße gestellt werden!',"")}

ausgeführt werden?
Titel: Antw:DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: Damian am 12 Mai 2020, 12:57:17
Zitat von: SirBen am 12 Mai 2020, 12:36:14
Danke für die Antwort. Ich habe das mal so abgeändert. Mal gucken ob es funktioniert.

In der Commandref hatte ich das hier gefunden:
Es können beliebig viele Ereignisblöcke definiert werden, die unabhängig von einander durch einen oder mehrere Trigger ausgewertet und zur Ausführung führen können:

DOIF
{ if (<Bedingung mit Triggern>) ... }
{ if (<Bedingung mit Triggern>) ... }
...


Daher dachte ich, es müsste so funktionierten.

Was auch noch nicht so recht funkioniert ist, der selbsttrigger.
Bei ToggleColor wird das Reading mittels
set_Reading("Haus","#ffffff",1)
geändert.
Müsste dann nicht auch das hier:
elsif ([myAbfall:Hausmll14-tglich_days] == 0 and [$SELF:Haus] ne "#32A054")
  {set_Reading("Haus","#AD3333",1);::DebianMailnbl("benni.k88\@icloud.com","Warnung",'Die Hausmülltonne muss an die Straße gestellt werden!',"")}

ausgeführt werden?

Das Problem mit mehreren Events innerhalb eines Event-Blocks muss ich mir im Programm nochmal anschauen - es sollte im Perl-Modus funktionieren.
FHEM selbst unterbindet Events des selben Moduls, das liegt außerhalb der Macht eines Moduls.
Titel: Antw:DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: xenos1984 am 12 Mai 2020, 14:26:51
Zitat von: Damian am 12 Mai 2020, 12:03:22Das trifft aber nur für den FHEM-Modus zu, nicht für den Perl-Modus.
Ah, das war mir neu. Ich hatte das Wiki hier so verstanden, dass dies allgemein gilt, unabhängig von DOIF / Perl Modus:
http://wiki.fhem.de/wiki/DOIF/Einsteigerleitfaden,_Grundfunktionen_und_Erl%C3%A4uterungen
Aber in der CommandRef ist es natürlich korrekt erklärt für den Perl-Modus...
Titel: Antw:DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: Damian am 12 Mai 2020, 18:33:29
Ich habe es gerade bei mir getestet und es funktioniert, wie es soll:

Zwei Events aus einem Event-Block:

2020-05-12 18:30:45.331 CUL_HM Kz_o_Fenster open
2020-05-12 18:30:45.331 CUL_HM Kz_o_Fenster trigger_cnt: 254


und die beiden Ausführungen aus zwei verschiedenen Blöcken:

Internals:
   CFGFN     
   DEF        { [Kz_o_Fenster:state] }
{ [Kz_o_Fenster:trigger_cnt] }
   FUUID      5ebacd09-f33f-30f6-5f86-763d9828062b9990
   MODEL      Perl
   NAME       di_event_test
   NOTIFYDEV  Kz_o_Fenster,global
   NR         486574
   NTFY_ORDER 50-di_event_test
   STATE      initialized
   TYPE       DOIF
   READINGS:
     2020-05-12 18:30:45   Device          Kz_o_Fenster
     2020-05-12 18:30:45   block_01        executed
     2020-05-12 18:30:45   block_02        executed
     2020-05-12 18:30:45   e_Kz_o_Fenster_state open
     2020-05-12 18:30:45   e_Kz_o_Fenster_trigger_cnt 254
     2020-05-12 18:29:00   mode            enabled
     2020-05-12 18:21:29   state           initialized
Titel: Antw:DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: SirBen am 13 Mai 2020, 07:17:05
Zitat von: Damian am 12 Mai 2020, 12:03:22
Das trifft aber nur für den FHEM-Modus zu, nicht für den Perl-Modus.

Das Problem wird hier tatsächlich der gemeinsame Event-Block sein. In diesem Fall würde ich die Abfragen in einen Block packen.



{
if ([myAbfall:Biotonne_days] > 1)
  {set_Reading("Bio","#ffffff",1)}
elsif ([myAbfall:Biotonne_days] == 0 and [$SELF:Bio] ne "#32A054")
  {set_Reading("Bio","#AD3333",1);::DebianMailnbl("email.com","Warnung",'Die Biotonne muss an die Straße gestellt werden!',"")}

if ([myAbfall:Hausmll14-tglich_days] > 1)
  {set_Reading("Haus","#ffffff",1)}
elsif ([myAbfall:Hausmll14-tglich_days] == 0 and [$SELF:Haus] ne "#32A054")
  {set_Reading("Haus","#AD3333",1);::DebianMailnbl("email.com","Warnung",'Die Hausmülltonne muss an die Straße gestellt werden!',"")}

....




So hatte ich das gestern geändert und in der Nacht kamen 5 emails von den gelben Säcken (ich weiß das klingt komisch... ;D ).
Das bedeutet also, dass der Block 5 mal ausgeführt wurde. Ich kann mir nur nicht erklären warum.
Das DOIF hatte alle 4 Events von myAbfall und 4 Events von den eigenen readings dabei (Bio, Haus, Altpapier, Gelb).

Meine Vermutung ist jetzt, immer wenn eine Bedingung in dem Block wahr wird, wird der gesamte Block ausgeführt, auch wenn das DOIF das eigene reading ändert. Sonst kann ich mir die 5. Ausführung nicht erklären.

Wenn ich das DOIF nun wieder zurück ändere, sodass alle 4 myAbfall Abfragen wieder einzeln ausgewertet werden, wird wieder nur die Biotonne ausgeführt, der Rest nicht.
Titel: Antw:DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: Damian am 13 Mai 2020, 07:22:12
Zitat von: SirBen am 13 Mai 2020, 07:17:05
So hatte ich das gestern geändert und in der Nacht kamen 5 emails von den gelben Säcken (ich weiß das klingt komisch... ;D ).
Das bedeutet also, dass der Block 5 mal ausgeführt wurde. Ich kann mir nur nicht erklären warum.
Das DOIF hatte alle 4 Events von myAbfall und 4 Events von den eigenen readings dabei (Bio, Haus, Altpapier, Gelb).

Meine Vermutung ist jetzt, immer wenn eine Bedingung in dem Block wahr wird, wird der gesamte Block ausgeführt, auch wenn das DOIF das eigene reading ändert. Sonst kann ich mir die 5. Ausführung nicht erklären.

Wenn ich das DOIF nun wieder zurück ändere, sodass alle 4 myAbfall Abfragen wieder einzeln ausgewertet werden, wird wieder nur die Biotonne ausgeführt, der Rest nicht.

Das ist klar, sobald ein Trigger, der sich irgendwo im Block befindet, kommt, wird der ganze Block ausgeführt.

Dann musst du das Problem einkreisen. Events protokollieren, evtl. zum Testen Blöcke mit nur dem Ereignistrigger definieren, so wie ich es bei mir getestet habe und immer list DOIF liefern.

Titel: Antw:DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: SirBen am 13 Mai 2020, 11:00:56
Hab's rausgefunden. Vor $SELF muss ein Fragezeichen bei allen 4 Bedingungen im elsif. DOIF scheint sich selbst zu triggern bei set_Reading.
Wird der erste Block ausgeführt, triggert das DOIF sich selbst mittels set_Reading und führt den ersten Block gleich wieder aus und die restlichen Events interessieren nicht mehr.
Allerdings wird eine Dauerschleife verhindert. Die Selbsttriggerung passiert nur ein mal.
Somit ist für mich das Thema erstmal gelöst.
Danke für die Hilfe!
Titel: Antw:DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: Damian am 13 Mai 2020, 11:20:44
Zitat von: SirBen am 13 Mai 2020, 11:00:56
Hab's rausgefunden. Vor $SELF muss ein Fragezeichen bei allen 4 Bedingungen im elsif. DOIF scheint sich selbst zu triggern bei set_Reading.
Wird der erste Block ausgeführt, triggert das DOIF sich selbst mittels set_Reading und führt den ersten Block gleich wieder aus und die restlichen Events interessieren nicht mehr.
Allerdings wird eine Dauerschleife verhindert. Die Selbsttriggerung passiert nur ein mal.
Somit ist für mich das Thema erstmal gelöst.
Danke für die Hilfe!

ja, Selbsttriggerung funktioniert im Perlmodus nur einmal, dann schlägt FHEM zu - wie bereits geschrieben

set_Reading("Haus","#ffffff") entspricht  set_Reading("Haus","#ffffff",0)

produziert z. B. keine Events, siehe Doku zu set_Reading.
Titel: Antw:[gelöst]DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: SirBen am 13 Mai 2020, 11:53:52
Ich wollte aber gerne einen trigger bzw. Event haben bei Farbänderung.
Nur wollte ich nicht, dass das DOIF sich selbst unterbricht und den Rest einfach nicht ausführt.  ;)
Titel: Antw:[gelöst]DOIF Perl Modus mit mehreren Ereignisblöcken funktioniert nicht richtig
Beitrag von: Damian am 13 Mai 2020, 11:54:41
Zitat von: SirBen am 13 Mai 2020, 11:53:52
Ich wollte aber gerne einen trigger bzw. Event haben bei Farbänderung.
Nur wollte ich nicht, dass das DOIF sich selbst unterbricht und den Rest einfach nicht ausführt.  ;)
Dann ist das Fragezeichen die richtige Lösung.