FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Yil am 22 Januar 2016, 08:58:21

Titel: DOIF mit sunrise und sunset Steuerung
Beitrag von: Yil am 22 Januar 2016, 08:58:21
Hallo zusammen,

ich habe mir mal ein komplexes DOIF Statement zusammengebastelt zur Steuerung meiner Außenbeleuchtung. Diese soll morgens vor Sonnenaufgang an- und nach einer berechneten Zeitspanne wieder ausgehen - das gleiche auch Abends. Zusätzlich möchte ich morgens Werktage und Wochenenden anders behandeln.

Ergebnis: die Abendschaltung (die ohne Varianten) funktioniert immer einwandfrei. Bei der Morgensschaltung geht die Außenbeleuchtung zu einem willkürlichen Zeitpunkt aus, den ich nicht zuordnen kann. Hier brauche ich Hilfe.

Die Aufbaustruktur des Statements war zunächst wie folgt:

define di_light DOIF ([Beginn1|7] or [Beginn2|8] or [Beginn3]) (set switch on) DOELSEIF ([Ende1] or [Ende2]) (set switch off)

wobei immer gilt: Ende 1 > Beginn2 > Beginn1

Nachdem die Schaltung irgendwann zwischen Beginn1 und Ende 1 ausging, habe ich die Struktur wie folgt umgestellt:

define di_time DOIF ([[begin1]-[end1]|7]) (set switch on) DOELSEIF ([[begin2]-[end2]|8]) (set switch on) DOELSEIF ([[begin3]-[end3]]) (set switch on) DOELSE (set switch off)

LEIDER auch hier das gleiche Ergebnis: mittem im Zeitraum: ([[begin2]-[end2]|8]) schaltet die Außenbeleuchtung ab.

Hier der Code:
define SonnenSchaltung DOIF (\
      [([{sunrise("HORIZON=-1.5",0,"05:20","08:14")}]-int(rand(900))) - \
      ([{sunrise("HORIZON=-1.5",0,"05:20","08:14")}]+2700+int(rand(900)))|7])\
      (set Garten.Beleuchtung on) \
DOELSEIF (\
      [([{sunrise("HORIZON=-1.5",0,"05:20","06:30")}]+int(rand(900))) - \
  ([{sunrise("HORIZON=-1.5",0,"05:20","08:14")}]+2700+int(rand(900)))|8])\
  (set Garten.Beleuchtung on)\
DOELSEIF (\
      [({sunset("HORIZON=-3",0,"16:28","21:29")}) - \
  ([23:45]+int(rand(900)))]) \
  (set Garten.Beleuchtung on) \
DOELSE (set Garten.Beleuchtung off)
attr SonnenSchaltung do always
attr SonnenSchaltung group Schaltzeitpunkte
attr SonnenSchaltung initialize cmd_1
attr SonnenSchaltung room Garten


Und hier das Listing:
Internals:
DEF        ([([{sunrise("HORIZON=-1.5",0,"05:20","08:14")}]-int(rand(900))) - \
      ([{sunrise("HORIZON=-1.5",0,"05:20","08:14")}]+2700+int(rand(900)))|7])\
      (set Garten.Beleuchtung on) \
DOELSEIF (\
      [([{sunrise("HORIZON=-1.5",0,"05:20","06:30")}]+int(rand(900))) - \
  ([{sunrise("HORIZON=-1.5",0,"05:20","08:14")}]+2700+int(rand(900)))|8])\
  (set Garten.Beleuchtung on)\
DOELSEIF (\
      [({sunset("HORIZON=-3",0,"16:28","21:29")}) - \
  ([23:45]+int(rand(900)))]) \
  (set Garten.Beleuchtung on) \
