Jalousien über Brightness UND Uhrzeit steuern

Begonnen von FunkOdyssey, 25 April 2016, 10:01:53

Vorheriges Thema - Nächstes Thema

FunkOdyssey

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.

Ellert

Versuch mal den Bedingungszweig 2 mit and [?$SELF] !~ "cmd_3|cmd_2" zu ergänzen.

FunkOdyssey

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]]
)
)



Ellert

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.

FunkOdyssey

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.

StefanD

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
HW: Intel NUC8i5 mit ESXi7 mit Ubuntu Server 18.04 LTS und FHEM als DockerContainer

FunkOdyssey

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. :-)

Garbsen

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
FHEM und Homebridge auf Intel NUC, CUL 868 v 1.66, CUL466 V 1.66, SOMFY RTS Rolläden, HM-LC-Bl1PBU-FM, HM-LC-BL1-FM, HM-SEC-SC-2, HM-SEC-RHS, HM-WDS10-TH-O, HM-SEC-WDS-2, HM-Sen-LI-O, HM-CC-RT-DN, HM-LC-Sw1-Pl-DN-R1, HM-SCI-3-FM, HM-Sec-Sir-WM, HM-PB-2-WM55-2, HM-RC-8, HM-LC-SW1-PL2, Alpha2

StefanD

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
HW: Intel NUC8i5 mit ESXi7 mit Ubuntu Server 18.04 LTS und FHEM als DockerContainer