DOIF: Dummy setzten je nach "Gerade" oder "Ungerade" Woche

Begonnen von M.Piet, 24 April 2018, 07:45:05

Vorheriges Thema - Nächstes Thema

M.Piet

Hallo Zusammen. Ich möchte ein Dummy haben, welches je nach Woche einen anderen Status hat.
Gerade Woche: "State:Gerade-Woche"
Ungerade Woche: "State:Ungerade-Woche"

Ich dachte mir, dass ich ein DOIF baue, welches Montag um 00:01 den State vom Dummy auf "Gerade Woche" setzt, sofern es eine Gerade Woche ist.
Sonntag Abend um 23:59 wird in der Geraden Woche der State auf "Ungerade Woche" gesetzt.

Ich wollte es so lösen:
define DOIF_Kinder_KW DOIF ([00:01|1] and strftime("%W",localtime)%2 == 1) (set Kinder_KW Gerade-Woche) DOELSEIF ([23:59|0] and strftime("%W",localtime)%2 == 1) (set Kinder_KW Ungerade-Woche)

Mit Testen wird es schwer werden, ich müsste es 2 Wochen laufen lassen, bis ich weiß das es geht.
Ist mein Code richtig? Kann es überhaupt funktionieren?

Ich danke euch. :)

Wen es Interessiert: Meine Kids haben im wöchentlichen Wechsel eine kleine tägliche Aufgabe zu erledigen. Ständig zoffen sie sich, wer in dieser Woche dran ist. Und ich vergesse es auch. Darum will ich einen Dummy haben, in dem zu sehen ist, ob es eine gerade oder ungerade Woche ist. Das lasse ich dann auf TabletUI anzeigen und ich habe weniger streß. :)

rabehd

#1
Warum nicht ein at, welches jeden Montag läuft?
Das würde die Woche "berechnen" und den Dummy setzen.

Mit zweimal
Zitatand strftime("%W",localtime)%2 == 1
wird das wohl nicht klappen. Das bleibt scheinbar immer auf gerade.
Auch funktionierende Lösungen kann man hinterfragen.

Damian

Zitat von: M.Piet am 24 April 2018, 07:45:05
Hallo Zusammen. Ich möchte ein Dummy haben, welches je nach Woche einen anderen Status hat.
Gerade Woche: "State:Gerade-Woche"
Ungerade Woche: "State:Ungerade-Woche"

Ich dachte mir, dass ich ein DOIF baue, welches Montag um 00:01 den State vom Dummy auf "Gerade Woche" setzt, sofern es eine Gerade Woche ist.
Sonntag Abend um 23:59 wird in der Geraden Woche der State auf "Ungerade Woche" gesetzt.

Ich wollte es so lösen:
define DOIF_Kinder_KW DOIF ([00:01|1] and strftime("%W",localtime)%2 == 1) (set Kinder_KW Gerade-Woche) DOELSEIF ([23:59|0] and strftime("%W",localtime)%2 == 1) (set Kinder_KW Ungerade-Woche)

Mit Testen wird es schwer werden, ich müsste es 2 Wochen laufen lassen, bis ich weiß das es geht.
Ist mein Code richtig? Kann es überhaupt funktionieren?

Ich danke euch. :)

Wen es Interessiert: Meine Kids haben im wöchentlichen Wechsel eine kleine tägliche Aufgabe zu erledigen. Ständig zoffen sie sich, wer in dieser Woche dran ist. Und ich vergesse es auch. Darum will ich einen Dummy haben, in dem zu sehen ist, ob es eine gerade oder ungerade Woche ist. Das lasse ich dann auf TabletUI anzeigen und ich habe weniger streß. :)

Sollte einfacher gehen:

define DOIF_Kinder_KW DOIF ([00:01|Mo] and $week % 2 == 0) (set Kinder_KW Gerade-Woche)  DOELSE (set Kinder_KW Ungerade-Woche)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frank_Huber


Damian

#4
Zitat von: Frank_Huber am 24 April 2018, 08:36:02
sollte mit cmdState auch ohne Dummy gehen.

Die Kurzversion.
Damit es auch schon morgen funktioniert, ohne Montagsabfrage:

define Kinder_KW DOIF ([00:01] and $week % 2)

attr cmdState Ungerade-Woche|Gerade-Woche

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

Frank_Huber

Zitat von: Damian am 24 April 2018, 08:41:42
Die Kurzversion.
Damit es auch schon morgen funktioniert, ohne Montagsabfrage:

define Kinder_KW DOIF ([00:01] and $week % 2)

attr cmdState Ungerade-Woche|Gerade-Woche

das ist wirklich kurz.
Fage von mir zum Verständnis, geht das so auch ohne DOELSE am Ende?

Damian

