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
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.
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
in der Rubrik: hackers guide
könnte auch funktionieren:
([([18:00]+anzahl_Tage*86400)])
anzahl_tage ist mit einer Zahl zu belegen.
Wow.. na wenigstens habe ich nichts übersehen ;-))
Vielen Dank - ich probiere es aus und gebe Bescheid!
VG timmo
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
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]) ;)
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? ;-)
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.
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?
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 :)
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 !
Vielleicht die hier: https://www.heise.de/newsticker/meldung/Mathematiker-knacken-Gleichung-mit-Kubikzahlen-und-der-Summe-42-4523603.html
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
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.
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
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.
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
Dann würde das in dem Monat aber jeden Tag ausgeführt werden.
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, ...
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