FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: h3llsp4wn am 03 Januar 2017, 19:51:38

Titel: DOIF mit Zeitinterval über Mitternacht/Tageswechsel
Beitrag von: h3llsp4wn am 03 Januar 2017, 19:51:38
Hallo zusammen,

mein DOIF funktioniert irgendwie nicht. Ich hätte gerne bei Anwesenheit an Wochentagen mein Gartenlicht normal geschaltet (das funktioniert),
am Freitag und Samstag dann aber über Mitternacht - das funktioniert leider nicht - er schaltet zwar ein, aber dann um 01:00 nicht ab bzw.
erneut ein? Vom Ergebnis her sagt er dann aber er wäre in CMD4 gelandet, was aus meiner Sicht gar keinen Sinn macht?

Doalways habe ich schon ein bzw. ausgeschaltet. Da ich noch nicht der DOIF Experte bin, kann es ggf. sein, dass ich das Thema ganz
anders lösen muss?

Das ich die ORs zusammenfassen kann ist mir auch klar, aber dann lief es auch nicht, so dass ich dachte ich trenne es lieber auf.


([homeStatus] eq "home" and (([18:00-22:30|01234]) or  ([18:00-01:00|5]) or ([18:00-01:00|6])) (set Garten.Beleuchtung.01 on)
DOELSEIF (([homeStatus] eq "absent" or [homeStatus] eq "gone") and ([16:00-23:30|0123456]) (set Garten.Beleuchtung.01 on)
DOELSEIF ([homeStatus] eq "absent" or [homeStatus] eq "gone" or [homeStatus] eq "home") (set Garten.Beleuchtung.01 off)
DOELSE ()


Cheers,

h3ll
Titel: Antw:DOIF mit Zeitinterval über Mitternacht/Tageswechsel
Beitrag von: Brockmann am 04 Januar 2017, 08:47:11
Doch, das macht durchaus Sinn. Um 1:00 Uhr triggert Bedingung 1, weil das Zeitintervall endet. Also ist Bedingung 1 nicht mehr erfüllt.
Die anderen Bedingungen werden nicht geprüft, denn

Zitat von: CommandRef
Bei der Abarbeitung der Bedingungen, werden nur die Bedingungen überprüft, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten.

Also bleibt nur DOELSE (=cmd4).
Das könntest Du ggf. mit dem Attribut checkall 1 ändern.

Ich versuche solche DOIFs aber immer so zu gestalten, dass alle Einschaltbedingungen in DOIF und ggf. DOELSEIFs stehen und ansonsten in DOELSE ausgeschaltet wird. Dann brauchst Du auch kein do always usw. Das sollte in diesem Fall auch gehen:

DOIF (([homeStatus] eq "home" and (([18:00-22:30|01234]) or ([18:00-01:00|56])) or (([homeStatus] =~ "absent|gone") and ([16:00-23:30])
  (set Garten.Beleuchtung.01 on))
DOELSE
  (set Garten.Beleuchtung.01 off)

(ungtestet und ohne Gewähr)
Titel: Antw:DOIF mit Zeitinterval über Mitternacht/Tageswechsel
Beitrag von: Per am 04 Januar 2017, 10:40:36
Ist denn [18:00-01:00|56] überhaupt noch der gewünschte Tag?

Dein Trigger ist zwar zu Ende (falls oben das passt), aber was soll er denn machen? Aufgabe (Command-Teil) ist doch nur, nach dieser Zeit nicht mehr einzuschalten, das Ausschalten übernimmt er ja nicht. Dafür wäre Cmd3 zuständig. Dort steht aber nix von 01:00.
Titel: Antw:DOIF mit Zeitinterval über Mitternacht/Tageswechsel
Beitrag von: h3llsp4wn am 04 Januar 2017, 16:07:32
Danke für Eure schnelle Rückmeldung. Ich habe jetzt mal die Variante von oben produktiv gesetzt und schaue, wie es funktioniert.

Bzgl. der Ein-/Aussschaltung müsste ich dann also auch die "Auszeiten" quasi tagesfüllend beschreiben. Das wollte ich vermeiden,
da ich sonst nicht mehr die Möglichkeit habe das Licht manuell z.B. nach 1:00 noch einmal manuell zu schalten, er würde dann ja
immer wieder abschalten ... vielleicht ist mein Anwendungsfall auch nicht automatisierbar :)

Ich weiß jetzt auch gar nicht mehr so genau, ob ich die Abschaltung nicht über den Status "sleep" machen wollte und es dann eigentlich
so wie es war passt - es hatte mich halt nur irritiert, dass es unter der Woche abschaltet und am WE nicht.

Auf jeden Fall macht es für mich Sinn meine sonstigen DOIFs mal zu "vereinfachen".
Titel: Antw:DOIF mit Zeitinterval über Mitternacht/Tageswechsel
Beitrag von: Brockmann am 04 Januar 2017, 18:50:57
Zitat von: h3llsp4wn am 04 Januar 2017, 16:07:32
Bzgl. der Ein-/Aussschaltung müsste ich dann also auch die "Auszeiten" quasi tagesfüllend beschreiben. Das wollte ich vermeiden,
da ich sonst nicht mehr die Möglichkeit habe das Licht manuell z.B. nach 1:00 noch einmal manuell zu schalten, er würde dann ja
immer wieder abschalten ... vielleicht ist mein Anwendungsfall auch nicht automatisierbar :)
Nein, du definierst alle "Einzeiten" als Bedingung(en) und nur wenn keine davon erfüllt ist (DOELSE) lässt Du ausschalten.
Manuell schalten kannst Du jederzeit. Dein DOIF weiss ja nichts über den Status der Lampen (wenn Du das nicht explizit reinschreibst) und lässt sich davon nicht beeindrucken. Wenn Du nach 1 Uhr nochmal anschaltest, würde das DOIF davon gar nichts mitbekommen, also auch nicht ausschalten. Das DOIF könnte frühestens am nächsten Tag um 16:00 Uhr wieder aktiv werden (es sei denn, Du hast ein do always drin, was aber unnötig ist).

Und nochmal: ein list <Name des DOIFs> in der Zeile in FHEM eingeben und die Ausgabe hier als Code einfügen hilft uns dabei, Dein DOIF zu verstehen.
Titel: Antw:DOIF mit Zeitinterval über Mitternacht/Tageswechsel
Beitrag von: h3llsp4wn am 05 Januar 2017, 19:44:03
Danke - verstanden - ich warte jetzt noch meinen Test am Wochenende ab - noch scheint es zu passen. Ansonsten werde ich zukünftig das Device listen  :)
Titel: Antw:DOIF mit Zeitinterval über Mitternacht/Tageswechsel
Beitrag von: h3llsp4wn am 08 Januar 2017, 14:31:25
Hallo nochmal,

hatte mein DOIF wie folgt angepasst und noch ein bisschen an den Optionen für den Zeitraum gespielt (das sollte aber wohl keine Auswirkungen haben). Jedenfalls lief der DOIF so am Donnerstag, am Freitag dann mit Abschaltung am Samstag morgen (d.h. nach Mitternacht), dann aber heute (von Samstag auf Sonntag) ohne Abschaltung nach Mitternacht. Scheint als mag er irgendwie den Wechsel von 6 auf 0 nicht - jedenfall ist er da nicht in den DOELSE gelaufen um abzuschalten, d.h. wenn der Tag 0 (Sonntag also Eintritt, lässt er das Licht an, da dann der andere DOIF-Zweig zieht (|01234) und er somit zwar nicht einschaltet, aber dann auch nicht ab, richtig? Dann macht die Mitternachtsschaltung so aber auch keinen Sinn, oder? Oder ich müsste das ganze dann in zwei DOIF aufsplitten, damit der "Wochentagsrhytmus" für sich läuft und das WE ebenfalls? Liege ich da richtig?


Internals:
   DEF        ((([homeStatus] eq "home") and (([{sunset_abs(-1800,"16:30","21:30")}-([22:20]+int(rand(1200)))|01234]) or ([{sunset_abs(-1800,"16:30","21:30")}-([00:20]+int(rand(1200)))|56]))) or (([homeStatus] =~ "absent|gone") and ([{sunset((rand(900)-2700))}-([23:30]+int(rand(1200)))]))) (set Garten.Beleuchtung.01 on) DOELSE (set Garten.Beleuchtung.01 off)

   NAME       di_homeStatus_Licht
   NR         316
   NTFY_ORDER 50-di_homeStatus_Licht
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2017-01-07 16:49:42   cmd             1
     2017-01-07 16:49:42   cmd_event       timer_3
     2017-01-07 16:49:42   cmd_nr          1
     2017-01-07 16:49:42   state           cmd_1
     2017-01-07 22:36:11   timer_01_c01    08.01.2017 16:49:42|01234
     2017-01-07 22:36:11   timer_02_c01    08.01.2017 22:21:37|01234
     2017-01-08 00:31:56   timer_03_c01    08.01.2017 16:50:54|56
     2017-01-08 00:31:56   timer_04_c01    09.01.2017 00:27:05|56
     2017-01-07 23:42:03   timer_05_c01    08.01.2017 16:44:14
     2017-01-07 23:42:03   timer_06_c01    08.01.2017 23:30:58
   Condition:
     0          ((InternalDoIf($hash,'homeStatus','STATE') eq "home") and ((DOIF_time($hash,0,1,$wday,$hms,"01234")) or (DOIF_time($hash,2,3,$wday,$hms,"56")))) or ((InternalDoIf($hash,'homeStatus','STATE') =~ "absent|gone") and (DOIF_time($hash,4,5,$wday,$hms)))
   Days:
     0          01234
     1          01234
     2          56
     3          56
   Devices:
     0           homeStatus
     all         homeStatus
   Do:
     0:
       0          set Garten.Beleuchtung.01 on
     1:
       0          set Garten.Beleuchtung.01 off
   Helper:
     event      timer_6
     globalinit 1
     last_timer 6
     sleeptimer -1
     timerdev
     timerevent timer_6
     timereventsState
     triggerDev
     timerevents:
       timer_6
     triggerEvents:
       timer_6
   Internals:
     0           homeStatus:STATE
     all         homeStatus:STATE
   Interval:
     0          -1
     1          0
     2          -1
     3          2
     4          -1
     5          4
   Itimer:
   Localtime:
     0          1483890582
     1          1483910497
     2          1483890654
     3          1483918025
     4          1483890254
     5          1483914658
   Readings:
   Realtime:
     0          16:49:42
     1          22:21:37
     2          16:50:54
     3          00:27:05
     4          16:44:14
     5          23:30:58
   Regexp:
     All:
   State:
   Time:
     0          {sunset_abs(-1800,"16:30","21:30")}
     1          ([22:20]+int(rand(1200)))
     2          {sunset_abs(-1800,"16:30","21:30")}
     3          ([00:20]+int(rand(1200)))
     4          {sunset((rand(900)-2700))}
     5          ([23:30]+int(rand(1200)))
   Timecond:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   Timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   Timers:
     0           0  1  2  3  4  5
   Triggertime:
     1483890254:
       localtime  1483890254
       Hash:
     1483890582:
       localtime  1483890582
       Hash:
     1483890654:
       localtime  1483890654
       Hash:
     1483910497:
       localtime  1483910497
       Hash:
     1483914658:
       localtime  1483914658
       Hash:
     1483918025:
       localtime  1483918025
       Hash:
Attributes:
Titel: Antw:DOIF mit Zeitinterval über Mitternacht/Tageswechsel
Beitrag von: Brockmann am 09 Januar 2017, 08:50:31
Das Problem ist ein logisches: Du hast Sonntags zwei Ausschaltzeitpunkte (0:20+x Uhr und 22:20+x), dafür Freitags gar keinen (weil da ja erst am Samstag Morgen ausgeschaltet wird). Aber den zweiten Ausschaltzeitpunkt an Sonntag hast Du ja gar nicht definiert, also kann Sonntags um 0:20+x Uhr auch nichts geschaltet werden. Intervalle über Mitternacht mit Wochentagsangabe sind etwas problematisch, weil man den Wochentag nicht getrennt für Anfang und Ende festlegen kann, sondern immer nur für beides.
Titel: Antw:DOIF mit Zeitinterval über Mitternacht/Tageswechsel
Beitrag von: Per am 09 Januar 2017, 12:53:12
Da die Einschaltzeit immer bei 18 Uhr liegt, kann man zumindest hier zur Not schieben, also den Sonntag-Wert auf Montag legen.
Sind Ein- und Ausschaltzeit unterschiedlich, wird es (denke ich) kompliziert.
Titel: Antw:DOIF mit Zeitinterval über Mitternacht/Tageswechsel
Beitrag von: h3llsp4wn am 10 Januar 2017, 09:37:22
Ok, danke - dann habe ich glaube ich das Thema jetzt verstanden :)