Hallo,
ich möchte mir 4 mal täglich eine Nachricht schicken lassen und der Zeitpunkt soll jedes mal leicht anders sein:
Internals:
DEF (
[([08:55]+int(rand(1200)))] or
[([12:50]+int(rand(1200)))] or
[([16:45]+int(rand(1200)))] or
[([21:00]+int(rand(1200)))])
(set PushAndreas msg 'Test' 'Test' '' 0 'magic')
NAME MFTerinnerung_doif
NR 587
NTFY_ORDER 50-MFTerinnerung_doif
STATE initialized
TYPE DOIF
Readings:
2015-08-18 15:27:06 state initialized
2015-08-18 15:27:06 timer_1_c1 19.08.2015 09:01:13
2015-08-18 15:27:06 timer_2_c1 19.08.2015 12:50:54
2015-08-18 15:27:06 timer_3_c1 18.08.2015 17:02:28
2015-08-18 15:27:06 timer_4_c1 18.08.2015 21:12:48
Condition:
0 DOIF_time_once($hash->{timer}{0},$wday,"") or DOIF_time_once($hash->{timer}{1},$wday,"") or DOIF_time_once($hash->{timer}{2},$wday,"") or DOIF_time_once($hash->{timer}{3},$wday,"")
Days:
Devices:
Do:
0 set PushAndreas msg 'Test' 'Test' '' 0 'magic'
Helper:
last_timer 4
sleeptimer -1
Itimer:
Realtime:
0 09:01:13
1 12:50:54
2 17:02:28
3 21:12:48
State:
Time:
0 ([08:55]+int(rand(1200)))
1 ([12:50]+int(rand(1200)))
2 ([16:45]+int(rand(1200)))
3 ([21:00]+int(rand(1200)))
Timecond:
0 0
1 0
2 0
3 0
Timer:
0 0
1 0
2 0
3 0
Timerfunc:
Timers:
0 0 1 2 3
Attributes:
group system
room Schaltung
verbose 5
# $Id: 98_DOIF.pm 8432 2015-04-13 19:34:11Z damian-s $
Laut den readings sieht das alles gut aus. Allerdings feuert das DOIF nur genau ein mal (das nächste mal) nachdem ich es erstellt oder modifiziert habe.
Hab ich hier einen Denkfehler oder ist es ein bug?
ich denke attr do always wäre Dein Freund.
Gruß Otto
:o Danke Otto! Manchmal sieht man den Baum vor lauter Wald nicht ...
... was ich etwas 'counter-intuitive' finde, dass das hier ohne do always funktioniert:
(([8:00|1] or [7:00|2] or [9:00|3] or [7:00|4] or [7:00|5]) and !($we)) (set Sicherung2 on, sleep 30, set JalousieKZ hoch)
DOELSEIF ([9:00|7]) (set Sicherung2 on, sleep 30, set JalousieKZ hoch)
DOELSEIF ([{sunset("REAL",0,"15:00","20:00")}]) (set JalousieKZ dim)
Wenn ich es richtig verstanden habe, muss der Zustand der Bedingung wechseln und nicht blos der event wiederkehren.
ZitatDas Modul wird getriggert, sobald das angegebene Device hier "remotecontrol" ein Event erzeugt. Das geschieht, wenn irgendein Reading oder der Status von "remotecontrol" aktualisiert wird. Ausgewertet wird hier der Zustand des Statuses von remotecontrol nicht das Event selbst. Die Ausführung erfolgt standardmäßig einmalig nur nach Zustandswechsel des Moduls. Das bedeutet, dass ein mehrmaliges Drücken der Fernbedienung auf "on" nur einmal "set garage on" ausführt. Die nächste mögliche Ausführung ist "set garage off", wenn Fernbedienung "off" liefert. Wünscht man eine Ausführung des gleichen Befehls mehrfach nacheinander bei jedem Trigger, unabhängig davon welchen Zustand das DOIF-Modul hat, weil z. B. Garage nicht nur über die Fernbedienung geschaltet wird und dann muss man das per "do always"-Attribut angeben:
Dein letztes Beispiel läuft genau einmal am Tag.
Gruß Otto
Irgendwas stimmt nicht mit den zufälligen Zeiten ...
Ich hab jetzt do always gemacht und jetzt schickt das DOIF evtl. 2 Nachrichten zu einer Tageszeit: gerade passiert: mittags wird z.B. um 12:56 gesendet [([12:50]+int(rand(1200)))] und dann nach dem senden wird der Timer neu gesetzt. Wird der Timer auf morgen 13:01 gesetzt sendet das DOIF aber heute auch um 13:01 ... also 2 Nachrichten mittags
Ich will aber morgens, mittags, nachmittags, abends jeweils eine Nachricht zu einer zufälligen Zeit ...
Damian? ::)
Jetzt hab ich das Ganze mal mit at probiert und einer Funktion
*{time_random_offset("21:02:00",1200)}
Aber leider das gleiche Problem: wenn der Befehl ausgeführt wird (z.B. 21:06), wird gleich der Timer für's nächste mal gesetzt (z.B. 21:19) und dann wird der Befehl also evtl. zwei mal am Tag ausgeführt ...
Versteht jemand die Problematik und kann mir weiter helfen? Oder muss ich Verrenkungen mit dummy's etc. machen ..?
Also nur eine Idee: Du setzt den Timer mit + in die Zukunft. Damit kann/muss genau das passieren. Was ist wenn Du den Timer mit - setzt? Dann ist die Zeit immer nur für Morgen, heute geht nicht mehr.
Also ([08:55]-int(rand(1200)))
Gruß Otto
Zitat von: Otto123 am 19 August 2015, 23:36:09
Also nur eine Idee: Du setzt den Timer mit + in die Zukunft. Damit kann/muss genau das passieren. Was ist wenn Du den Timer mit - setzt? Dann ist die Zeit immer nur für Morgen, heute geht nicht mehr.
Also ([08:55]-int(rand(1200)))
Gruß Otto
Egal wie man es definiert. Es kann immer passieren, dass mehrfach am Tag getriggert wird:
Beispiel:
Schaltzeit am Vortag bestimmt z. B. 09:00 (08:55 +00:05)
1. Um 09:00 (Zufall 60) -> Schaltzeit 08:55+00:10=09:05 (gleicher Tag)
2. Um 09:05 (Zufall 120) -> Schaltzeit 08:55+00:20=09:15 (gleicher Tag)
...
Bei Minus passiert das genauso allerdings dann, wenn der Zufall abnimmt also (Zufall 120, Zufall 60 usw.)
Dieses Problem lässt sich mit der neuen Version http://forum.fhem.de/index.php/topic,39070.0.html eleganter lösen:
di_zufall ([08:55]) (...)
attr di_zufall wait rand(1200)
Hier wird immer einmal pro Tag um 08:55 getriggert mit unterschiedlicher Verzögerung.
Gruß
Damian
Hallo Damian,
war zu kurz gedacht von mir :-X aber Du hast wie so oft eine Lösung.
Spitze Dein Modul! :)
Gruß Otto
Danke Damian! Die Eleganz des codes hat über die dummy-Krücken gesiegt .... ;D
Zitat von: andiw am 20 August 2015, 19:00:51
Die Eleganz des codes
@Damian: Kann man schönere Komplimente bekommen?!
Otto