#6
Zitat von: Frank_Huber am 24 April 2018, 09:13:35
das ist wirklich kurz.
Fage von mir zum Verständnis, geht das so auch ohne DOELSE am Ende?
ja, DOELSE ist ohne do always bei einer einzigen Bedingung automatisch intern immer dabei. Begründung: wenn es nicht so wäre, würde man cmd_1 nur einmal schalten können, weil man aus cmd_1 nie wieder herauskäme ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

M.Piet

Super, ich danke euch. Das ist ja so wirklich viel einfacher. :)
Ich teste mal.

Frank_Huber

Ich hab es mir als "Müll-Kalender eingebaut. läuft gut.
lediglich im cmdState war es vertauscht.

defmod Abfall_KW DOIF ([00:01] and $week % 2)
attr Abfall_KW DbLogExclude .*
attr Abfall_KW cmdState Restmüll-Woche|Wertstoff-Woche
attr Abfall_KW event-on-change-reading .*
attr Abfall_KW verbose 0


also das Beispiel korrigiert:
defmod Kinder_KW DOIF ([00:01] and $week % 2)
attr Kinder_KW cmdState Gerade-Woche|Ungerade-Woche

Frank_Huber

#9
Moin Moin,

Ich muss den hier nochmal hoch kramen.

Diese Woche ist ja KW 01. Das FHEM Log ist auch auf 2020-01. Sowohl Y%-W% als auch G%-V% bringt die korrekte Woche 01.
Mein Abfall DOIF zeigte mir aber an dass eine Gerade Woche ist?

Habe ich etwas falsch? Oder läuft in meinem System was falsch?

Hier das List:
Internals:
   DEF        ([00:01] and $week % 2)
   FUUID      5c4aeffd-f33f-c13c-2077-dbd5982b694b7e92
   MODEL      FHEM
   NAME       Abfall_KW
   NOTIFYDEV  global
   NR         217
   NTFY_ORDER 50-Abfall_KW
   STATE      Wertstoff
   TYPE       DOIF
   VERSION    23418 2020-12-26 10:04:12
   .attraggr:
   .attreocr:
     .*
   .attrminint:
   READINGS:
     2020-12-28 00:01:00   cmd             1
     2020-12-28 00:01:00   cmd_event       timer_1
     2020-12-28 00:01:00   cmd_nr          1
     2020-08-18 07:28:57   mode            enabled
     2020-12-28 00:01:00   state           Wertstoff
     2021-01-05 00:01:00   timer_01_c01    06.01.2021 00:01:00
   Regex:
     accu:
   attr:
     cmdState:
       0:
         Wertstoff
       1:
         Restmüll
     waitdel:
   condition:
     0          ::DOIF_time_once($hash,0,$wday) and $week % 2
   days:
   do:
     0:
       0         
     1:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
     event      timer_1
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev   
     timerevent timer_1
     triggerDev
     timerevents:
       timer_1
     timereventsState:
       timer_1
     triggerEvents:
       timer_1
     triggerEventsState:
       timer_1
   interval:
   intervalfunc:
   localtime:
     0          1609887660
   perlblock:
   realtime:
     0          00:01:00
   time:
     0          00:01:00
   timeCond:
     0          0
   timer:
     0          0
   timers:
     0           0
   triggertime:
     1609887660:
       localtime  1609887660
       hash:
   uiTable:
Attributes:
   DbLogExclude .*
   cmdState   Wertstoff|Restmüll
   event-on-change-reading .*

Damian

#10
Wieso gerade?

$week % 2 ist gerade bei Ergebnis 0, sonst 1

ab dem 04.01 ist $week 1, daher ungerade -> Ergebnis 1

vor dem 04.01 war $week 53, also auch ungerade -> Ergebnis 1

Für den wöchentlichen Wechsel ist diese Prüfung beim Jahresübergang tatsächlich ungeeignet.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Frank_Huber

Zitat von: Damian am 05 Januar 2021, 11:52:02
Wieso gerade?
$week % 2 ist gerade bei Ergebnis 0, sonst 1
ab dem 04.01 ist $week 1, daher ungerade -> Ergebnis 1
vor dem 04.01 war $week 53, also auch ungerade -> Ergebnis 1
Für den wöchentlichen Wechsel ist diese Prüfung beim Jahresübergang tatsächlich ungeeignet.
Danke Damian!
Ich war durch Unwissenheit davon ausgegangen dass CMD_1 gerade ist. :-)
Jetzt ist es klar. Werde mir einen Kommentar in das DOIF schreiben.

Bei uns kommt Restmüll und Wertstoff im Wochenwechsel. Das lässt sich damit ganz gut abbilden.
Aber klar ist (jetzt) auch, Wenn ein Jahr 53 Wochen hat muss ich das DOIF im neuen Jahr anpassen da die Abfuhr ja auch wechselt.