Hallo,
ich habe eine Diskrepanz zwischen Anzeige des Zustandes und des Zustandes des DOIF selber und möchte das gerne beseitigen. Die Funktion des DOIF ist vorhanden, jedoch die Anzeige des cmdstate nicht korrekt.
Es ist ein DOIF für die Beschattungssteuerung:
Internals:
DEF ((([?Wetter_Pro:fc0_tempMax] >= 20 and ([?Wetter_Pro:fc0_weather06] =~ "sonnig" or [?Wetter_Pro:fc0_weather06] =~ "heiter")) or ([?Wetter_Pro:fc0_tempMax] >= 21 and
[?Wetter_Pro:fc0_weather06] =~ "bewölkt") or ([?Wetter_Pro:fc0_tempMax] >= 22 and ([?Wetter_Pro:fc0_weather06] =~ "bedeckt" or [?Wetter_Pro:fc0_weather06] =~ "wolkig"))) and
[?Wetter_Pro:fc0_tempMin] >= 8 and ($month >= 4 && $month <= 9) and ([([du_Sonnenaufgang])-08:30,+:15])) { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=ja ja")
if ( ReadingsVal('OG_UniSen_03','luminosity',0) > 400 )}
DOELSEIF ((([?Wetter_Pro:fc0_tempMax] >= 20 and ([?Wetter_Pro:fc0_weather09] =~ "sonnig" or [?Wetter_Pro:fc0_weather09] =~ "heiter")) or ([?Wetter_Pro:fc0_tempMax] >= 21 and
[?Wetter_Pro:fc0_weather09] =~ "bewölkt") or ([?Wetter_Pro:fc0_tempMax] >= 22 and ([?Wetter_Pro:fc0_weather09] =~ "bedeckt" or [?Wetter_Pro:fc0_weather09] =~ "wolkig"))) and
[?Wetter_Pro:fc0_tempMin] >= 8 and ($month >= 4 && $month <= 9) and ([09:00-13:00,+:15])) { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=ja ja")
if ( ReadingsVal('OG_UniSen_03','luminosity',0) > 400 ) }
DOELSEIF ([du_Tageslicht] eq "dunkel") { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=nein nein") } ## Merker zurücksetzen
FUUID 6196b0e7-f33f-d125-3ba3-cc28813582c4badb
MODEL FHEM
NAME di_Beschattung_Haus_morgens
NOTIFYDEV du_Tageslicht,du_Sonnenaufgang,global
NR 80
NTFY_ORDER 50-di_Beschattung_Haus_morgens
STATE Beschatten bis 9:00
TYPE DOIF
VERSION 26020 2022-05-03 16:28:02
READINGS:
2022-07-05 07:45:04 cmd 1
2022-07-05 07:45:04 cmd_event timer_3
2022-07-05 07:45:04 cmd_nr 1
2022-07-05 07:35:30 mode enabled
2022-07-05 07:45:04 state Beschatten bis 9:00
2022-07-05 07:35:30 timer_01_c01 06.07.2022 05:01:00
2022-07-05 07:35:30 timer_02_c01 05.07.2022 08:30:00
2022-07-05 07:45:00 timer_03_c01 05.07.2022 08:00:00
2022-07-05 07:35:30 timer_04_c02 05.07.2022 09:00:00
2022-07-05 07:35:30 timer_05_c02 05.07.2022 13:00:00
2022-07-05 07:45:04 wait_timer no timer
Regex:
accu:
collect:
cond:
du_Tageslicht:
2:
&STATE ^du_Tageslicht$
itimer:
du_Sonnenaufgang:
itimer:
&STATE ^du_Sonnenaufgang$
attr:
cmdState:
0:
Beschatten bis 9:00
1:
Beschatten ab 9:00
2:
Dummy
wait:
0:
rand(5)
1:
rand(5)
2:
0
waitdel:
condition:
0 ((::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 20 and (::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather06') =~ "sonnig" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather06') =~ "heiter")) or (::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 21 and ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather06') =~ "bewölkt") or (::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 22 and (::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather06') =~ "bedeckt" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather06') =~ "wolkig"))) and ::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMin') >= 8 and ($month >= 4 && $month <= 9) and (::DOIF_time($hash,0,1,$wday,$hms))
1 ((::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 20 and (::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather09') =~ "sonnig" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather09') =~ "heiter")) or (::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 21 and ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather09') =~ "bewölkt") or (::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMax') >= 22 and (::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather09') =~ "bedeckt" or ::ReadingValDoIf($hash,'Wetter_Pro','fc0_weather09') =~ "wolkig"))) and ::ReadingValDoIf($hash,'Wetter_Pro','fc0_tempMin') >= 8 and ($month >= 4 && $month <= 9) and (::DOIF_time($hash,3,4,$wday,$hms))
2 ::InternalDoIf($hash,'du_Tageslicht','STATE') eq "dunkel"
days:
do:
0:
0 { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=ja ja") if ( ReadingsVal('OG_UniSen_03','luminosity',0) > 400 )}
1:
0 { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=ja ja") if ( ReadingsVal('OG_UniSen_03','luminosity',0) > 400 ) }
2:
0 { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=nein nein") }
3:
helper:
NOTIFYDEV du_Tageslicht,du_Sonnenaufgang,global
event timer_3
globalinit 1
last_timer 6
sleepdevice timer_3
sleepsubtimer -1
sleeptimer -1
timerdev
timerevent timer_3
triggerDev
DOIF_eventa:
cmd_nr: 1
cmd: 1
cmd_event: timer_3
Beschatten bis 9:00
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: timer_3
state: Beschatten bis 9:00
timerevents:
timer_3
timereventsState:
timer_3
triggerEvents:
timer_3
triggerEventsState:
timer_3
hmccu:
internals:
all du_Tageslicht:STATE
interval:
0 -1
1 0
3 -1
4 3
intervalfunc:
2 ::DOIF_time($hash,0,1,$wday,$hms)
5 ::DOIF_time($hash,3,4,$wday,$hms)
intervaltimer:
0 2
1 2
3 5
4 5
localtime:
0 1657076460
1 1657002600
2 1657000800
3 1657004400
4 1657018800
realtime:
0 05:01:00
1 08:30:00
2 08:00:00
3 09:00:00
4 13:00:00
time:
0 ([du_Sonnenaufgang])
1 08:30:00
2 +:15
3 09:00:00
4 13:00:00
5 +:15
timeCond:
0 0
1 0
2 0
3 1
4 1
5 1
timer:
0 0
1 0
2 0
3 0
4 0
5 0
timers:
0 0 1 2
1 3 4 5
triggertime:
1657000800:
localtime 1657000800
hash:
1657002600:
localtime 1657002600
hash:
1657004400:
localtime 1657004400
hash:
1657018800:
localtime 1657018800
hash:
1657076460:
localtime 1657076460
hash:
uiState:
uiTable:
Attributes:
cmdState Beschatten bis 9:00 | Beschatten ab 9:00 | Dummy
comment 05.07: Stündliche Abfrage +[1]:00 auf 15 Min. +:15 geändert
initialize nein
room 1.2_Kueche,9.8.1_DOIF
timerWithWait 1
wait rand(5):rand(5):0
Heute morgen stand cmdstate ab 05:01 (Sonnenaufgang) auf "Beschatten bis 9:00", obwohl die Helligkeit des Sensors OG_UniSen_03 weit unter 400 war. Scheinbar wird cmdstate aktualisiert, obwohl die if-Bedingung nicht erfüllt ist.
Wie kann ich Funktion und Statusanzeige wieder in Übereinstimmung bringen?
Grüße Jürgen
Sehe ich das richtig, dass du alle 15 Minuten die Werte abfragst statt die Werte triggern zu lassen?
In welchem Abstand ändern sich die Werte der Sensoren?
Hallo Per,
stimmt. Frage aktuell alle 15 Minuten ab (vorher jede Stunde), wobei der einzige Sensor im Haus der OG_UniSen_03 (kombinierter Temperatur, Feuchtigkeit, Helligkeits-Sensor von Dirk) ist. Die anderen "Sensoren" (Wetter_Pro:..) sind Werte von Proplanta, das ich stündlich abfrage.
Den Helligkeitssensor wollte ich nicht triggern lassen, da sich diese ja permanent ändert und jedesmal eine Prüfung erfolgt. Erschien mir eine unnötige Belastung des Systems.
15 Minuten daher, da in der Küche Obst, Biomüll... sonst bei Sonnenschein direkt in der Sonne stehen. Hatte vorher 1 Stunde, was aber bei z.B. Bewölkung dazu führt, dass im Worst Case fast 1 Stunde der Biomüll und das Obst in der Sonne stehen.
Wenn es eine bessere Lösung gibt nur her damit.
Grüße Jürgen
Zitat von: bmwfan am 05 Juli 2022, 07:53:31
Heute morgen stand cmdstate ab 05:01 (Sonnenaufgang) auf "Beschatten bis 9:00", obwohl die Helligkeit des Sensors OG_UniSen_03 weit unter 400 war. Scheinbar wird cmdstate aktualisiert, obwohl die if-Bedingung nicht erfüllt ist.
cmdstate zeigt ja nur welcher Zweig ausgeführt wurde, aber nicht was im Ausführungsteil passiert ist - das kann das Modul auch nicht wissen.
Wenn du sehen willst, ob tatsächlich der set-Befehl ausgeführt wurde, dann musst du deine if-Abfrage in die Bedingung verlagern:
statt:
... and ([([du_Sonnenaufgang])-08:30,+:15])) { fhem("set du_Beschattung_Haus_morgens:FILTER=state!=ja ja")
if ( ReadingsVal('OG_UniSen_03','luminosity',0) > 400 )}
... and ([([du_Sonnenaufgang])-08:30,+:15]) and [?OG_UniSen_03:luminosity,0] > 400) (set du_Beschattung_Haus_morgens:FILTER=state!=ja ja)
@ Damian
Danke für die Erklärung. Habs umgestellt.
Grüße Jürgen
Hallo zusammen,
....das Problem ist ja nun gelöst!
Ich möchte es nur um eine (für mich leichter lesbare) syntaktische IF-Variante ohne Perlmodus als weitere Möglichkeit ergänzen,
da man ja öfter auf integrierte IFs im DOIF angewiesen ist:
...ich bleib' damit gedanklich mehr in der DOIF-Syntax...
Vorsicht mit den Leerzeichen nach dem IF !
(
IF (ReadingsVal('OG_UniSen_03','luminosity',0) > 400 ) (set du_Beschattung_Haus_morgens:FILTER=state!=ja ja)
)
...bei mehreren IFs sollte auch folgendes funktionieren:
(
IF (ReadingsVal('OG_UniSen_03','luminosity',0) > 400 ) (set du_Beschattung_Haus_morgens:FILTER=state!=ja ja)
IF (.......................................................................) (...............................................................................)
)
@Damian...du bist ja näher dran...siehst du hier Probleme ?
Zitat von: daedalus0815 am 20 Juli 2022, 14:35:25
Hallo zusammen,
....das Problem ist ja nun gelöst!
Ich möchte es nur um eine (für mich leichter lesbare) syntaktische IF-Variante ohne Perlmodus als weitere Möglichkeit ergänzen,
da man ja öfter auf integrierte IFs im DOIF angewiesen ist:
...ich bleib' damit gedanklich mehr in der DOIF-Syntax...
Vorsicht mit den Leerzeichen nach dem IF !
(
IF (ReadingsVal('OG_UniSen_03','luminosity',0) > 400 ) (set du_Beschattung_Haus_morgens:FILTER=state!=ja ja)
)
...bei mehreren IFs sollte auch folgendes funktionieren:
(
IF (ReadingsVal('OG_UniSen_03','luminosity',0) > 400 ) (set du_Beschattung_Haus_morgens:FILTER=state!=ja ja)
IF (.......................................................................) (...............................................................................)
)
@Damian...du bist ja näher dran...siehst du hier Probleme ?
Das kannst du so machen. Im DOIF-FHEM-Modus stehen die Trigger immer in der Bedingung, daher kannst du auch IF ([OG_UniSen_03:luminosity,0] > 400 ) ... angeben. Beim IF wird die Readingangabe im Gegensatz zur DOIF-Bedingung nicht als Trigger angesehen.