DOELSE (set Garten.Beleuchtung off)
   NAME       SonnenSchaltung
   NR         213
   NTFY_ORDER 50-SonnenSchaltung
   STATE      cmd_4
   TYPE       DOIF
   Readings:
     2016-01-22 07:58:59   cmd_event       timer_1
     2016-01-22 07:58:59   cmd_nr          4
     2016-01-22 07:58:59   state           cmd_4
     2016-01-22 07:58:59   timer_1_c1      23.01.2016 07:48:02|7
     2016-01-21 17:14:53   timer_2_c1      22.01.2016 08:57:44|7
     2016-01-22 06:32:32   timer_3_c2      23.01.2016 06:39:55|8
     2016-01-21 17:14:53   timer_4_c2      22.01.2016 08:45:31|8
     2016-01-21 17:19:08   timer_5_c3      22.01.2016 17:20:36
     2016-01-21 23:48:55   timer_6_c3      22.01.2016 23:46:09
   Condition:
     0          DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"7")
     1          DOIF_time($hash,$hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"8")
     2          DOIF_time($hash,$hash->{realtime}{4},$hash->{realtime}{5},$wday,$hms,"")
   Days:
     0          7
     1          7
     2          8
     3          8
   Devices:
   Do:
     0:
       0          set Garten.Beleuchtung on
     1:
       0          set Garten.Beleuchtung on
     2:
       0          set Garten.Beleuchtung on
     3:
       0          set Garten.Beleuchtung off
   Helper:
     globalinit 1
     last_timer 6
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
   Realtime:
     0          07:48:02
     1          08:57:44
     2          06:39:55
     3          08:45:31
     4          17:20:36
     5          23:46:09
   State:
   Time:
     0          ([{sunrise("HORIZON=-1.5",0,"05:20","08:14")}]-int(rand(900)))
     1          ([{sunrise("HORIZON=-1.5",0,"05:20","08:14")}]+2700+int(rand(900)))
     2          ([{sunrise("HORIZON=-1.5",0,"05:20","06:30")}]+int(rand(900)))
     3          ([{sunrise("HORIZON=-1.5",0,"05:20","08:14")}]+2700+int(rand(900)))
     4          ({sunset("HORIZON=-3",0,"16:28","21:29")})
     5          ([23:45]+int(rand(900)))
   Timecond:
     0          0
     1          0
     2          1
     3          1
     4          2
     5          2
   Timer:
     0          0
     1          0
     2          0
     3          0
     4          0
     5          0
   Timerfunc:
   Timers:
     0           0  1
     1           2  3
     2           4  5
Attributes:
   do         always
   group      Schaltzeitpunkte
   initialize cmd_1
   room       Garten


Wie man gut sehen kann, sollte (soweit mein Verständnis) nun eigentlich das Licht bis zum timer_4_c2 angeschaltet sein - faktisch ging es aber schon um kurz vor 8 Uhr aus. Im Logfile finde ich folgenden Eintrag:

2016.01.22 07:58:59 3: CUL_HM set Garten.Beleuchtung off

Da ich mich selbst noch zu den Anfängern zähle, vermute ich, dass ich irgendetwas übersehen habe und bitte hier um Hilfe.

Viele Grüße Yil
Titel: Antw:DOIF mit sunrise und sunset Steuerung
Beitrag von: Damian am 22 Januar 2016, 09:24:13
Zitat von: Yil am 22 Januar 2016, 08:58:21
Hallo zusammen,

ich habe mir mal ein komplexes DOIF Statement zusammengebastelt zur Steuerung meiner Außenbeleuchtung. Diese soll morgens vor Sonnenaufgang an- und nach einer berechneten Zeitspanne wieder ausgehen - das gleiche auch Abends. Zusätzlich möchte ich morgens Werktage und Wochenenden anders behandeln.

Ergebnis: die Abendschaltung (die ohne Varianten) funktioniert immer einwandfrei. Bei der Morgensschaltung geht die Außenbeleuchtung zu einem willkürlichen Zeitpunkt aus, den ich nicht zuordnen kann. Hier brauche ich Hilfe.

Die Aufbaustruktur des Statements war zunächst wie folgt:

define di_light DOIF ([Beginn1|7] or [Beginn2|8] or [Beginn3]) (set switch on) DOELSEIF ([Ende1] or [Ende2]) (set switch off)

wobei immer gilt: Ende 1 > Beginn2 > Beginn1

Nachdem die Schaltung irgendwann zwischen Beginn1 und Ende 1 ausging, habe ich die Struktur wie folgt umgestellt:

define di_time DOIF ([[begin1]-[end1]|7]) (set switch on) DOELSEIF ([[begin2]-[end2]|8]) (set switch on) DOELSEIF ([[begin3]-[end3]]) (set switch on) DOELSE (set switch off)

