DOIF täglich zufälliger Zeitpunkt

Begonnen von andiw, 18 August 2015, 15:31:42

Vorheriges Thema - Nächstes Thema

andiw

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?

Otto123

ich denke attr do always wäre Dein Freund.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

andiw

 :o Danke Otto! Manchmal sieht man den Baum vor lauter Wald nicht ...

andiw

... 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)

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

andiw

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?  ::)

andiw

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 ..?

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

Hallo Damian,

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

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

andiw

Danke Damian! Die Eleganz des codes hat über die dummy-Krücken gesiegt ....  ;D

Otto123

Zitat von: andiw am 20 August 2015, 19:00:51
Die Eleganz des codes
@Damian: Kann man schönere Komplimente bekommen?!

Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz