DOIF neues Feature: Wiederholende Ausführung mit Zeitangabe

Begonnen von Damian, 06 November 2015, 22:05:57

Vorheriges Thema - Nächstes Thema

Damian

Zitat von: moonsorrox am 20 Januar 2016, 13:44:46
ich habe nochmal eine Frage zu dem Anwendungsbeispiel: Anwesenheitssimulation
Ich habe das mal Testweise nach gestellt um zu sehen wie es funktioniert, aber so ganz ist mir das nicht klar

Hier mal das list:
Internals:
   CFGFN      ./FHEM/Test.cfg
   DEF        ([19:00-00:45])(set Dachlicht_03 on-for-timer {(int(rand(1800)+300))}) DOELSE
   NAME       di_presence_simulation
   NR         3688
   NTFY_ORDER 50-di_presence_simulation
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2016-01-19 23:54:11   Event           wait_timer: no timer
     2016-01-20 00:45:00   cmd_event       timer_2
     2016-01-20 00:45:00   cmd_nr          2
     2016-01-20 00:45:00   state           cmd_2
     2016-01-19 19:00:00   timer_1_c1      20.01.2016 19:00:00
     2016-01-20 00:45:00   timer_2_c1      21.01.2016 00:45:00
     2016-01-20 00:45:00   wait_timer      no timer
   Condition:
     0          DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
   Days:
   Devices:
   Do:
     0:
       0          set Dachlicht_03 on-for-timer {(int(rand(1800)+300))}
     1:
       0
   Helper:
     event      batVoltage: 3.03
     globalinit 1
     last_timer 2
     sleepdevice timer_1
     sleepsubtimer 0
     sleeptimer -1
     triggerDev Temperatur_Bad
     triggerEvents:
       batVoltage: 3.03
       battery: ok
       humidity: 31
       luminosity: 6.93
       T: 20.1 H: 31 L: 6.93
       temperature: 20.1
   Internals:
   Itimer:
   Readings:
   Realtime:
     0          19:00:00
     1          00:45:00
   Regexp:
   State:
   Time:
     0          19:00:00
     1          00:45:00
   Timecond:
     0          0
     1          0
   Timer:
     0          0
     1          0
   Timerfunc:
   Timers:
     0           0  1
Attributes:
   alias      Anwesenheitssimulation Licht EG
   do         always
   group      Anwesenheitssimulation
   icon       light_on-for-timer@#F0E68C
   repeatcmd  rand(3600)+1800
   room       AutomationTest



wenn ich jetzt in mein Log schaue sehe ich folgende Ereignisse die ich nicht verstehe.
Die Angebane hinter "on-for-timer" sind ja die Sekunden, dass bedeutet doch das solange das Dachlicht eingeschaltet ist.
Wenn ich jetzt mal 21:09:32 nehme bleibt das Licht für 1691sec. eingeschaltet dass sind ca. 28:18 min. das heißt das Licht ist eigentlich bis 22:37 Uhr eingeschaltet, aber da kommt doch vorher schon die nächste Zeit 21:47:57 Uhr und setzt erneut den on-for-timer auf 529sec. das heißt die Beleuchtung ist doch gar nicht ausgegangen...! oder verstehe ich das falsch..?

hier mal die Logeinträge

2016.01.19 22:57:09 3: CUL_HM set Dachlicht_03 on-for-timer 1703
2016.01.19 22:18:54 3: CUL_HM set Dachlicht_03 on-for-timer 899
2016.01.19 21:47:57 3: CUL_HM set Dachlicht_03 on-for-timer 529
2016.01.19 21:09:32 3: CUL_HM set Dachlicht_03 on-for-timer 1691
2016.01.19 20:06:45 3: CUL_HM set Dachlicht_03 on-for-timer 1014
2016.01.19 19:00:00 3: CUL_HM set Dachlicht_03 on-for-timer 1125


In dem Fall geht sie wohl nicht aus. Wenn deine Lampe auf jeden Fall ausgehen soll, dann musst du den festen Wiederholungsanteil höher setzen z. B.

repeatcmd  rand(3600)+2600

Da rand(3600)+2600  immer größer ist, als die on-for-time-Zeit von rand(1800)+300 muss die Lampe vorher ausgehen, bevor sie wieder angeht.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dk3572

Hallo,
ich möchte eine Nachricht, wenn das Fenster länger als 20 sec. offen ist und nach weiteren 20 sec. die gleiche Nachricht noch einmal.
Mit meinem DOIF bekomme ich es nicht gebacken.
Das sendet auch, wenn das Fenster vor den 20 sec. wieder geschlossen wird und auch wenn sich der Status von HandyDieter von "off" auf "on" ändert.
Ich habe schon so ziemlich alle Konstellationen aus der commandref probiert. Wo liegt mein Fehler?

define Status_Fenster_WC DOIF ([Fenster_WC] eq "open" and [HandyDieter] eq "on") (set Pushbullet_D message Das Fenster im WC ist noch offen
attr repeatcmd 20
attr repeatsame 2
attr wait 20


Danke schon mal für die Hilfe.

moonsorrox

#17
Zitat von: Damian am 20 Januar 2016, 17:16:13
In dem Fall geht sie wohl nicht aus. Wenn deine Lampe auf jeden Fall ausgehen soll, dann musst du den festen Wiederholungsanteil höher setzen z. B.

repeatcmd  rand(3600)+2600

Da rand(3600)+2600  immer größer ist, als die on-for-time-Zeit von rand(1800)+300 muss die Lampe vorher ausgehen, bevor sie wieder angeht.

Gruß

Damian

OK, dass werde ich dann mal ausprobieren.

Ich habe jetzt erst einmal alle so gelassen und ein weitere Anwesenheitssimulation erstellt und bekomme bei der einen Fehler angezeigt, währen dessen die andere Simulation läuft. Beide sind identisch nur der zu schaltende Ausgang ist ein anderer.
Aber wo liegt der Fehler jetzt..?

Fehler im DOIF:
2016.01.20 18:15:00 2: di_TerrassenBeleuchtung_simulation: set NI3_LichtTerrasse on-for-timer 509: Unknown argument on-for-timer, choose one of  ON OFF TRIGGER

List des DOIF:
Internals:
   CFGFN      ./FHEM/AussenBeleuchtung.cfg
   DEF        ([18 NI3_LichtTerrasse on-for-timer {(int(rand(1800)+300))}) DOELSE
   NAME       di_TerrassenBeleuchtung_simulation
   NR         988
   NTFY_ORDER 50-di_TerrassenBeleuchtung_simulation
   STATE      Ein
   TYPE       DOIF
   Readings:
     2016-01-20 18   Event           Next: 18
     2016-01-20 18   cmd_event       timer_1
     2016-01-20 18   cmd_nr          1
     2016-01-20 18   error           set NI3_LichtTerrasse on-for-timer 509: Unknown argument on-for-timer, choose one of  ON OFF TRIGGER
     2016-01-20 18   state           Ein
     2016-01-20 18   timer_1_c1      21.01.2016 18
     2016-01-20 18   timer_2_c1      21.01.2016 00
     2016-01-20 18   wait_timer      20.01.2016 19 cmd_1 timer_1
   Condition:
     0          DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
   Days:
   Devices:
   Do:
     0:
       0          set NI3_LichtTerrasse on-for-timer {(int(rand(1800)+300))}
     1:
       0
   Helper:
     event      loadLvl: low
     globalinit 1
     last_timer 2
     sleepdevice timer_1
     sleepsubtimer 0
     sleeptimer 0
     triggerDev HMUSB
     triggerEvents:
       loadLvl: low
   Internals:
   Itimer:
   Readings:
   Realtime:
     0          18
     1          00
   Regexp:
   State:
   Time:
     0          18
     1          00
   Timecond:
     0          0
     1          0
   Timer:
     0          0
     1          0
   Timerfunc:
   Timers:
     0           0  1
Attributes:
   alias      Anwesenheitssimulation Licht Terrasse
   cmdState   Ein|Aus
   do         always
   group      Anwesenheitssimulation
   icon       light_on-for-timer@blue
   repeatcmd  rand(3600)+1800
   room       AußenLicht



EDITH:// ich denke die Probleme kommen deshalb weil mein Netzwerkeingang NI3 nicht mit dem on-for-timer umgehen kann...!
Ich müsste da wohl einen Umweg gehen und die Zeit des DOIF on-for-timer in ein Dummy schreiben und dieses sollte dann den Status weiter geben.
Ich habe mal nur den on-for-timer auf den NI3 mit set set NI3_LichtTerrasse 10 gegeben da bekomme ich den gleichen Fehler wie oben angegeben.
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Ellert

Zitat von: dk3572 am 20 Januar 2016, 17:23:17
Hallo,
ich möchte eine Nachricht, wenn das Fenster länger als 20 sec. offen ist und nach weiteren 20 sec. die gleiche Nachricht noch einmal.
Mit meinem DOIF bekomme ich es nicht gebacken.
Das sendet auch, wenn das Fenster vor den 20 sec. wieder geschlossen wird und auch wenn sich der Status von HandyDieter von "off" auf "on" ändert.
Ich habe schon so ziemlich alle Konstellationen aus der commandref probiert. Wo liegt mein Fehler?

define Status_Fenster_WC DOIF ([Fenster_WC] eq "open" and [HandyDieter] eq "on") (set Pushbullet_D message Das Fenster im WC ist noch offen
attr repeatcmd 20
attr repeatsame 2
attr wait 20


Danke schon mal für die Hilfe.
Du könntest DOELSE verwenden und die rechte Klammer schliessen.

dk3572

Das ist nur ein Teil der massage, die rechte Klammer ist natürlich geschlossen ;-)
Was meinst du mit dem DOELSE? Wie soll ich das verwenden?

Ellert

ZitatWas meinst du mit dem DOELSE?
Das Schlüsselwort DOELSE als möglicher Bestandteil der DOIF Definition.
ZitatWie soll ich das verwenden?
Die Frage irritiert mich etwas.
ZitatIch habe schon so ziemlich alle Konstellationen aus der commandref probiert.
Schau Dir doch diesen Abschnitt bitte noch einmal an http://fhem.de/commandref_DE.html#DOIF_Lesbarkeit_der_Definitionen bis zum Abschnitt "Teilausdrücke abfragen" ;) Kommst Du damit klar?

dk3572

Ich bin dankbar für die Unterstützung und die Hilfestellungen.
Ich lese Anleitungen und Forenbeiträge, probiere die verschiedensten Konstellationen und lerne dadurch immer mehr dazu.
Auch jetzt habe ich mir den Artikel zum wiederholten male durchgelesen. Doch leider will es mir nicht gelingen.
Wäre es nicht weniger zeit intensiv und zielführender wenn ich ein Beispiel gezeigt bekomme, auf dem ich dann weiter aufbauen und dazulernen kann?

Ellert

ZitatWäre es nicht weniger zeit intensiv und zielführender wenn ich ein Beispiel gezeigt bekomme
Scheinbar nicht, denn die erste beispielhafte Definition in dem verlinkten Abschitt ist das gewünschte Beispiel mit Erläuterungen. Hast Du dazu noch konkrete Fragen?

moonsorrox

würde es gehen das DOIF so umzustellen das ich in meinem Fall nicht den on-for-timer nutze sondern eben den set NI3_LichtTerrasse on aber die Simulation trotzdem läuft.
Ich habe da einige Versuche hinter mir aber es gelingt mir nicht  :-\
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

dk3572

@Ellert
Ok, das war das mit dem Wald und den vielen Bäumen  :-[
Scheint jetzt zu funktionieren.
Danke!!!

Ellert

Zitat von: moonsorrox am 20 Januar 2016, 21:08:49
würde es gehen das DOIF so umzustellen das ich in meinem Fall nicht den on-for-timer nutze sondern eben den set NI3_LichtTerrasse on aber die Simulation trotzdem läuft.
Ich habe da einige Versuche hinter mir aber es gelingt mir nicht  :-\

Im Prinzip geht es so:
([<Zeitspanne>]) (<Einschaltbefehl>) (<Ausschaltbefehl>)

wait <Zufallszeitdauer1>, <Zufallszeitdauer2>
repeatcmd <maximale Zufallszeitdauer1 plus maximale Zufallszeitdauer2>
timerWithWait
do always

moonsorrox

#26
OK, ich werde mal schauen wie ich das bei mir einbaue...

Ich habe den letzten Versuch von gestern Abend bisher heute noch nicht getestet - der sieht momentan so aus, ich glaube aber das er hiermit nicht ausgeht...!
Evtl. kannst du mal drüber schauen..?

Die Zeiten habe ich bisher noch so gelassen, wenn das Teil erst einmal funktioniert passe ich diese noch an.. jetzt schaue ich erst deinen Vorschlag an.


define di_TerrassenBeleuchtung_Simulation DOIF ([?du_Modus_TerrassenBeleuchtung] eq "Zufall" and ([[du_Anfang_Zufall]])) ({(int(rand(1800)+300))}) (set NI3_LichtTerrasse on) DOELSEIF ([[du_Ende_Zufall]]) (set NI3_LichtTerrasse off)\

attr di_TerrassenBeleuchtung_Simulation alias Anwesenheitssimulation Licht Terrasse
attr di_TerrassenBeleuchtung_Simulation cmdState EIN|AUS
attr di_TerrassenBeleuchtung_Simulation do always
attr di_TerrassenBeleuchtung_Simulation group Anwesenheitssimulation Terrasse
attr di_TerrassenBeleuchtung_Simulation icon light_on-for-timer@blue
attr di_TerrassenBeleuchtung_Simulation repeatcmd rand(3600)+1800
attr di_TerrassenBeleuchtung_Simulation room AußenLicht
attr di_TerrassenBeleuchtung_Simulation sortby 04


EDITH://
wenn ich das so vergleiche mit deinem Vorschlag habe ich das glaube ich so gemacht. Ich stehe nur etwas auf Kriegsfuß mit diesen ganzen Warte- und Wiederholungszeiten, dass habe ich noch nicht begriffen.
Mir fehlt in den Attributen das von dir angegebene..!
- wait
- timerWithWait

Dazu muss ich glaube ich aus meinem Code diesen Teil raus nehmen
({(int(rand(1800)+300))})

Ich habe jetzt mal umgebaut und werde heute Abend mal schauen ob das so funktioniert, zumindest meckert das DOIF nicht beim speichern...!
define di_TerrassenBeleuchtung_Simulation DOIF ([?du_Modus_TerrassenBeleuchtung] eq "Zufall" and ([[du_Anfang_Zufall]])) (set NI3_LichtTerrasse on) DOELSEIF ([[du_Ende_Zufall]]) (set NI3_LichtTerrasse off)
attr di_TerrassenBeleuchtung_Simulation alias Anwesenheitssimulation Licht Terrasse
attr di_TerrassenBeleuchtung_Simulation cmdState EIN|AUS
attr di_TerrassenBeleuchtung_Simulation do always
attr di_TerrassenBeleuchtung_Simulation group Anwesenheitssimulation Terrasse
attr di_TerrassenBeleuchtung_Simulation icon light_on-for-timer@blue
attr di_TerrassenBeleuchtung_Simulation repeatcmd rand(3600)+1800
attr di_TerrassenBeleuchtung_Simulation room AußenLicht
attr di_TerrassenBeleuchtung_Simulation sortby 04
attr di_TerrassenBeleuchtung_Simulation timerWithWait 1
attr di_TerrassenBeleuchtung_Simulation wait 1800,300


EDITH:// ging gar nicht erst an... :-\
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

moonsorrox

ich habe nun heute den ganzen Tag mal ein Test DOIF laufen - welches mir einen freien Kanal meines 4-Kanal nutzt - bevor ich das produktiv einsetze, aber es schaltet sich die Beleuchtung immer nur ein ich sehe im Log kein ausgehen..

Ich denke das liegt an dem attr repeatcmd welches ich noch nicht so richtig begriffen habe.

Generell mal die Frage..
Der erste Teil ist ja für den ersten DO-Fall das Einschalten der Teil nach dem Doppelpunkt für den zweiten DO-Fall, dass Ausschalten, ist das richtig..?

rand(1200) macht das zufällige und die was macht die zweite Zahl hinter dem "+"..?

Ich finde dazu leider in der commandref kein solch kombiniertes Beispiel

Internals:
   CFGFN      ./FHEM/AussenBeleuchtung.cfg
   DEF        ([?du_Modus_TerrassenBeleuchtung] eq "Zufall" and ([[du_Anfang_Zufall_WoT]|8] or [[du_Anfang_Zufall_WoE]|7])) (set Dachlicht_03 on) DOELSEIF ([[du_Ende_Zufall]]) (set Dachlicht_03 off)
   NAME       di_TerrassenBeleuchtung_Simulation1
   NR         1007
   NTFY_ORDER 50-di_TerrassenBeleuchtung_Simulation1
   STATE      EIN
   TYPE       DOIF
   Readings:
     2016-01-22 14:05:02   Event           wait_timer: no timer
     2016-01-22 14:05:02   cmd_event       timer_1
     2016-01-22 14:05:02   cmd_nr          1
     2016-01-22 14:05:02   state           EIN
     2016-01-22 04:00:00   timer_1_c1      23.01.2016 04:00:00|8
     2016-01-22 06:20:00   timer_2_c1      23.01.2016 06:20:00|7
     2016-01-22 00:40:00   timer_3_c2      23.01.2016 00:40:00
     2016-01-22 14:05:02   wait_timer      22.01.2016 14:24:49 cmd_1 timer_1
   Condition:
     0          InternalDoIf('du_Modus_TerrassenBeleuchtung','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "Zufall" and (DOIF_time_once($hash,$hash->{timer}{0},$wday,"8") or DOIF_time_once($hash,$hash->{timer}{1},$wday,"7"))
     1          DOIF_time_once($hash,$hash->{timer}{2},$wday,"")
   Days:
     0          8
     1          7
   Devices:
   Do:
     0:
       0          set Dachlicht_03 on
     1:
       0          set Dachlicht_03 off
     2:
   Helper:
     event      loadLvl: low
     globalinit 1
     last_timer 3
     sleepdevice timer_1
     sleepsubtimer 0
     sleeptimer 0
     triggerDev HMUSB
     triggerEvents:
       loadLvl: low
   Internals:
     0           du_Modus_TerrassenBeleuchtung:STATE
     all         du_Modus_TerrassenBeleuchtung:STATE
   Itimer:
     all         du_Anfang_Zufall_WoT du_Anfang_Zufall_WoE du_Ende_Zufall
   Readings:
   Realtime:
     0          04:00:00
     1          06:20:00
     2          00:40:00
   Regexp:
   State:
   Time:
     0          [du_Anfang_Zufall_WoT]
     1          [du_Anfang_Zufall_WoE]
     2          [du_Ende_Zufall]
   Timecond:
     0          0
     1          0
     2          1
   Timer:
     0          0
     1          0
     2          0
   Timerfunc:
   Timers:
     0           0  1
     1           2
Attributes:
   alias      Anwesenheitssimulation Licht Terrasse
   cmdState   EIN|AUS
   do         always
   group      Anwesenheitssimulation
   icon       light_on-for-timer@blue
   repeatcmd  rand(3600)+1800:rand(900)+900
   room       AußenLicht
   sortby     05
   timerWithWait 1
   wait       rand(600):rand(300)
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM

Ellert

Zitat von: Ellert am 21 Januar 2016, 08:50:00
Im Prinzip geht es so:
([<Zeitspanne>]) (<Einschaltbefehl>) (<Ausschaltbefehl>)

wait <Zufallszeitdauer1>, <Zufallszeitdauer2>
repeatcmd <maximale Zufallszeitdauer1 plus maximale Zufallszeitdauer2>
timerWithWait
do always


Und konkret sieht es so aus:
([18:00-23:00]) (set Dachlicht_03 on ) (set Dachlicht_03 off)

wait rand(1800),rand(1800) wartet eine zufällige Zeit bis  Befehl 1 ausgeführt wird und danach eine zufällige Zeit bis Befehl 2 ausgeführt wird.
repeatcmd 3610 wiederholt den Befehlszweig alle 1800+1800+10 Sekunden, (+10) damit die Wiederholung auf jeden Fall nach rand(1800)+rand(1800) stattfindet und immer ausgeschaltet wird,
timerWithwait
do always

rand(1200) macht das zufällige und die was macht die zweite Zahl hinter dem "+"..?
Sie verlängert die zufällige Zeit um einen  festen Wert.
ZitatDer erste Teil ist ja für den ersten DO-Fall das Einschalten der Teil nach dem Doppelpunkt für den zweiten DO-Fall, dass Ausschalten, ist das richtig..?
Ja, aber
ZitatBeispieldefinition bei mehreren DO-Blöcken mit mehreren Sequenzen:

DOIF (Bedingung1)
(set ...) ## erster Befehl der ersten Sequenz soll um eine Sekunde verzögert werden
(set ...) ## zweiter Befehl der ersten Sequenz soll um 2 Sekunden verzögert werden
DOELSE (Bedingung2)
(set ...) ## erster Befehl der zweiten Sequenz soll um 3 Sekunden verzögert werden
(set ...) ## zweiter Befehl der zweiten Sequenz soll um 0,5 Sekunden verzögert werden

attr <DOIF-modul> wait 1,2:3,0.5

Für Kommandos ohne Verzögerung werden Sekundenangaben ausgelassen oder auf Null gesetzt. Die Verzögerungen werden nur auf Events angewandt und nicht auf Zeitsteuerung. Eine bereits ausgelöste Verzögerung wird zurückgesetzt, wenn während der Wartezeit ein Kommando eines anderen DO-Falls, ausgelöst durch ein neues Ereignis, ausgeführt werden soll.

moonsorrox

OK das ist super erklärt  :) jetzt sollte es mir gelingen mein DOIF in den Griff zu kriegen..! Besser es läuft schon mal Probe.
das mit dem "repeatcmd" ist aber auch schwierig zu verstehen, ich wäre niemals auf die Idee gekommen bei Zeiten zusammen zu addieren..!  :-\ Ich dachte immer das muss jeweils einzeln hintereinander geschrieben werden.

Diese "repeatcmd" Zeiten kann ich doch nach belieben verändern ohne die "wait" Zeiten zu verändern. Wichtig hierbei ist, wenn ich erreichen möchte das das Licht ausgeht, dass die "repeatcmd" Zeiten größer sind als die "wait" Zeiten..? Richtig.?
Intel-NUC i5: FHEM-Server 6.1 :: Perl v5.18.2

Homematic: HM-USB-CFG2,HM-CFG-LAN Adapter, HM-LC-BL1-FM, HM-LC-Sw1PBU-FM, HM-LC-Sw1-PI-2, HM-WDS10-TH-O, HM-CC-TC, HM-LC-SW2-FM