DOIF wurde Christi Himmelfahrt doppelt ausgeführt

Begonnen von FunkOdyssey, 26 Mai 2017, 11:40:40

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Hallo,

ich glaube, ich scheitere gerade an einem Anfängerproblem.
An Christi Himmelfahrt (Donnerstag UND Feiertag) wurde versucht, die Jalousien doppelt hochzufahren.

Ich habe ein Dummy 'du_jal_zeit', welches für jeden Werktag und für WE/Feiertage eine unterschiedliche Uhrzeit aufnimmt. Nun wurde zu der Zeit des Readings '4do' (4) um 08:00 Uhr und des Readings '7saso' (7) um 08:30 Uhr die Bedingung wahr.
   
   
(
[([du_jal_zeit:1mo]+int(rand(300)))|1] or
[([du_jal_zeit:2di]+int(rand(300)))|2] or
[([du_jal_zeit:3mi]+int(rand(300)))|3] or
[([du_jal_zeit:4do]+int(rand(300)))|4] or
[([du_jal_zeit:5fr]+int(rand(300)))|5] or
[([du_jal_zeit:7saso]+int(rand(300)))|7]
)
(...)


Ich könnte nun:
a)
Eine zusätzliche Abfrage einbauen und prüfen, ob cmd1 bereits ausgeführt wurde.
Aber dann würde ja bereits um 08:00 Uhr ausgelöst. Schön, dass es nur einmal ist. Aber ich will $we ja um 08:30 Uhr.

b)
Den or-Vergleich für '7saso' als ersten Vergleich hochschieben. Also die Reihenfolge ändern. Doch das ändert ja nichts daran, dass dennoch die erste Uhrzeit genommen wird. Also um 08:00 Uhr.

Habe ich ein Brett vorm Kopf?  :D




Am Rande: Es ist zwar kein "do always" gesetzt. Aber zwischen 08:00 Uhr und 08:30 Uhr wurde noch ein anderer CMD-Teil (andere Jalousien) wahr. Dies ändert aber nichts am ursprünglichen Problem.

sash.sc

Ich habe es bei mir in Abhängigkeit von der lichtstärke sowie der Zeit und Tag, ob we oder in der Woche, und über die holiday Funktion realisiert. Funktioniert sowie ganz gut. Inkl. Schalter für Automatik an bzw aus.

Gruß Sascha

Gesendet von dem teuren ding in meiner hand

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

FunkOdyssey

Was willst du mir damit nun sagen?  :D

Ich habe zig Parameter in meiner Jalousienautomatik. Ich habe hier nur einen Auszug präsentiert, um den Support zu vereinfachen.
Mir ist halt wichtig, dass die Jalousien beim Hochfahren eine Uhrzeit berücksichtigen. Hier will ich keine Lichtintensität oder Sonnenstand berücksichtigen.
(Ehrlich gesagt werden beim Hochfahren wohl Parameter zum Thema Beschattung/Sonnenschutz abgefragt. Die liegen aber im Ausführungsteil und prüfen nur andere DOIF-Readings ab.)

rabehd

Es geht bei mir zwar um eine Lampe, aber ich berücksichtige Feiertage, Party.

([{sunset_abs("REAL",300)}]) (set FS_2 on) 
DOELSEIF ([23:22|01234] and (ReadingsVal("BaWue","tomorrow","") eq "none") and (Value("Party") eq "keine")) (set FS_2 off)
DOELSEIF ([00:24|67] and (Value("Party") eq "keine"))(set FS_2 off)
DOELSEIF ([00:24] and (ReadingsVal("BaWue","tomorrow","") ne "none") and (Value("Party") eq "keine")) (set FS_2 off)
DOELSEIF ([04:04] and (Value("Party") eq "läuft")) (set FS_2 off)


Ich habe mal einige on-Zeilen rausgelöscht.
Auch funktionierende Lösungen kann man hinterfragen.

FunkOdyssey

Danke für deine Unterstützung. Aber du dürftest exakt das gleiche Problem haben.

CommandRef:
[<time>|012345678] 0-8 entspricht: 0-Sonntag, 1-Montag, ... bis 6-Samstag sowie 7 für Wochenende und Feiertage (entspricht $we) und 8 für Arbeitstage (entspricht !$we)

Christi Himmelfahrt ist ein Donnerstag (4) und ein Feiertag (7), aber kein Werktag ( 8 ).
Das bedeutet, dass dein cmd2 und cmd3 beides zutrifft. Einmal um 23:22 Uhr und einmal um 00:24 Uhr. Einzig der Tageswechsel könnte dein Problem kaschiert haben.




Würde ich nur zwischen Werktags ( 8 ) und Wochenende/Feiertage (7) unterscheiden, dann hätte ich das Problem nicht. Doch ich frage ja gezielt nach Donnerstagen (4). Und somit wird der Vergleich bei Donnerstagen (4) und bei Feiertagen (7) wahr.




Am Rande: Dein DOIF ist unnötig kompliziert. DU benötigst hier kein ReadingsVal() oder Value(). Das erledigt doch DOIF alles für dich.

Zitat von: rabehd am 26 Mai 2017, 12:26:10
([{sunset_abs("REAL",300)}]) (set FS_2 on) 
DOELSEIF ([23:22|01234] and (ReadingsVal("BaWue","tomorrow","") eq "none") and (Value("Party") eq "keine")) (set FS_2 off)
DOELSEIF ([00:24|67] and (Value("Party") eq "keine"))(set FS_2 off)
DOELSEIF ([00:24] and (ReadingsVal("BaWue","tomorrow","") ne "none") and (Value("Party") eq "keine")) (set FS_2 off)
DOELSEIF ([04:04] and (Value("Party") eq "läuft")) (set FS_2 off)



Beispiel:
[BaWue:tomorrow] eq "none"

Wobei ich das nicht triggernd machen würde:
[?BaWue:tomorrow] eq "none"
... denn sonst wird zum Zeitpunkt der Holiday-Berechnung das Event ausgelöst und vom DOIF ausgeführt.

Damian

Du könntest die anderen DOELESIF-Fälle in ein anderes DOIF verfrachten und im ursprünglichen DOIF  DOELESEIF ([[resettime]]) anfügen.

Abgesehen davon kann auch der Zufall bei einem einzigen Timer zwei mal am Tag zuschlagen (erste Zufallsberechnung +1 zweite +300)  mit dem obigen Vorschlag wäre es dann auch egal;)

Unabhängig davon würde den Zufall in wait packen und mit timerWithWait arbeiten:


[[du_jal_zeit:1mo]|1] or
[[du_jal_zeit:2di]|2] or
...

wait rand(300)





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

FunkOdyssey

Zitat von: Damian am 26 Mai 2017, 12:52:00
Du könntest die anderen DOELESIF-Fälle in ein anderes DOIF verfrachten und im ursprünglichen DOIF  DOELESEIF ([[resettime]]) anfügen.

Sorry, Damian. Das habe ich nicht verstanden.
Ich kann ja die anderen DOELSEIFs folgendermaßen ausschließen:

[[du_jal_zeit:1mo]|1] or
[[du_jal_zeit:2di]|2] or
... and
[?$SELF:cmd] !~ "1.3|2" and
...


Aber dennoch würde an Christi Himmelfahrt die (frühere) Uhrzeit eines Donnerstag genommen werden.

Oder was meinst du mit [[resettime]]?

rabehd

@FunkOdyssey

Ich habe mal in die Log-Files geschaut.
Die Lampe wurde gestern um 21:12 eingeschaltet und um 23:22 ausgeschaltet.  Um 00:24 wurde nichts geschaltet.
Aber ich habe einen anderen "Fehler" gefunden, der betrifft aber das morgentliche Einschalten, welches ich hier gelöscht hatte.

Den Tip mit der Vereinfachung nehme ich gern an. Das DOIF stammt noch aus meiner Anfangszeit. Es kommt jetzt also auf die Liste der zu überarbeitenden Dinge.

Zitat7 für Wochenende und Feiertage (entspricht $we)
Ich denke, deshalb klappt es.

Und hier noch mein Holiday
# bewegliche Feiertage
#2 -48 Rosenmontag
2 -02 Karfreitag
2  01 Ostermontag
2  39 Christi Himmelfahrt
2  50 Pfingsten
2  60 Fronleichnam
Auch funktionierende Lösungen kann man hinterfragen.

Damian

Zitat von: FunkOdyssey am 26 Mai 2017, 12:57:56
Sorry, Damian. Das habe ich nicht verstanden.
Ich kann ja die anderen DOELSEIFs folgendermaßen ausschließen:

[[du_jal_zeit:1mo]|1] or
[[du_jal_zeit:2di]|2] or
... and
[?$SELF:cmd] !~ "1.3|2" and
...


Aber dennoch würde an Christi Himmelfahrt die (frühere) Uhrzeit eines Donnerstag genommen werden.

Oder was meinst du mit [[resettime]]?

Du hast die anderen Zweige nicht gepostet, deswegen kann ich nicht wissen, was sonst passiert. Mit der cmd-Abfrage würdest du auch am nächsten Tag die Ausführung verhindern, wenn noch cmd_2 aktuell wäre.

Auch die Zeiten kenne ich nicht daher resettime.

hier ein Bsp. mit konkreten Zeiten


([10:00|1] or [11:00|2] or [12:00|3]... [11:00|7]) (set bla...) DOELSEIF ([00:01])

wait rand(300)



so kann keine Wiederholung am gleichen Tag stattfinden,  auch wenn jeden Tag Feiertag wäre ;)





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

Damian

und so kann man verhindern, dass ein ein Arbeitstag als Feiertag schaltet:

(([10:00|1] or [11:00|2] or [12:00|3]... [13:00|6]) and !$we) or [11:00|7]) (set bla...) DOELSEIF ([00:01])
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Zitat von: Damian am 26 Mai 2017, 13:28:03
und so kann man verhindern, dass ein ein Arbeitstag als Feiertag schaltet:

(([10:00|1] or [11:00|2] or [12:00|3]... [13:00|6]) and !$we) or [11:00|7]) (set bla...) DOELSEIF ([00:01])

That's it. Das wird die Lösung sein. Danke dir.




Zitat von: Damian am 26 Mai 2017, 13:17:22
hier ein Bsp. mit konkreten Zeiten


([10:00|1] or [11:00|2] or [12:00|3]... [11:00|7]) (set bla...) DOELSEIF ([00:01])

wait rand(300)



so kann keine Wiederholung am gleichen Tag stattfinden,  auch wenn jeden Tag Feiertag wäre ;)

Nee, Damian. Da bin ich anderer Meinung.
Was ist, wenn in deinem Beispiel der Montag ein Feiertag ist? Dann wird um 10:00 Uhr ausgeführt und nicht um 11:00 Uhr.
Ich ignoriere jetzt einfach mal, dass mit "do always" oder ohne andere DOELSE(IF)-Vergleichen sogar doppelt ausgeführt wird.
Fakt ist doch, dass dein Beispiel sich mit meinem Problem deckt. Werktage als Feiertage werden als Werktage verarbeitet, wenn die Timer früher liegen.

rabehd

Auch funktionierende Lösungen kann man hinterfragen.