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