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
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.
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!',"")}
....
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?
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.
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...
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
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.
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.
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!
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.
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. ;)
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.