folgende Autoverschattung funktioniert nicht wie gewünscht. Erst wenn beide Parameter Temp und Lichtintensität für mehr als 20min den jeweiligen Wert überschreiten, sollen die Rollos geschlossen werden. Es scheint so, dass nur ein Wert ausgewertet wird. z.B. Licht > 50000 seit 20min und überschreitet die Temp kurz die 19,5 , dann fahren die Rollos runter. Wo liegt der Denkfehler ?
define di_Autobeschattung_Ost DOIF ([E_WS1:sunEast]>50000 && [E_WS1:temperature]>19.50) (set R_EG_MZ position 65,sleep 3,set R_OG_MZ position 65) DOELSEIF ([E_WS1:sunEast]<10000) (set R_EG_MZ position 0,sleep 3,set R_OG_MZ position 0)
attr di_Autobeschattung_Ost room EG_Wohnen
attr di_Autobeschattung_Ost wait 1200:3600
# DEF ([E_WS1:sunEast]>50000 && [E_WS1:temperature]>19.50) (set R_EG_MZ position 65,sleep 3,set R_OG_MZ position 65) DOELSEIF ([E_WS1:sunEast]<10000) (set R_EG_MZ position 0,sleep 3,set R_OG_MZ position 0)
# FUUID 66b4828d-f33f-9f11-f69e-6dd4fb811366b249
# MODEL FHEM
# NAME di_Autobeschattung_Ost
# NOTIFYDEV global,E_WS1
# NR 141
# NTFY_ORDER 50-di_Autobeschattung_Ost
# STATE cmd_1
# TYPE DOIF
# VERSION 29460 2024-12-29 20:25:48
# eventCount 3
# READINGS:
# 2025-08-26 09:15:38 Device E_WS1
# 2025-08-26 08:34:54 cmd 1
# 2025-08-26 08:34:54 cmd_event E_WS1
# 2025-08-26 08:34:54 cmd_nr 1
# 2025-08-26 09:15:38 e_E_WS1_sunEast 70588
# 2025-08-26 09:10:51 e_E_WS1_temperature 18.8
# 2025-08-08 08:30:57 mode enabled
# 2025-08-26 08:34:54 state cmd_1
# 2025-08-26 08:34:51 wait_timer no timer
# Regex:
# accu:
# bar:
# barAvg:
# collect:
# cond:
# E_WS1:
# 0:
# sunEast ^E_WS1$:^sunEast:
# temperature ^E_WS1$:^temperature:
# 1:
# sunEast ^E_WS1$:^sunEast:
# attr:
# cmdState:
# wait:
# 0:
# 1200
# 1:
# 3600
# waitdel:
# condition:
# 0 ::ReadingValDoIf($hash,'E_WS1','sunEast')>50000 && ::ReadingValDoIf($hash,'E_WS1','temperature')>19.50
# 1 ::ReadingValDoIf($hash,'E_WS1','sunEast')<10000
# do:
# 0:
# 0 set R_EG_MZ position 65,sleep 3,set R_OG_MZ position 65
# 1:
# 0 set R_EG_MZ position 0,sleep 3,set R_OG_MZ position 0
# 2:
# helper:
# NOTIFYDEV global,E_WS1
# event brightness: 70588,hemisphere: north,isSunny: yes,isSunnyEast: yes,isSunnySouth: yes,isSunnyWest: no,sunEast: 70588,sunSouth: 38823,sunWest: 13529
# globalinit 1
# last_timer 0
# sleepdevice E_WS1
# sleepsubtimer -1
# sleeptimer -1
# timerdev E_WS1
# timerevent dayNight: day,isRaining: no,isStormy: no,isWindy: no,temperature: 19.8,windSpeed: 0.0,windStrength: 0,T: 19.8 B: 80000 W: 0.0 IR: no
# triggerDev E_WS1
# timerevents:
# dayNight: day
# isRaining: no
# isStormy: no
# isWindy: no
# temperature: 19.8
# windSpeed: 0.0
# windStrength: 0
# T: 19.8 B: 80000 W: 0.0 IR: no
# timereventsState:
# dayNight: day
# isRaining: no
# isStormy: no
# isWindy: no
# temperature: 19.8
# windSpeed: 0.0
# windStrength: 0
# state: T: 19.8 B: 80000 W: 0.0 IR: no
# triggerEvents:
# brightness: 70588
# hemisphere: north
# isSunny: yes
# isSunnyEast: yes
# isSunnySouth: yes
# isSunnyWest: no
# sunEast: 70588
# sunSouth: 38823
# sunWest: 13529
# triggerEventsState:
# brightness: 70588
# hemisphere: north
# isSunny: yes
# isSunnyEast: yes
# isSunnySouth: yes
# isSunnyWest: no
# sunEast: 70588
# sunSouth: 38823
# sunWest: 13529
# internals:
# perlblock:
# readings:
# all E_WS1:sunEast E_WS1:temperature
# trigger:
# uiState:
# uiTable:
#
setstate di_Autobeschattung_Ost cmd_1
setstate di_Autobeschattung_Ost 2025-08-26 09:15:38 Device E_WS1
setstate di_Autobeschattung_Ost 2025-08-26 08:34:54 cmd 1
setstate di_Autobeschattung_Ost 2025-08-26 08:34:54 cmd_event E_WS1
setstate di_Autobeschattung_Ost 2025-08-26 08:34:54 cmd_nr 1
setstate di_Autobeschattung_Ost 2025-08-26 09:15:38 e_E_WS1_sunEast 70588
setstate di_Autobeschattung_Ost 2025-08-26 09:10:51 e_E_WS1_temperature 18.8
setstate di_Autobeschattung_Ost 2025-08-08 08:30:57 mode enabled
setstate di_Autobeschattung_Ost 2025-08-26 08:34:54 state cmd_1
setstate di_Autobeschattung_Ost 2025-08-26 08:34:51 wait_timer no timer
Das waren die Werte der Wetterstation von heute morgen. Die Rollos hätten niemals fahren dürfen.
2025-08-26_08:03:30 E_WS1 sunEast: 45882
2025-08-26_08:03:49 E_WS1 sunEast: 44705
2025-08-26_08:03:49 E_WS1 temperature: 18.8
2025-08-26_08:05:05 E_WS1 sunEast: 50000
2025-08-26_08:07:09 E_WS1 sunEast: 55882
2025-08-26_08:11:01 E_WS1 sunEast: 52941
2025-08-26_08:14:31 E_WS1 sunEast: 58823
2025-08-26_08:14:50 E_WS1 sunEast: 51764
2025-08-26_08:14:51 E_WS1 temperature: 19.8
2025-08-26_08:19:38 E_WS1 sunEast: 57647
2025-08-26_08:24:50 E_WS1 sunEast: 58823
2025-08-26_08:25:10 E_WS1 temperature: 18.8
2025-08-26_08:28:48 E_WS1 sunEast: 60588
2025-08-26_08:35:15 E_WS1 sunEast: 60588
2025-08-26_08:35:16 E_WS1 temperature: 20.7
2025-08-26_08:55:34 E_WS1 sunEast: 64705
2025-08-26_08:55:35 E_WS1 temperature: 18.8
2025-08-26_08:55:35 E_WS1 temperature: 19.8
2025-08-26_08:55:35 E_WS1 temperature: 18.8
2025-08-26_08:55:35 E_WS1 sunEast: 66470
2025-08-26_08:55:35 E_WS1 temperature: 17.9
2025-08-26_08:55:35 E_WS1 temperature: 18.8
2025-08-26_08:55:35 E_WS1 temperature: 17.9
2025-08-26_08:55:35 E_WS1 temperature: 18.8
2025-08-26_08:55:35 E_WS1 sunEast: 68823
2025-08-26_08:55:35 E_WS1 sunEast: 70000
2025-08-26_08:55:39 E_WS1 sunEast: 70588
2025-08-26_08:55:59 E_WS1 sunEast: 45882
Wait bezieht sich immer auf die gesamte Bedingung, diese wird immer komplett ausgewertet, da das der Perlinterpreter macht.
Zitat von: prenzela am 26 August 2025, 09:30:102025-08-26_08:14:50 E_WS1 sunEast: 51764
2025-08-26_08:14:51 E_WS1 temperature: 19.8
Hier ist doch die erste Bedingung erfüllt?
In der zweiten Bedingung fragst du nur E_WS1:sunEast ab. Diese Bedingung wird aber nicht erfüllt und somit bleibt der wait timer der ersten Bedingung aktiv und schaltet nach Ablauf.
ZitatEine bereits ausgelöste Verzögerung wird zurückgesetzt, wenn während der Wartezeit ein Kommando eines anderen DO-Falls, ausgelöst durch ein neues Ereignis, ausgeführt werden soll.
Wenn du ein DOELSE () anhängst, wird es glaube funktionieren.
([E_WS1:sunEast]>50000 && [E_WS1:temperature]>19.50) (set R_EG_MZ position 65,sleep 3,set R_OG_MZ position 65) DOELSEIF ([E_WS1:sunEast]<10000) (set R_EG_MZ position 0,sleep 3,set R_OG_MZ position 0) DOELSE ()
funktioniert nicht, bei Verringerung des Lichteinfalls läuft er in state cmd_3 und die Rollos gehen nicht auf..
Ich würde bei zwei Zweigen bleiben (für on/off). Du musst alle Bedingungen, die zum Hochfahren führen sollen mit or in deine DOELSEIF-Bedingung aufnehmen, hier insbesondere die Temperaturgrenze.
Ich glaub da ist ein (Denk) Fehler drin.
Ich frage Helligkeit und Temperatur ab. Wenn beide Werte überschritten werden, dann werden die Rollos zeitverzögert über den WAIT gefahren. Genau das funktioniert. Aber auch, wenn die Helligkeit den Wert nur kurz überschreitet. Ist die Temp immer noch über Schwellwert und die Helligkeit innerhalb der WAIT Zeit wieder gesunken, werden die Rollos trotzdem gefahren.
Es müsste also eine Bedingung her die die ungefähr so lautet wenn Temperatur länger als 20min > 19,5°C und Helligkeit länger als 20 min > 50000, erst dann Rollos fahren.
Könnt ihr mir da auf die Sprünge helfen ?
Zitat von: prenzela am 27 August 2025, 09:35:32([E_WS1:sunEast]>50000 && [E_WS1:temperature]>19.50) (set R_EG_MZ position 65,sleep 3,set R_OG_MZ position 65) DOELSEIF ([E_WS1:sunEast]<10000) (set R_EG_MZ position 0,sleep 3,set R_OG_MZ position 0) DOELSE ()
funktioniert nicht, bei Verringerung des Lichteinfalls läuft er in state cmd_3 und die Rollos gehen nicht auf..
Ich dachte, dass wäre genau das was du willst?
ZitatErst wenn beide Parameter Temp und Lichtintensität für mehr als 20min den jeweiligen Wert überschreiten, sollen die Rollos geschlossen werden.
Bei mir funktioniert das wie gewünscht...
Zitat von: prenzela am 27 August 2025, 11:33:00Aber auch, wenn die Helligkeit den Wert nur kurz überschreitet. Ist die Temp immer noch über Schwellwert und die Helligkeit innerhalb der WAIT Zeit wieder gesunken, werden die Rollos trotzdem gefahren.
Es müsste also eine Bedingung her die die ungefähr so lautet wenn Temperatur länger als 20min > 19,5°C und Helligkeit länger als 20 min > 50000, erst dann Rollos fahren.
Genau dafür sorgt das abschließende DOELSE()... Wenn weder die erste Bedingung noch die zweite Bedingung erfüllt ist, wechselt er in cmd_3. Das löscht einen anstehenden wait_timer wenn innerhalb der wait time eine der beiden ersten Bedingungen nicht erfüllt ist...
@Damian: Ich glaube das "und" ist gewünscht:
Verschatten wenn
für x Minuten
Öffnen unabhängig Temperatur wenn
für x Minuten
Zum Ausprobieren:
defmod dmy_di_testEvent dummy
attr dmy_di_testEvent readingList Bedingung1 Bedingung2
attr dmy_di_testEvent room testDIEvents
attr dmy_di_testEvent setList Bedingung1:slider,9500,1000,55500 Bedingung2:slider,10,1,30
attr dmy_di_testEvent webCmd Bedingung1:Bedingung2
attr dmy_di_testEvent webCmdLabel Lum :Temp
defmod di_testEvent_DI DOIF ([dmy_di_testEvent:Bedingung1] > 50000 and [dmy_di_testEvent:Bedingung2] > 19) (set dmy_di_testEvent Rollo auf) DOELSEIF ([dmy_di_testEvent:Bedingung1] < 10000) (set dmy_di_testEvent Rollo zu) DOELSE ()
attr di_testEvent_DI cmdState Rollo auf|Rollo zu|nichts
attr di_testEvent_DI room testDIEvents
attr di_testEvent_DI stateFormat state <br>\
wait_timer
attr di_testEvent_DI wait 10:10:0
Wenn der Timer einmal für cmd1 gesetzt wird, weil die Angaben für cmd1 wahr werden, dann wird er nur durch einen Zustandswechsel gestoppt. Wenn der Wert der Helligkeit nicht unter 10000 fällt, dann erfolgt auch kein Zustandswechsel (cmd2) und der Timer läuft bis zum Auslösen von cmd1 weiter.
Ich habe das jetzt mit einfachen Tastern und einer Lampe nachgebaut.
([EnO_FED67AAD:state] eq "BI" &&[EnO_FED67AC4:state] eq "BI") (set myLamp1 on) DOELSEIF ([EnO_FED67AAD:state] eq "B0" &&[EnO_FED67AC4:state] eq "B0") (set myLamp1 off)
wait 5:10
sind beide Taster BI dann geht nach 5s die Lampe an und sind beide Taster B0 geht sie nach 10s wieder aus.. Das passt
ABER die Lampe geht auch an, wenn innerhalb der ersten 5s (inerhalb der WAIT time) einer von beiden Tastern wieder auf B0 geschalten wird bzw in der zweiten Bedingung wenn einer von beiden Tastern wieder auf BI geht, schaltet sich die Lampe trotzdem aus.
Wie fängt man sowas ab, bzw. programmiert es komplett anders ?
Zitat von: prenzela am 27 August 2025, 17:58:21Ich habe das jetzt mit einfachen Tastern und einer Lampe nachgebaut.
([EnO_FED67AAD:state] eq "BI" &&[EnO_FED67AC4:state] eq "BI") (set myLamp1 on) DOELSEIF ([EnO_FED67AAD:state] eq "B0" &&[EnO_FED67AC4:state] eq "B0") (set myLamp1 off)
wait 5:10
sind beide Taster BI dann geht nach 5s die Lampe an und sind beide Taster B0 geht sie nach 10s wieder aus.. Das passt
ABER die Lampe geht auch an, wenn innerhalb der ersten 5s (inerhalb der WAIT time) einer von beiden Tastern wieder auf B0 geschalten wird bzw in der zweiten Bedingung wenn einer von beiden Tastern wieder auf BI geht, schaltet sich die Lampe trotzdem aus.
Wie fängt man sowas ab, bzw. programmiert es komplett anders ?
Deswegen brauchst du etwas, was einen anderen Zweig auslöst, damit der Zustand geändert wird, hier wäre es z. B. ein DOELSE-Zweig
Kannst du du mich ggf mit den notwendigen Zeilen unterstützen ?
Hier hab ich was ähnliches gefunden
https://forum.fhem.de/index.php?topic=118843.0
der dort angegebene Link läuft auch ins Leere http://fhem.de/commandref_DE.html#DOIF_Ausf%C3%BChrungstimer
Ich würde es im DOIF Perl-Modus versuchen. Sobald ein aktivierendes Event kommt, einen Ausführungstimer starten, dessen Name den des sendenden Gerätes enthält. Wenn ein deaktivierendes Event kommt, den Timer löschen, falls er gesetzt ist.
Ohne Beispiel komm ich da leider nicht weiter...
Siehe hier: https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Interne_Timer
Zitat von: prenzela am 27 August 2025, 17:58:21Ich habe das jetzt mit einfachen Tastern und einer Lampe nachgebaut.
([EnO_FED67AAD:state] eq "BI" &&[EnO_FED67AC4:state] eq "BI") (set myLamp1 on) DOELSEIF ([EnO_FED67AAD:state] eq "B0" &&[EnO_FED67AC4:state] eq "B0") (set myLamp1 off)
wait 5:10
sind beide Taster BI dann geht nach 5s die Lampe an und sind beide Taster B0 geht sie nach 10s wieder aus.. Das passt
ABER die Lampe geht auch an, wenn innerhalb der ersten 5s (inerhalb der WAIT time) einer von beiden Tastern wieder auf B0 geschalten wird bzw in der zweiten Bedingung wenn einer von beiden Tastern wieder auf BI geht, schaltet sich die Lampe trotzdem aus.
Wie fängt man sowas ab, bzw. programmiert es komplett anders ?
Letzter Versuch: Mehr als 3-mal mag ich dann auch nicht :o
([EnO_FED67AAD:state] eq "BI" &&[EnO_FED67AC4:state] eq "BI") (set myLamp1 on)
DOELSEIF ([EnO_FED67AAD:state] eq "B0" &&[EnO_FED67AC4:state] eq "B0") (set myLamp1 off)
DOELSE ()
Du kannst es auch komplizierter haben, wenn dir das hilft (vielleicht wird es dann klarer):
([EnO_FED67AAD:state] eq "BI" &&[EnO_FED67AC4:state] eq "BI") (set myLamp1 on)
DOELSEIF ([EnO_FED67AAD:state] eq "B0" &&[EnO_FED67AC4:state] eq "B0") (set myLamp1 off)
DOELSEIF ([EnO_FED67AAD:state] ne "BI" or [EnO_FED67AC4:state] ne"BI") ()
Deine aktuelle Definition kennt nur 2 unterschiedliche Zweige die - sofern erreicht - jeweils den Timer und dann das Kommando auslösen. Um von der Bedinugung (dem Zustand) wieder "weg zu kommen" braucht DOIF eine zutreffende Bedingung in die es "
andernfalls" (
DOELSE) wechseln kann.
Welche Bedinugung soll denn in deinem Fall aktiv sein/werden, wenn keine der genannten zutrifft?
Wüsste nicht wo dir da der Perl Modus helfen sollte. Da musst du den Timer setzten, bei erneutem Event schauen ob er schon läuft und bei negierter Bedingung löschen. In etwa so - ohne Gewähr:
RolloUpDown {
if([licht:wert] > 50000 and [temp:wert] > 19.5 and !get_Exec("RolloUpTimer") {
del_Exec("RolloDownTimer");
set_Exec("RolloUpTimer", 1200, "fhem('set rollo up');");
}
elseif([licht:wert] < 10000 and !get_Exec("RolloDownTimer")) {
del_Exec("RolloUpTimer");
set_Exec("RolloDownTimer", 3600, "fhem('set rollo down');");
}
else
{
del_Exec("RolloUpTimer");
del_Exec("RolloDownTimer");
}
}
Aber auch hier gibt es einen
else Zweig der das gemacht, was du bisher ignorierst. :(
DANKE für die Beispiele und die Geduld mit mir. Die "einfache" Variante mit DOELSE () am Ende, zeigt das gewünschte Ergebnis in meiner Teststellung mit den Tastern. Dann muss es ja mit den Rollos auch klappen.