FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Tsturm am 07 April 2019, 19:43:16

Titel: DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Tsturm am 07 April 2019, 19:43:16
Hallo Zusammen,

ich möchte alle 2 / 3/ 4/... Tage zu einer bestimmten Zeit ein Doif ausführen ( Beregnung). Irgendwie stehe ich auf dem Schlauch... ich bekomme entweder die Wochentagssteuerung hin (hilft aber nicht bei variablen Tagesintervallen wenn ich von zwei auf drei Tage Intervall gehen will), oder eine Taktung mit  [+[h]:MM] - allerdings ist dann die Startzeit nicht mehr definiert (ich will wenn, dann morgens um 6:00 bewässsern).

Any suggestions oder habe ich da was übersehen?

VG timmo
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Damian am 07 April 2019, 20:55:58
Zitat von: Tsturm am 07 April 2019, 19:43:16
Hallo Zusammen,

ich möchte alle 2 / 3/ 4/... Tage zu einer bestimmten Zeit ein Doif ausführen ( Beregnung). Irgendwie stehe ich auf dem Schlauch... ich bekomme entweder die Wochentagssteuerung hin (hilft aber nicht bei variablen Tagesintervallen wenn ich von zwei auf drei Tage Intervall gehen will), oder eine Taktung mit  [+[h]:MM] - allerdings ist dann die Startzeit nicht mehr definiert (ich will wenn, dann morgens um 6:00 bewässsern).

Any suggestions oder habe ich da was übersehen?

VG timmo

Es gibt die Zeitvariable $yday mit Tag des Jahres.

Mit Modulo-Operator kannst du die Teilbarkeit überprüfen:

An ungeraden Tagen:

([18:00] and $yday %  2)

oder

jeden dritten Tag:

([18:00] and !($yday %  3))

usw.
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: amenomade am 07 April 2019, 21:20:18
Dann hast Du evtl. ein Problem beim Jahreswechsel.

([20:00|[$SELF:nextDay]]) (set du1 on)(setreading $SELF nextDay {(([$SELF:nextDay]+2)%7)})
wo nextDay ein Reading vom DOIF ist, mit Wochentag als Zahl

Beispiel: jeden 2. Tag ab kommenden Montag
nextDay = 1 am Anfang; es wird um 20 Uhr am Montag geschaltet, dann wird der nächste Tag auf 3 gesetzt => schaltet dann am Mittwoch => 5 = Freitag => 0 = Sonntag => 2 = Dienstag, usw. Ergibt jeden 2. Tag ab kommenden Montag
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Damian am 07 April 2019, 21:37:08
in der Rubrik: hackers guide

könnte auch funktionieren:

([([18:00]+anzahl_Tage*86400)])


anzahl_tage ist mit einer Zahl zu belegen.
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Tsturm am 07 April 2019, 22:37:15
Wow.. na wenigstens habe ich nichts übersehen ;-))

Vielen Dank - ich probiere es aus und gebe Bescheid!

VG timmo
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Bartimaus am 18 September 2019, 15:09:39
Zitat von: Damian am 07 April 2019, 21:37:08
in der Rubrik: hackers guide

könnte auch funktionieren:

([([18:00]+anzahl_Tage*86400)])


anzahl_tage ist mit einer Zahl zu belegen.

Aber dann wird doch die Bedingung nie wahr...., weil man nie 18:00+2 Tage erreicht. Am nächsten Tag sind es ja wieder +2 Tage
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Damian am 18 September 2019, 17:12:29
Zitat von: Bartimaus am 18 September 2019, 15:09:39
Aber dann wird doch die Bedingung nie wahr...., weil man nie 18:00+2 Tage erreicht. Am nächsten Tag sind es ja wieder +2 Tage

Nein, der nächste Zeitpunkt ist erst in zwei Tagen. Definiere mal DOIF ([([18:00]+2*86400)]) und schaue wann der nächste Timer zuschlägt. ;)

Es ist nirgendwo beschrieben, aber DOIF kann auch alle x-Tage triggern.

Edit: Es geht sogar ([42:00]) ;)
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Frank_Huber am 18 September 2019, 18:01:34
Zitat von: Damian am 18 September 2019, 17:12:29
Nein, der nächste Zeitpunkt ist erst in zwei Tagen. Definiere mal DOIF ([([18:00]+2*86400)]) und schaue wann der nächste Timer zuschlägt. ;)

