DOIF perl modus mit zeittrigger erzeugt mehrere events

Begonnen von Stelaku, 01 Januar 2022, 11:58:13

Vorheriges Thema - Nächstes Thema

Stelaku

Hallo alle zusammen und ein Frohes neues Jahr 2022

Bei meinen DOIF im perl modus habe ich ein für mich komisches Verhalten beobachtet.
Ziel ist es mit diesem DOIF, Zähler eines HourCounter Device bei bedarf zu löschen.
Dieses soll einmal am Tag gegen 0 Uhr geschehen, oder bei klick auf ein Icon.
Das HourCounter Device liefert mir genau um 0:00 ein event welches ich im DOIF ohne Probleme
als trigger nehmen konnte.
if ([$SELF:"^TagesZaehler:.on$"] or [BetriebsStunden:"^tickDay:.*$"]){
set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);
set_Exec("taster1","2",'set_Reading("TagesZaehler","off",1)');
fhem("setreading BetriebsStunden pulseTimePerDay 0")
}


Schönheitsproblem bei dieser Lösung war das ich in einem Logfile dann die Betriebsstunden für z.b. den 01.01.2022  mit dem datum 02.01.2022 angezeigt bekomme.
Jetzt dachte ich mir o.k. dann nehme ich halt einen Zeitrigger statt dem Event aus dem HourCounter Device.
if ([$SELF:"^TagesZaehler:.on$"] or [23:59]){
set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);
set_Exec("taster1","2",'set_Reading("TagesZaehler","off",1)');
fhem("setreading BetriebsStunden pulseTimePerDay 0")
}

Das brachte mich zu dem für mich komischen Verhalten.
Jetzt wurde das Reading Tages_Stunden dreimal  mit dem Wert aus dem HourCounter Device beschrieben was dann zu diesem logFile Eintrag führt.

2022-01-01_09:53:00 Betriebsstunden_loeschen Tages_Stunden: 0.02
2022-01-01_09:53:00 Betriebsstunden_loeschen Tages_Stunden: 0.02
2022-01-01_09:53:00 Betriebsstunden_loeschen Tages_Stunden: 0.00

Dazu auch mal einen Auszug aus den Event Monitor

2022-01-01 09:53:00 DOIF Betriebsstunden_loeschen Tages_Stunden: 0.02
2022-01-01 09:53:00 DOIF Betriebsstunden_loeschen e_Betriebsstunden_loeschen_events: Tages_Stunden: 0.02
2022-01-01 09:53:00 DOIF Betriebsstunden_loeschen Tages_Stunden: 0.02
2022-01-01 09:53:00 DOIF Betriebsstunden_loeschen timer_taster1: 01.01.2022 09:53:02
2022-01-01 09:53:00 DOIF Betriebsstunden_loeschen e_BetriebsStunden_Betriebsstunden_TAG: 0.00
2022-01-01 09:53:00 DOIF Betriebsstunden_loeschen Device: BetriebsStunden
2022-01-01 09:53:00 DOIF Betriebsstunden_loeschen Tages_Stunden: 0.00
2022-01-01 09:53:00 DOIF Betriebsstunden_loeschen timer_taster1: 01.01.2022 09:53:02
2022-01-01 09:53:00 DOIF Betriebsstunden_loeschen block_01: executed
2022-01-01 09:53:00 DOIF Betriebsstunden_loeschen block_01: executed
2022-01-01 09:53:02 DOIF Betriebsstunden_loeschen TagesZaehler: off
2022-01-01 09:53:02 DOIF Betriebsstunden_loeschen e_Betriebsstunden_loeschen_events: TagesZaehler: off
2022-01-01 09:53:02 DOIF Betriebsstunden_loeschen block_01: executed

Es hat den anschein als würde der erste Block dreimal durchlaufen ?

Ich habe mir jetzt erstmal so geholfen das ich einen dritten Block angelegt habe in dem ich ein Reading durch einen Zeittrigger auf on setzte und dieses
Reading dann im Ersten Block zum triggern nehme.

{
if ([$SELF:"^TagesZaehler:.on$"] or [$SELF:"^triggerTag:.on$"]){
set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);
set_Exec("taster1","2",'set_Reading("TagesZaehler","off",1)');
fhem("setreading BetriebsStunden pulseTimePerDay 0")
}