LEIDER auch hier das gleiche Ergebnis: mittem im Zeitraum: ([[begin2]-[end2]|8]) schaltet die Außenbeleuchtung ab.


Das Problem ist, dass immerwieder Timer zuschlagen, wo die Bedinung nicht wahr ist und dann kommt immer der DOELSE-Fall.

Im Grunde genommen hast du nur zwei Zustände "Lampe on" und "Lampe off", daher solltest du mit einem DOIF für "on" und einem DOELSEIF-Fall für "off" auskommen.

Dann würde ich hier nicht mit Intervallen arbeiten, sondern einfach mit Einschalt- bzw. Ausschaltzeitpunkten, bei dir dann:

DOIF ([({sunrise("HORIZON=-1.5",0,"05:20","08:14")}]-int(rand(900))] or ....[<möglicher Einschaltzeitpunkt 2>])
DOELSEIF ([<möglicher Ausschaltzeitpunkt1>] or [<möglicher Ausschaltzeitpunkt2>]


Gruß

Damian
Titel: Antw:DOIF mit sunrise und sunset Steuerung
Beitrag von: Yil am 22 Januar 2016, 09:53:23
Ok, das kann ich nachvollziehen.

Aber: mein erstes Statement lautete so (das meintest Du doch, oder?) - aber auch das ging morgens willkürlich aus:

define SonnenSchaltung DOIF ([([{sunrise("HORIZON=-1.0",0,"05:20","06:30")}]+int(rand(900)))|8] \
or [{sunrise("HORIZON=-1.0",0,"05:20","08:14")}|7] \
or [{sunset("HORIZON=-2",0,"16:28","21:29")}]) \
(set Garten.Beleuchtung on) \
DOELSEIF \
([([{sunrise("HORIZON=-1.0",0,"05:20","08:14")}]+2700+int(rand(900)))] \
or [([23:45]+int(rand(900)))]) \
(set Garten.Beleuchtung off)


VG Yil

Nachtrag:
ZitatDas Problem ist, dass immerwieder Timer zuschlagen, wo die Bedinung nicht wahr ist und dann kommt immer der DOELSE-Fall.

Wie kommt es eigentlich zu solchen Timern, wer/was löst sie aus - und kann man sie irgendwie abfangen?
Titel: Antw:DOIF mit sunrise und sunset Steuerung
Beitrag von: Damian am 22 Januar 2016, 10:39:56
Zitat von: Yil am 22 Januar 2016, 09:53:23
Ok, das kann ich nachvollziehen.

Aber: mein erstes Statement lautete so (das meintest Du doch, oder?) - aber auch das ging morgens willkürlich aus:

define SonnenSchaltung DOIF ([([{sunrise("HORIZON=-1.0",0,"05:20","06:30")}]+int(rand(900)))|8] \
or [{sunrise("HORIZON=-1.0",0,"05:20","08:14")}|7] \
or [{sunset("HORIZON=-2",0,"16:28","21:29")}]) \
(set Garten.Beleuchtung on) \
DOELSEIF \
([([{sunrise("HORIZON=-1.0",0,"05:20","08:14")}]+2700+int(rand(900)))] \
or [([23:45]+int(rand(900)))]) \
(set Garten.Beleuchtung off)


VG Yil

Nachtrag:
Wie kommt es eigentlich zu solchen Timern, wer/was löst sie aus - und kann man sie irgendwie abfangen?

Die Willkür hast du selbst durch den Zufall eingebaut und die Timer triggern immer nur dann, so wie sie definiert sind.

Bei Intervallen wird immer am Anfang und am Ende des Intervall getriggert siehe Commandref zu DOIF.

Gruß

Damian

Titel: Antw:DOIF mit sunrise und sunset Steuerung
Beitrag von: Yil am 22 Januar 2016, 11:11:52
Ich fürchte, da habe ich mich missverständlich ausgedrückt. Natürlich will ich den Zufall eingebaut haben, so dass sich die Zeiten jedesmal ändern. Was mich wundert ist, dass nach einer Ausführung des Statements im Listing Werte angezeigt werden, zu denen getriggert wird (so will ich's ja auch haben):

     2016-01-22 07:58:59   timer_1_c1      23.01.2016 07:48:02|7
     2016-01-21 17:14:53   timer_2_c1      22.01.2016 08:57:44|7
     2016-01-22 06:32:32   timer_3_c2      23.01.2016 06:39:55|8
     2016-01-21 17:14:53   timer_4_c2      22.01.2016 08:45:31|8
     2016-01-21 17:19:08   timer_5_c3      22.01.2016 17:20:36
     2016-01-21 23:48:55   timer_6_c3      22.01.2016 23:46:09


Aber dann schaltet irgendein Trigger den Device um 7:58 einfach ab (siehe Log):

2016.01.22 07:58:59 3: CUL_HM set Garten.Beleuchtung off

WIESO? Und das war auch mit der von Dir empfohlenen Variante (1x DOIF, 1x DOELSEIF) so. Passt diese erste Definition eigentlich so (ich habe nämlich keine ELSE definiert)?

VG Yil
Titel: Antw:DOIF mit sunrise und sunset Steuerung
Beitrag von: Damian am 22 Januar 2016, 11:57:32
Zitat von: Yil am 22 Januar 2016, 11:11:52
Ich fürchte, da habe ich mich missverständlich ausgedrückt. Natürlich will ich den Zufall eingebaut haben, so dass sich die Zeiten jedesmal ändern. Was mich wundert ist, dass nach einer Ausführung des Statements im Listing Werte angezeigt werden, zu denen getriggert wird (so will ich's ja auch haben):

     2016-01-22 07:58:59   timer_1_c1      23.01.2016 07:48:02|7
     2016-01-21 17:14:53   timer_2_c1      22.01.2016 08:57:44|7
     2016-01-22 06:32:32   timer_3_c2      23.01.2016 06:39:55|8
     2016-01-21 17:14:53   timer_4_c2      22.01.2016 08:45:31|8
     2016-01-21 17:19:08   timer_5_c3      22.01.2016 17:20:36
     2016-01-21 23:48:55   timer_6_c3      22.01.2016 23:46:09


Aber dann schaltet irgendein Trigger den Device um 7:58 einfach ab (siehe Log):

2016.01.22 07:58:59 3: CUL_HM set Garten.Beleuchtung off

WIESO? Und das war auch mit der von Dir empfohlenen Variante (1x DOIF, 1x DOELSEIF) so. Passt diese erste Definition eigentlich so (ich habe nämlich keine ELSE definiert)?

VG Yil

Das kann aber nicht von meiner Variante sein, die habe ich erst heute um 9:24 gepostet. Es hat mit dem DOELSE-Fall der Intervalle zu tun.

Gruß

Damian
Titel: Antw:DOIF mit sunrise und sunset Steuerung
Beitrag von: Yil am 23 Januar 2016, 13:51:32
Gibt's eine Idee, wie ich der DOELSE-Fall dieser Intervalle entkomme - kann ggf. eines der Attribute von DOIF helfen? Oder müsste das DOIF Statement komplett umgeschrieben werden?

Heute ist es schon wieder passiert, dass es zu Triggern kam, die die Beleuchtung durch den DOELSE-Fall ausgeschaltet haben, obwohl es der Zeitraum der vorangegangenen IF-Statements noch nicht vorbei war.

VG Yil

Titel: Antw:DOIF mit sunrise und sunset Steuerung
Beitrag von: l2r am 27 Januar 2016, 11:10:11
hi,

kleiner Vorschlag um herauszufinden was deinen Trigger auslöst:

nutze mal die DOIF-Version von hier: http://forum.fhem.de/index.php/topic,46327.0.html (http://forum.fhem.de/index.php/topic,46327.0.html)
und schreib dann für den DOELSE-Fall mal ein Log weg, wo $DEVICE und $EVENT enthalten sind.


ich vermute, dass irgendetwas um 7:58 triggert, was in deinem DOIF nicht vorkommt und somit der DOELSE-Fall wahr wird.
Dieses Verhalten habe ich bei mir auch schon das ein oder andere mal beobachtet, dass auf einmal im Log DEVICES aufgetaucht sind, die mit dem DOIF überhaupt nix zutun haben.

Die andere Frage ist, ob das von Damian so gewollt ist, oder ob das Modul ggf. so angepasst werden sollte, dass sich der DOELSE-Fall nur auf Devices beziehen kann, die auch irgendwo im DOIF vorkommen.

Gruß Michael
Titel: Antw:DOIF mit sunrise und sunset Steuerung
Beitrag von: Yil am 28 Januar 2016, 17:49:30
DAS ist ne gute Spur - danke schon mal im voraus!

Hier die (etwas wilden) Schaltereignisse aus dem Log der letzten 3 Tage:

2016.01.26 06:31:26 3: CUL_HM set Garten.Beleuchtung on
2016.01.26 06:31:42 3: CUL_HM set Garten.Beleuchtung off
2016.01.26 07:51:29 3: CUL_HM set Garten.Beleuchtung off
2016.01.26 08:44:19 3: CUL_HM set Garten.Beleuchtung off
2016.01.26 17:26:37 3: CUL_HM set Garten.Beleuchtung on
2016.01.26 23:52:18 3: CUL_HM set Garten.Beleuchtung off
2016.01.26 23:59:02 3: CUL_HM set Garten.Beleuchtung off

2016.01.27 06:35:55 3: CUL_HM set Garten.Beleuchtung on
2016.01.27 07:49:08 3: CUL_HM set Garten.Beleuchtung off
2016.01.27 17:28:09 3: CUL_HM set Garten.Beleuchtung on
2016.01.27 23:49:43 3: CUL_HM set Garten.Beleuchtung off
2016.01.27 23:53:06 3: CUL_HM set Garten.Beleuchtung off
2016.01.27 23:54:43 3: CUL_HM set Garten.Beleuchtung off

2016.01.28 06:41:59 3: CUL_HM set Garten.Beleuchtung on
2016.01.28 07:38:41 3: CUL_HM set Garten.Beleuchtung off
2016.01.28 07:46:10 3: CUL_HM set Garten.Beleuchtung off
2016.01.28 07:51:50 3: CUL_HM set Garten.Beleuchtung off
2016.01.28 08:39:20 3: CUL_HM set Garten.Beleuchtung off
2016.01.28 08:50:30 3: CUL_HM set Garten.Beleuchtung off


Also, da ist irgend etwas, was hier noch triggert. Zusätzlich habe ich einen Haufen status requests um die Einschaltzeiten und währenddessen - während in der Zeit von 9-17h und Nachts praktisch keine status requests gesendet werden.

Im Codieren bin ich noch nicht so erfahren. Wie würde denn eine entsprechende Logzeile aussehen mit $DEVICE und $EVENT? So:

{Log 3, "Trigger zum $EVENT kommt von: $DEVICE"}

VG Yil
Titel: Antw:DOIF mit sunrise und sunset Steuerung
Beitrag von: Heimbastler am 18 Dezember 2016, 21:17:59
Hi Yil,

kannst Du ausschliessen das Du das DOIF via copy von einem Vorgänger bezogen hast?
Ich hatte so etwas Ähnliches auch schon mal. Obwohl ich alle associated devices x mal gecheckt hatte und nichts verlinkt sein sollte war eine Abhängigkeit über andere Devices zu erkennen. Erst die Neuerstellung des DOIF hat Abhilfe gebracht.

VG
Alex
Titel: Antw:DOIF mit sunrise und sunset Steuerung
Beitrag von: Yil am 20 Dezember 2016, 08:18:28
Hallo Heimbastler,

das ist ja schon ewig her. Das DOIF hatte ich mir selbst zusammen gebaut, alles meins, inkl. aller Fehler. Ich hatte es zwischenzeitlich so umgebaut, dass ich vor einem Schaltbefehl einen Filter eingebaut habe, damit hatte ich Ruhe:

set Garten.Beleuchtung:FILTER=STATE!=on on

Was ich jetzt noch habe, ist eine Bsonderheit beim DOIF, der mit Zufallszeiten nicht so umgeht, wie ich es gerne hätte. Er schaltet bei diesen Zufallszeiten auch dann, wenn der Wochentag gar nicht zutrifft. Hier überlege ich noch, diese Zufallsvariablen einmal am Tag in ein Dummy wegzuschreiben und von dort aufzurufen. Mal sehen.