Es ist nirgendwo beschrieben, aber DOIF kann auch alle x-Tage triggern.

Edit: Es geht sogar ([42:00]) ;)

in der Commandref steht etwas von max 59min bzw 24 Std.
https://fhem.de/commandref_DE.html#DOIF_Relative_Zeitangaben_nach_Zeitraster_ausgerichtet
Bin ich damit auf dem Holzweg oder ist DOIF mittlerweile besser als seine commandref? ;-)
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Damian am 18 September 2019, 18:06:55
Zitat von: Frank_Huber am 18 September 2019, 18:01:34
in der Commandref steht etwas von max 59min bzw 24 Std.
https://fhem.de/commandref_DE.html#DOIF_Relative_Zeitangaben_nach_Zeitraster_ausgerichtet
Bin ich damit auf dem Holzweg oder ist DOIF mittlerweile besser als seine commandref? ;-)

Das sind ja nur relative Zeitangaben und zwar ausgerichtet nach einem Zeitraster.

Hier geht es um absolute Angaben, wie z. B. ([18:00])

und ja, DOIF kann mehr als in der Doku steht und das mit Absicht, denn [42:00] würde keiner verstehen, obwohl es funktioniert.
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: amenomade am 18 September 2019, 19:07:44
Zitat von: Damian am 18 September 2019, 18:06:55
denn [42:00] würde keiner verstehen, obwohl es funktioniert.
Und wie ist das zu verstehen?
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Damian am 18 September 2019, 19:26:13
Zitat von: amenomade am 18 September 2019, 19:07:44
Und wie ist das zu verstehen?

Eben! Probiere mal aus! Da war sie wieder: die berühmte 42 :)
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: amenomade am 18 September 2019, 20:08:49
Zitat von: Damian am 18 September 2019, 19:26:13
Eben! Probiere mal aus! Da war sie wieder: die berühmte 42 :)

Kriege ich dann DIE Antwort? Waouh, Cool !
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Damian am 18 September 2019, 20:25:12
Vielleicht die hier: https://www.heise.de/newsticker/meldung/Mathematiker-knacken-Gleichung-mit-Kubikzahlen-und-der-Summe-42-4523603.html
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Bartimaus am 19 September 2019, 08:46:09
Zitat von: Damian am 18 September 2019, 17:12:29
Nein, der nächste Zeitpunkt ist erst in zwei Tagen. Definiere mal DOIF ([([18:00]+2*86400)]) und schaue wann der nächste Timer zuschlägt. ;)

Es ist nirgendwo beschrieben, aber DOIF kann auch alle x-Tage triggern.



Moin,

hatte ich, und die Beregnung ist nie losgelaufen....
.... weil meiner Meinung nach jeden Tag um 04:00 Uhr wieder zwei Tage addiert wurden.. ([([04:00]+2*86400)])

Ich werde jetzt aber "sicherheitshalber" ein neues Test-DOIF mit dieser Zeitangabe erstellen, und abwarten was passiert  ;D
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Damian am 19 September 2019, 09:41:04
Zitat von: Bartimaus am 19 September 2019, 08:46:09
Moin,

hatte ich, und die Beregnung ist nie losgelaufen....
.... weil meiner Meinung nach jeden Tag um 04:00 Uhr wieder zwei Tage addiert wurden.. ([([04:00]+2*86400)])

Ich werde jetzt aber "sicherheitshalber" ein neues Test-DOIF mit dieser Zeitangabe erstellen, und abwarten was passiert  ;D

Naja nach der Definition des DOIFs steht der Timer auf jeden Fall vom Datum her zwei Tage später und damit wird er auf jeden Fall nicht morgen zuschlagen. Jetzt muss man noch die Tage abwarten und schauen, ob der nächste Zeitpunkt nach der Triggerung wieder Tage später ist. Da die Anzeige des Timers im Reading mit Datum die tatsächlich errechnete ist, kann man sich darauf verlassen. Zu bedenken ist, dass wenn während der Wartezeit das System neu gestartet wird, die Zeit ab dem Definitionszeitpunkt neu berechnet wird und das kann dann ein späterer Tag sein. Deswegen sind solche Definitionen mit Vorsicht zu genießen und stehen nicht in der Commandref.
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Bartimaus am 19 September 2019, 10:09:47
So, Test läuft.