if ([$SELF:"^GesamtZaehler:.on$"]){
set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);
set_Exec("taster2","2",'set_Reading("GesamtZaehler","off",1)');
fhem_set("BetriebsStunden clear")
}

if ([23:59]){
set_Reading("triggerTag","on",1);
}
}


Das komplette DOIF einaml aus der raw Kopiert
defmod Betriebsstunden_loeschen DOIF { \
if ([$SELF:"^TagesZaehler:.on$"] or [$SELF:"^triggerTag:.on$"]){\
set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);; \
set_Exec("taster1","2",'set_Reading("TagesZaehler","off",1)');; \
fhem("setreading BetriebsStunden pulseTimePerDay 0")\
}\
\
\
if ([$SELF:"^GesamtZaehler:.on$"]){ \
set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);;\
set_Exec("taster2","2",'set_Reading("GesamtZaehler","off",1)');; \
fhem_set("BetriebsStunden clear")\
}\
\
if ([23:59]){\
set_Reading("triggerTag","on",1);;\
}\
}
attr Betriebsstunden_loeschen devStateIcon 1.off:general_ok:TagesZaehler+on\
1.on:general_ok@red:TagesZaehler+off\
\
2.off:general_ok:GesamtZaehler+on\
2.on:general_ok@red:GesamtZaehler+off
attr Betriebsstunden_loeschen devStateStyle style="text-align:left;;;;font-weight:bold;;;;"
attr Betriebsstunden_loeschen readingList GesamtZaehler TagesZaehler
attr Betriebsstunden_loeschen room Werkstatt
attr Betriebsstunden_loeschen setList TagesZaehler:on,off\
GesamtZaehler:on,off\

attr Betriebsstunden_loeschen sortby 02
attr Betriebsstunden_loeschen stateFormat Tages Zähler ; ; ; ; ; ;\
1:TagesZaehler\
<br>\
Gesamt Zähler&nbsp;;&nbsp;;&nbsp;;\
2:GesamtZaehler

setstate Betriebsstunden_loeschen Tages Zähler&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;&nbsp;;\
1:off\
<br>\
Gesamt Zähler&nbsp;;&nbsp;;&nbsp;;\
2:off
setstate Betriebsstunden_loeschen 2022-01-01 11:55:00 Device BetriebsStunden
setstate Betriebsstunden_loeschen 2021-12-31 21:47:05 GesamtZaehler off
setstate Betriebsstunden_loeschen 2022-01-01 11:47:02 TagesZaehler off
setstate Betriebsstunden_loeschen 2022-01-01 11:47:00 Tages_Stunden 0.28
setstate Betriebsstunden_loeschen 2022-01-01 11:55:00 block_01 executed
setstate Betriebsstunden_loeschen 2022-01-01 11:55:00 e_BetriebsStunden_Betriebsstunden_TAG 0.15
setstate Betriebsstunden_loeschen 2022-01-01 11:47:35 mode enabled
setstate Betriebsstunden_loeschen 2022-01-01 11:47:35 state initialized
setstate Betriebsstunden_loeschen 2022-01-01 11:47:35 timer_01_c01 01.01.2022 23:59:00
setstate Betriebsstunden_loeschen 2022-01-01 11:47:00 triggerTag on



Leider verstehe ich dieses Verhalten überhaupt nicht und würde mich freuen wenn mir das jemand kurz erklären könnte.

Viele Grüsse

Stephan




Damian

Du hast nur einen DOIF-Perl-Block definiert, d. h. alle deine Zweige mit if werden durchlaufen wenn irgendein Trigger den Block triggert. Willst deine Zweige separat also unabhängig von einander triggern, dann musst du sie in einzelne DOIF-Perl-Blöcke klammern.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stelaku

Hallo Damian
Vielen dank für Deine Antwort. Ich habe meine def jetzt mal wie folgt geändert.

{
if ([$SELF:"^TagesZaehler:.on$"] or [12:37]){
set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);
set_Exec("taster1","2",'set_Reading("TagesZaehler","off",1)');
fhem("setreading BetriebsStunden pulseTimePerDay 0")}
}

