FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: andiw am 18 August 2015, 15:31:42

Titel: DOIF täglich zufälliger Zeitpunkt
Beitrag von: andiw am 18 August 2015, 15:31:42
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?
Titel: Antw:DOIF täglich zufälliger Zeitpunkt
Beitrag von: Otto123 am 18 August 2015, 15:33:55
ich denke attr do always wäre Dein Freund.

Gruß Otto
Titel: Antw:DOIF täglich zufälliger Zeitpunkt
Beitrag von: andiw am 18 August 2015, 15:37:53
 :o Danke Otto! Manchmal sieht man den Baum vor lauter Wald nicht ...
Titel: Antw:DOIF täglich zufälliger Zeitpunkt
Beitrag von: andiw am 18 August 2015, 16:58:35
... 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)
Titel: Antw:DOIF täglich zufälliger Zeitpunkt
Beitrag von: Otto123 am 18 August 2015, 17:29:28
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
Titel: Antw:DOIF täglich zufälliger Zeitpunkt
Beitrag von: andiw am 19 August 2015, 13:10:34
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?  ::)
Titel: Antw:DOIF täglich zufälliger Zeitpunkt
Beitrag von: andiw am 19 August 2015, 22:36:57
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 ..?
Titel: Antw:DOIF täglich zufälliger Zeitpunkt
Beitrag 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
Titel: Antw:DOIF täglich zufälliger Zeitpunkt
Beitrag von: Damian am 20 August 2015, 07:22:29
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
Titel: Antw:DOIF täglich zufälliger Zeitpunkt
Beitrag von: Otto123 am 20 August 2015, 09:20:16
Hallo Damian,

war zu kurz gedacht von mir  :-X aber Du hast wie so oft eine Lösung.
Spitze Dein Modul! :)

Gruß Otto
Titel: Antw:DOIF täglich zufälliger Zeitpunkt
Beitrag von: andiw am 20 August 2015, 19:00:51
Danke Damian! Die Eleganz des codes hat über die dummy-Krücken gesiegt ....  ;D
Titel: Antw:DOIF täglich zufälliger Zeitpunkt
Beitrag von: Otto123 am 20 August 2015, 22:48:34
Zitat von: andiw am 20 August 2015, 19:00:51
Die Eleganz des codes
@Damian: Kann man schönere Komplimente bekommen?!

Otto