Um 09:00 hat es nicht gefeuert, weil +2 Tage.
Timer C01 steht auf übermorgen.

Jetzt heisst es warten

Internals:
  CFGFN     
  DEF        ([([09:00]+2*86400)])
(set PushiPhone message Testberegnung)
  FUUID      5d8324b5-f33f-dcb4-827c-bb432b0ab651dc72
  MODEL      FHEM
  NAME      TestBeregnung
  NR        747591
  NTFY_ORDER 50-TestBeregnung
  STATE      cmd_2
  TYPE      DOIF
  VERSION    19786 2019-07-05 21:47:08
  READINGS:
    2019-09-19 08:52:13  cmd            2
    2019-09-19 08:52:13  cmd_event      TestBeregnung
    2019-09-19 08:52:13  cmd_nr          2
    2019-09-19 08:52:05  mode            enabled
    2019-09-19 08:52:13  state          cmd_2
    2019-09-19 08:52:06  timer_01_c01    21.09.2019 09:00:00
  Regex:
    accu:
  attr:
    cmdState:
    wait:
    waitdel:
  condition:
    0          ::DOIF_time_once($hash,0,$wday)
  days:
  devices:
  do:
    0:
      0          set PushiPhone message Testberegnung
    1:
  helper:
    globalinit 1
    last_timer 1
    sleeptimer -1
    timerdev 
    timerevent
    timerevents
    timereventsState
    triggerDev
    DOIF_eventas:
      cmd_nr: 2
      cmd: 2
      cmd_event: TestBeregnung
      state: cmd_2
  internals:
  intervalfunc:
  itimer:
  localtime:
    0          1569049200
  readings:
  realtime:
    0          09:00:00
  time:
    0          ([09:00]+2*86400)
  timeCond:
    0          0
  timer:
    0          0
  timers:
    0          0
  triggertime:
    1569049200:
      localtime  1569049200
      hash:
  uiState:
  uiTable:
Attributes:
  room      TestDOIF


Edith:

Ha, ([59:00]) (set bla on) funzt tatsächlich.... Timer C01 auf 21.09.2019 11:00 Uhr....  :o :D
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Damian am 19 September 2019, 10:53:53
Zitat von: Bartimaus am 19 September 2019, 10:09:47
Edith:

Ha, ([59:00]) (set bla on) funzt tatsächlich.... Timer C01 auf 21.09.2019 11:00 Uhr....  :o :D

Naja, wenn 42 funktioniert, dann auch 59 :) Bevor du weiter probierst, die größte mögliche Zahl an dieser Stelle liegt bei 99.
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: mi.ke am 01 Januar 2023, 14:25:11
Zitat von: Damian am 07 April 2019, 20:55:58
Es gibt die Zeitvariable $yday mit Tag des Jahres.

Mit Modulo-Operator kannst du die Teilbarkeit überprüfen:

An ungeraden Tagen:

([18:00] and $yday %  2)

oder

jeden dritten Tag:

([18:00] and !($yday %  3))

usw.

Würde das auch mit Monaten funktionieren?

([18:00] and !($month % 3))

Oder gibt es einen anderen Weg, dass DOIF alle drei Monate auszuführen?

cheers
mi.ke
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Per am 01 Januar 2023, 15:12:18
Dann würde das in dem Monat aber jeden Tag ausgeführt werden.
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: Damian am 01 Januar 2023, 16:33:14
Zitat von: mi.ke am 01 Januar 2023, 14:25:11
Würde das auch mit Monaten funktionieren?

([18:00] and !($month % 3))

Oder gibt es einen anderen Weg, dass DOIF alle drei Monate auszuführen?

cheers
mi.ke

Dann eher:

([18:00] and (($month-1) % 3) == 0 and $mday == 1)

ergibt:

01.01, 01.04, ...
Titel: Antw:DOIF regelmäßig alle x tage zu einer Uhrzeit ausführen...
Beitrag von: mi.ke am 01 Januar 2023, 23:20:02
Zitat von: Per am 01 Januar 2023, 15:12:18
Dann würde das in dem Monat aber jeden Tag ausgeführt werden.

Zitat von: Damian am 01 Januar 2023, 16:33:14
Dann eher:

([18:00] and (($month-1) % 3) == 0 and $mday == 1)

ergibt:

01.01, 01.04, ...

Danke Euch Beiden