{
if ([$SELF:"^GesamtZaehler:.on$"]){
set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);
set_Exec("taster2","2",'set_Reading("GesamtZaehler","off",1)');
fhem_set("BetriebsStunden clear")}
}

Es werden mir jetzt auch zwei blöcke angezeigt. Nur leider bleibt das Problem das wenn ich den ersten Block über den Zeittrigger auslösen lasse werden drei Einträge für das
Reading Tages_Stunden im logfile erzeugt.
Trigger ich den ersten Block über das Reading [$SELF:"^TagesZaehler:.on$"] wird nur so wie es soll ein Eintrag für Tages_Stunden im logFile angezeigt.
event_on_change_reading hilft da leider auch nicht weil mir ja einmal der Wert für die Stunden im logfile angezeigt wird und dann die null nach dem löschen.

Viele Grüsse

Stephan



Damian

Dann probiere mal mit:

if (["^$SELF$:^TagesZaehler:.on$"] or [12:37]){....
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stelaku

#4
Zitatif (["^$SELF$:^TagesZaehler:.on$"] or [12:37]){....
Damit ist es schon mal ein Eintrag weniger im Logfile geworden
logfile vorher
Zitat2022-01-01_12:59:00 Betriebsstunden_loeschen Tages_Stunden: 0.02
2022-01-01_12:59:00 Betriebsstunden_loeschen Tages_Stunden: 0.02
2022-01-01_12:59:00 Betriebsstunden_loeschen Tages_Stunden: 0.00

Logfile jetzt

Zitat2022-01-01_13:13:00 Betriebsstunden_loeschen Tages_Stunden: 0.03
2022-01-01_13:13:00 Betriebsstunden_loeschen Tages_Stunden: 0.00

jetzt muss nur noch die 0.00 weg

Interresant ist wenn ich die reihenfolge in der Ausführung ändere bekomme ich fast was ich will.

{
if (["^$SELF:^TagesZaehler:.on$"] or [13:33]){
fhem("setreading BetriebsStunden pulseTimePerDay 0")};
set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);
set_Exec("taster1","2",'set_Reading("TagesZaehler","off",1)');

}

{
if ([$SELF:"^GesamtZaehler:.on$"]){
set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);
set_Exec("taster2","2",'set_Reading("GesamtZaehler","off",1)');
fhem_set("BetriebsStunden clear")}
}

wenn fhem("setreading BetriebsStunden pulseTimePerDay 0")};
ganz oben als erstes durchläuft wird nur einmal der Logeintrag beim Zeittriger eingetragen.
Trigger ich aber mit den Device Icon sprich ["^$SELF$:^TagesZaehler:.on$"]
werden komischerweise zwei logfile Zeilen erzeugt ???

Stelaku

ZitatInterresant ist wenn ich die reihenfolge in der Ausführung ändere bekomme ich fast was ich will.
Code: [Auswählen]

{   
   if (["^$SELF:^TagesZaehler:.on$"] or [13:33]){
   fhem("setreading BetriebsStunden pulseTimePerDay 0")};
   set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);   
   set_Exec("taster1","2",'set_Reading("TagesZaehler","off",1)');      
   
}
      
{   
   if ([$SELF:"^GesamtZaehler:.on$"]){   
   set_Reading("Tages_Stunden",[BetriebsStunden:Betriebsstunden_TAG],1);
   set_Exec("taster2","2",'set_Reading("GesamtZaehler","off",1)');         
   fhem_set("BetriebsStunden clear")}
}

wenn fhem("setreading BetriebsStunden pulseTimePerDay 0")};
ganz oben als erstes durchläuft wird nur einmal der Logeintrag beim Zeittriger eingetragen.
Trigger ich aber mit den Device Icon sprich ["^$SELF$:^TagesZaehler:.on$"]
werden komischerweise zwei logfile Zeilen erzeugt

das bitte nicht beachten da habe ich mich bei testen und ausprobieren in einen Fehler verrannt

Damian

Das ist Problem hängt mit der Selbsttriggerung zusammen. Am besten eigene Readings ohne Event per set_Reading setzen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Stelaku

Vielen dank für die hilfe werde ich so machen.

Viele Grüsse

Stephan