Hallo, ich fahre seit Monaten meine Jalousien relativ sorglos auf Basis eines Helligkeits-Mittelwerts (du_brightness) mit einem DOIF hoch und runter. Doch jetzt kommt der Frühling und die Jalousien würden einfach zu spät runterfahren. Also ging ich ganz naiv davon aus, dass ich einfach zwei Uhrzeiten im OR-Teil ergänze, um ein "aber spätestens um... runterfahren" zu realisieren. Dies wäre grundsätzlich auch kein Problem, wenn die "wait"-Zyklen nicht durch das zyklisch getriggerte "du_brightness" durcheinander gebracht werden würden. Vorherige Versuche mit "waitsame" musste ich wieder entfernen, da ich bei der Uhrzeit tricksen musste, um eine Wiederholung zu erzwingen. Und das Ergebnis war das gleiche.
Beschreibung:
- Wenn du_brightness unter 155 aber über 135 liegt, dann sollen die Jalousien auf halbe Stufe fahren. (cmd2_x)
- Aber spätestens um 20:15 (auch: cmd2_x)
- Sinkt du_brightness unter 135, so dürfen die Jalousien vollständig geschlossen werden (cmd3_x)
- Aber spätestens um 20:45 (auch: cmd3_x)
- In allen Fällen wird ein (Random-)Wait genutzt, um Schwankungen auszugleichen.
Befindet sich das DOIF um 20:45 Uhr nun im cmd3_x-Teil, so wird ca. 5-6 Minuten gewartet. Diese Wait ist normalerweise dafür zuständig, Schwankungen auszugleichen. Doch bei einer Uhrzeit wird dies ja eigentlich nicht benötigt, aber dennoch beachtet. Ändert sich nun in diesem Wait-Zeitraum der Helligkeitswert, so springt das DOIF wieder zurück zu cmd2_x. Die Jalousien fahren also nicht um 20:45 Uhr + x min herunter, da der Wait-Zyklus durchs Triggern von du_brightness gestört wird.
Hat jemand einen Tipp, wie man das umgehen kann?
Ich nutze die DOIF-Beta-Version aus dem "Ostern 2016-Thread" und habe es auch schon mit $SELF versucht, um Rücksprünge zu verhindern. Klappt leider nicht.
DOIF:
Internals:
DEF
(
## CMD1 kann ignoriert werden. Hier wird nur geöffnet.
[[auto_jal_time_workday]|8] or [[auto_jal_time_weekend]|7])
(
set jal1 100
)
(
set jal2 100
)
(
set jal3 100
)
DOELSEIF
(
(
## du_jal_bright_halb = 155 (Helligkeitsschwelle: Jal. auf halbe Höhe)
## du_jal_bright_runter = 135 (Helligkeitsschwelle: Jal. ganz schließen)
[du_brightness:average] < [?du_jal_bright_halb] and
[du_brightness:average] > [?du_jal_bright_runter] and
[?[twilight:ss_indoor]-23:59] and
[$SELF:cmd_nr] != 3
)
or
(
## Spätestens um 20:15 auf halbe Höhe
[[du_jal_time_halb]]
)
)
(
set jal1 50
)
(
set jal2 50,
set jal3 50
)
DOELSEIF
(
(
## du_jal_bright_runter = 135 (Helligkeitsschwelle: Jal. ganz schließen)
[du_brightness:average] < [?du_jal_bright_runter] and
[?[twilight:ss_indoor]-23:59]
)
or
(
## Spätestens um 20:45 ganz schließen
[[du_jal_time_runter]]
)
)
(
set jal1 0
)
(
set jal2 0
)
(
set jal3 0
)
NAME di_jalousien
NR 384
NTFY_ORDER 50-di_jalousien
STATE cmd_1
TYPE DOIF
Readings:
2016-04-25 09:29:54 Device du_brightness
2016-04-25 08:07:59 cmd 1.3
2016-04-25 08:07:59 cmd_event timer_1
2016-04-25 08:07:59 cmd_nr 1
2016-04-25 08:07:59 cmd_seqnr 3
2016-04-25 09:29:54 e_du_brightness_average 228
2016-04-25 08:07:59 state cmd_1
2016-04-25 09:30:32 timer_1_c1 26.04.2016 08:00:00|8
2016-04-25 09:30:32 timer_2_c1 26.04.2016 08:30:00|7
2016-04-25 09:30:32 timer_3_c2 25.04.2016 20:01:21
2016-04-25 09:30:32 timer_4_c2 25.04.2016 23:59:00
2016-04-25 09:30:32 timer_5_c2 25.04.2016 20:15:00
2016-04-25 09:30:32 timer_6_c3 25.04.2016 20:01:21
2016-04-25 09:30:32 timer_7_c3 25.04.2016 23:59:00
2016-04-25 09:30:32 timer_8_c3 25.04.2016 20:45:00
2016-04-25 09:30:16 wait_timer no timer
Condition:
0 DOIF_time_once($hash,$hash->{timer}{0},$wday,"8") or DOIF_time_once($hash,$hash->{timer}{1},$wday,"7")
1 ( ReadingValDoIf($hash,'du_brightness','average','','',AttrVal($hash->{NAME},'notexist',undef)) < InternalDoIf($hash,'du_jal_bright_halb','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) and ReadingValDoIf($hash,'du_brightness','average','','',AttrVal($hash->{NAME},'notexist',undef)) > InternalDoIf($hash,'du_jal_bright_runter','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) and DOIF_time($hash,$hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"") and ReadingValDoIf($hash,'di_jalousien','cmd_nr','','',AttrVal($hash->{NAME},'notexist',undef)) != 3 ) or ( DOIF_time_once($hash,$hash->{timer}{4},$wday,"") )
2 ( ReadingValDoIf($hash,'du_brightness','average','','',AttrVal($hash->{NAME},'notexist',undef)) < InternalDoIf($hash,'du_jal_bright_runter','STATE','','',AttrVal($hash->{NAME},'notexist',undef)) and DOIF_time($hash,$hash->{realtime}{5},$hash->{realtime}{6},$wday,$hms,"") ) or ( DOIF_time_once($hash,$hash->{timer}{7},$wday,"") )
Days:
0 8
1 7
Devices:
1 du_brightness di_jalousien
2 du_brightness
all du_brightness di_jalousien
Do:
0:
0 (siehe oben)
1 (siehe oben)
2 (siehe oben)
1:
0 (siehe oben)
1 (siehe oben)
2:
0 (siehe oben)
1 (siehe oben)
2 (siehe oben)
Helper:
globalinit 1
last_timer 8
sleeptimer -1
Internals:
1 du_jal_bright_halb:STATE du_jal_bright_runter:STATE
2 du_jal_bright_runter:STATE
all du_jal_bright_halb:STATE du_jal_bright_runter:STATE
Interval:
2 -1
3 2
5 -1
6 5
Itimer:
all auto_jal_time_workday auto_jal_time_weekend twilight du_jal_time_halb du_jal_time_runter
Localtime:
0 1461650400
1 1461652200
2 1461607281
3 1461621540
4 1461608100
5 1461607281
6 1461621540
7 1461609900
Readings:
1 du_brightness:average di_jalousien:cmd_nr
2 du_brightness:average
all du_brightness:average di_jalousien:cmd_nr
Realtime:
0 08:00:00
1 08:30:00
2 20:01:21
3 23:59:00
4 20:15:00
5 20:01:21
6 23:59:00
7 20:45:00
Regexp:
All:
State:
Time:
0 [auto_jal_time_workday]
1 [auto_jal_time_weekend]
2 [twilight:ss_indoor]
3 23:59:00
4 [du_jal_time_halb]
5 [twilight:ss_indoor]
6 23:59:00
7 [du_jal_time_runter]
Timecond:
0 0
1 0
2 1
3 1
4 1
5 2
6 2
7 2
Timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
Timers:
0 0 1 0 1
1 4 4
2 7 7
Triggertime:
1461607281:
localtime 1461607281
Hash:
1461608100:
localtime 1461608100
Hash:
1461609900:
localtime 1461609900
Hash:
1461621540:
localtime 1461621540
Hash:
1461650400:
localtime 1461650400
Hash:
1461652200:
localtime 1461652200
Hash:
Attributes:
checkReadingEvent 1
notexist 0
timerWithWait 1
wait rand(300),rand(180),rand(180):360,rand(180):360,rand(180),rand(180)
widgetOverride wait:textField-long
Log:
2016-04-24_20:15:00 di_jalousien wait_timer: 24.04.2016 20:21:00 cmd_2_1 timer_5
2016-04-24_20:21:00 di_jalousien wait_timer: no timer
2016-04-24_20:21:00 di_jalousien cmd_nr: 2
2016-04-24_20:21:00 di_jalousien cmd_seqnr: 1
2016-04-24_20:21:00 di_jalousien cmd: 2.1
2016-04-24_20:21:00 di_jalousien cmd_event: timer_5
2016-04-24_20:21:00 di_jalousien cmd_2_1
2016-04-24_20:21:00 di_jalousien wait_timer: 24.04.2016 20:23:06 cmd_2_2 timer_5
2016-04-24_20:23:06 di_jalousien wait_timer: no timer
2016-04-24_20:23:06 di_jalousien cmd_nr: 2
2016-04-24_20:23:06 di_jalousien cmd_seqnr: 2
2016-04-24_20:23:06 di_jalousien cmd: 2.2
2016-04-24_20:23:06 di_jalousien cmd_event: timer_5
2016-04-24_20:23:06 di_jalousien cmd_2
2016-04-24_20:45:00 di_jalousien wait_timer: 24.04.2016 20:51:00 cmd_3_1 timer_8
2016-04-24_20:47:53 di_jalousien wait_timer: no timer
2016-04-24_20:59:52 di_jalousien wait_timer: 24.04.2016 21:05:52 cmd_3_1 du_brightness
2016-04-24_21:05:52 di_jalousien wait_timer: no timer
2016-04-24_21:05:53 di_jalousien cmd_nr: 3
2016-04-24_21:05:53 di_jalousien cmd_seqnr: 1
2016-04-24_21:05:53 di_jalousien cmd: 3.1
2016-04-24_21:05:53 di_jalousien cmd_event: du_brightness
2016-04-24_21:05:53 di_jalousien cmd_3_1
2016-04-24_21:05:53 di_jalousien wait_timer: 24.04.2016 21:06:57 cmd_3_2 du_brightness
2016-04-24_21:06:57 di_jalousien wait_timer: no timer
2016-04-24_21:06:58 di_jalousien cmd_nr: 3
2016-04-24_21:06:58 di_jalousien cmd_seqnr: 2
2016-04-24_21:06:58 di_jalousien cmd: 3.2
2016-04-24_21:06:58 di_jalousien cmd_event: du_brightness
2016-04-24_21:06:58 di_jalousien cmd_3_2
2016-04-24_21:06:58 di_jalousien wait_timer: 24.04.2016 21:07:19 cmd_3_3 du_brightness
2016-04-24_21:07:19 di_jalousien wait_timer: no timer
2016-04-24_21:07:19 di_jalousien cmd_nr: 3
2016-04-24_21:07:19 di_jalousien cmd_seqnr: 3
2016-04-24_21:07:19 di_jalousien cmd: 3.3
2016-04-24_21:07:19 di_jalousien cmd_event: du_brightness
2016-04-24_21:07:19 di_jalousien cmd_3
Ich hatte es zwischendurch auch einmal in der folgenden, viel einfacheren Form ausprobiert:
(
[[twilight:ss_indoor]-[du_jal_time_halb]] and
[du_brightness:average] < [?du_jal_bright_halb] and
[du_brightness:average] > [?du_jal_bright_runter]
)
Hier habe ich nur das Problem, dass die Jalousien nur gefahren werden, wenn die Helligkeitswerte IM o.a. Zeitraum zutreffen. Ich will aber ein DAVOR und DANACH (also ein OR) auch ermöglichen.
Versuch mal den Bedingungszweig 2 mit and [?$SELF] !~ "cmd_3|cmd_2"
zu ergänzen.
Du willst also, dass cmd2 nur dann ausgeführt wird, wenn das DOIF (noch) bei cmd1 steht, oder?
Ich hatte es ja genau umgekehrt ausprobiert. cmd2 soll nicht ausgeführt werden, wenn das DOIF bereits bei cmd3 steht.
Das Problem bei meiner Variante war, dass die cmd-Readings erst nach dem Ablauf des Wait-Timers geschrieben werden.
Demnach ist deine Variante besser. Danke für den Tipp.
Ich probiere heute abend aber erst noch einmal eine andere Variante aus, indem ich der Helligkeitsüberprüfung in cmd2 auch ein Zeitfenster mitliefere. Mal schauen, wie das funktioniert.
cmd2:
DOELSEIF
(
(
[du_brightness:average] < [?du_jal_bright_halb] and
[du_brightness:average] > [?du_jal_bright_runter] and
## nicht zu früh und auch nicht, wenn cmd3 bereits übernehmen sollte
[[twilight:ss_indoor]-[du_jal_time_runter]]
)
or
(
## spätestens um 20:15 Uhr
[[du_jal_time_halb]]
)
)
cmd3:
DOELSEIF
(
(
[du_brightness:average] < [?du_jal_bright_runter] and
## nicht zu früh. du_jal_time_runter ist hier eigentlich unnötig.
[[twilight:ss_indoor]-[du_jal_time_runter]]
)
or
(
## spätestens um 20:45 Uhr
[[du_jal_time_runter]]
)
)
Eine andere Möglichkeit ist es vielleicht, die von Twilight mit gelieferte Funktion twilight($twilight, $reading, $min, $max)
zu nutzen, die soll wie sunrise/sunset arbeiten.
Zitat von: Ellert am 25 April 2016, 18:47:22
Eine andere Möglichkeit ist es vielleicht, die von Twilight mit gelieferte Funktion twilight($twilight, $reading, $min, $max)
zu nutzen, die soll wie sunrise/sunset arbeiten.
Das hat aber den Nachteil, dass ich a) auf Twilight abgewiesen bin. Das hatte ich früher und hatte mir gar nicht gefallen. Vor allem habe ich ne Menge BM, die mir einen echten Helligkeitswert liefern.
Und b) werden die Parameter in der Perl-Funktion nicht permanent aktualisiert bzw. triggert nicht.
Ggf. lässt sich das Problem auch (besser?) mit einer anderen Hardware zur Erfassung des Lichtes lösen. Ich steuere meine Rolläden u.a. mit Werten, von einem Homematic HM-Sen-LI-O. Bei Werten >90.000 scheint immer die Sonne, bei Werten <20.000 nie.
Der Vorteil des HM-Sen-LI-O gegenüber den anderen Homematic Lichtsensoren ist, der extrem hohe Messbereich, dadurch spart man sich die Bastellösung mit der Temperaturdifferenzmessung, die bisher als das zuverlässigste Kriterium zur Erfassung von Sonnenschein galt.
Das Ganze lohnt natürlich nur, wenn du schon Homematik im Einsatz hast, was ich aus deinem Beitrag und deiner Fußzeile nicht erkennen konnte.
VG Stefan
Es geht hier ja nicht um den Sonnenschutz/Beschattung, sondern um das normale Hoch-'und Runterfahren. Ich weiß anhand meines Dummys definitiv, ob es mir zu dunkel wird. Dieser Dummy beinhaltet Mittelwerte diverser HM-Bewegungsmelder rund um das Haus. Notfalls könnte ich auch noch Z-Wave Sensoren aufnehmen. Die haben nämlich andere Kurven.
Die Brightness-Werte wie auch die Zeiten sind hier gar nicht wichtig. Sondern die Logik, dass der eine cmd-Teil nicht den nächsten aushebelt. :-)
Zitat von: StefanD am 11 Juni 2016, 13:41:35
Ggf. lässt sich das Problem auch (besser?) mit einer anderen Hardware zur Erfassung des Lichtes lösen. Ich steuere meine Rolläden u.a. mit Werten, von einem Homematic HM-Sen-LI-O. Bei Werten >90.000 scheint immer die Sonne, bei Werten <20.000 nie.
Der Vorteil des HM-Sen-LI-O gegenüber den anderen Homematic Lichtsensoren ist, der extrem hohe Messbereich, dadurch spart man sich die Bastellösung mit der Temperaturdifferenzmessung, die bisher als das zuverlässigste Kriterium zur Erfassung von Sonnenschein galt.
Das Ganze lohnt natürlich nur, wenn du schon Homematik im Einsatz hast, was ich aus deinem Beitrag und deiner Fußzeile nicht erkennen konnte.
VG Stefan
Moin
Kannst Du hier einmal Posten, wie du den Sensor eingebunden hast?
Ich habe das Problem, dass ich ihn zwar in FHEM anlernen kann, aber wie komme ich an die readings um dann mit notify (?) Aktionen auszulösen, sprich meine Rolläden in bestimmte Positionen zu fahren?
Bin noch relativ dummer Anfänger, danke für jede Hilfe
Zitat von: Garbsen am 21 Juli 2016, 11:45:31
Moin
Kannst Du hier einmal Posten, wie du den Sensor eingebunden hast?
Ich habe das Problem, dass ich ihn zwar in FHEM anlernen kann, aber wie komme ich an die readings um dann mit notify (?) Aktionen auszulösen, sprich meine Rolläden in bestimmte Positionen zu fahren?
Bin noch relativ dummer Anfänger, danke für jede Hilfe
Sorry, war einige Zeit nicht hier - FHEM hat aktuell keine Priorität.
Hier der Inhalt meines DOIFs:
(([{sunset()}-{sunrise()}]) and [os_Lichtsensor:brightness])
( set dmy_eg_wz_SetRolloSued off )
DOELSEIF (([17:00-{sunrise()}]) and [os_Lichtsensor:brightness:d] <= 120)
( set dmy_eg_wz_SetRolloSued off )
DOELSEIF ([07:30-19:00] and [eg_wz_Thermostat_Weather:temperature:d] > 23 and
[os_Aussenthermometer:temperature:d] >= 30 and
[os_Lichtsensor:brightness] and
([doif_Beschattung:cmd:d] >= 3 or [doif_Beschattung] =~ "initialize"))
( set dmy_eg_wz_SetRolloSued 50 )
DOELSEIF ([os_Twilight:azimuth:d] > 70 and
[os_Twilight:azimuth:d] < 250 and
[eg_wz_Thermostat_Weather:temperature:d] >= 22 and
(([os_Lichtsensor:brightness:d] >= 75000 and
([dmy_eg_wz_SetRolloSued:state:d] > 50 or
[dmy_eg_wz_SetRolloSued] eq "on")) or
([os_Lichtsensor:brightness:d] >= 20000 and
[dmy_eg_wz_SetRolloSued:state:d] == 50)) and
([doif_Beschattung:cmd:d] >= 3 or
[doif_Beschattung] =~ "initialize"))
( set dmy_eg_wz_SetRolloSued 50 )
DOELSEIF ([os_Twilight:azimuth:d] >= 250 and
[os_Lichtsensor:brightness:d] >= 700 and
[os_Aussenthermometer:temperature:d] < 30 and
[dmy_eg_wz_SetRolloSued] ne "on")
( set dmy_eg_wz_SetRolloSued on )
DOELSEIF (([06:00-20:00|8] or [07:00-21:30|7]) and
[os_Lichtsensor:brightness:d] >= 700 and
[os_Lichtsensor:brightness:d] < 20000 and
[os_Aussenthermometer:temperature:d] < ([eg_wz_Thermostat_Weather:temperature:d]+3))
( set dmy_eg_wz_SetRolloSued on )
DOELSEIF (([05:30-09:30|8] or [07:00-09:30|7]) and
[os_Lichtsensor:brightness:d] >= 700)
( set dmy_eg_wz_SetRolloSued on )
Um dem Ganzen etwas mehr Ruhe in grenzwertigen Situationen zu geben, habe ich noch das weit Attribut gesetzt: 0:0:1500:0:0:1200:0
Das DOIF setzt in einem Dummy den Sollwert für die Rolläden, welche dann je ein eigenes DOIF da ich den Sollwert z.B. Bei der Balkontür übersteuern möchte.
VG Stefan