Hallo,
ich habe mit diesem DOIF ein Problem. Die Auschaltverzögerung (wait 120) arbeitet nicht korrekt.
Eigentlich benötige ich ein DO resetwait, wenn während der Ausschaltverzögerung die Geräte "EG.ss.TK.Haustuer:buttons" und "EG.ss.LS.Eingang:buttons" erneut den Zustand "pressed" annehmen. Aber das mit dem resetwait wird hier ignoriert!
Wo liegt da der Fehler?
Internals:
CFGFN Config/05-Eingang.cfg
DEF (([EG.ss.TK.Haustuer:buttons] eq "pressed" or [EG.ss.LS.Eingang:buttons] eq "pressed") and
[?EI.ss.SA.Licht] eq "off" and [?help.01.Eingangslicht.dum] eq "off" and [?help.Tageslicht.dum] eq "dunkel")
(set EI.ss.SA.Licht on)
DOELSEIF ([seq.01.EG.fl.WS.Eingangslicht:?partial_1] and [EI.ss.SA.Licht] eq "off")
(set EI.ss.SA.Licht on)
DOELSEIF ([00:00] and [?hl.01.Feiertag] eq "Silvester")
(set EI.ss.SA.Licht on)
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and
[EI.ss.SA.Licht] eq "on" and [?di.02.EI.ss.SA.Licht] eq "Sensor_on")
(set EI.ss.SA.Licht off)
DOELSEIF ([seq.01.EG.fl.WS.Eingangslicht:?partial_1] and [EI.ss.SA.Licht] eq "on")
(set EI.ss.SA.Licht off)
DOELSEIF ([02:00] and [?hl.01.Feiertag] eq "Neujahr")
(set EI.ss.SA.Licht off)
DOELSEIF ([help.01.Eingangslicht.dum] eq "on")
NAME di.02.EI.ss.SA.Licht
NR 759
NTFY_ORDER 50-di.02.EI.ss.SA.Licht
STATE Sensor_off
TYPE DOIF
Readings:
2015-12-30 17:07:50 Device EG.ss.TK.Haustuer
2015-12-30 17:07:45 cmd_event EG.ss.TK.Haustuer
2015-12-30 17:07:45 cmd_nr 4
2015-12-30 17:03:05 e_EG.ss.LS.Eingang_buttons released
2015-12-30 17:03:05 e_EG.ss.LS.Eingang_events buttons: released
2015-12-30 17:07:50 e_EG.ss.TK.Haustuer_buttons released
2015-12-30 17:07:50 e_EG.ss.TK.Haustuer_events buttons: released
2015-12-30 17:07:46 e_EI.ss.SA.Licht_STATE off
2015-12-30 17:07:46 e_EI.ss.SA.Licht_events off
2015-12-30 16:37:05 e_help.01.Eingangslicht.dum_STATE off
2015-12-30 16:37:05 e_help.01.Eingangslicht.dum_events off
2015-12-30 16:45:43 e_seq.01.EG.fl.WS.Eingangslicht_events partial_1
2015-12-30 17:07:45 state Sensor_off
2015-12-30 00:00:00 timer_1_c3 31.12.2015 00:00:00
2015-12-30 02:00:00 timer_2_c6 31.12.2015 02:00:00
2015-12-30 17:07:45 wait_timer no timer
Condition:
0 (ReadingValDoIf('EG.ss.TK.Haustuer','buttons','') eq "pressed" or ReadingValDoIf('EG.ss.LS.Eingang','buttons','') eq "pressed") and InternalDoIf('EI.ss.SA.Licht','STATE','') eq "off" and InternalDoIf('help.01.Eingangslicht.dum','STATE','') eq "off" and InternalDoIf('help.Tageslicht.dum','STATE','') eq "dunkel"
1 EventDoIf('seq.01.EG.fl.WS.Eingangslicht',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'partial_1') and InternalDoIf('EI.ss.SA.Licht','STATE','') eq "off"
2 DOIF_time_once($hash,$hash->{timer}{0},$wday,"") and InternalDoIf('hl.01.Feiertag','STATE','') eq "Silvester"
3 ReadingValDoIf('EG.ss.TK.Haustuer','buttons','') eq "released" and ReadingValDoIf('EG.ss.LS.Eingang','buttons','') eq "released" and InternalDoIf('EI.ss.SA.Licht','STATE','') eq "on" and InternalDoIf('di.02.EI.ss.SA.Licht','STATE','') eq "Sensor_on"
4 EventDoIf('seq.01.EG.fl.WS.Eingangslicht',$hash->{helper}{triggerDev},$hash->{helper}{triggerEvents},'partial_1') and InternalDoIf('EI.ss.SA.Licht','STATE','') eq "on"
5 DOIF_time_once($hash,$hash->{timer}{1},$wday,"") and InternalDoIf('hl.01.Feiertag','STATE','') eq "Neujahr"
6 InternalDoIf('help.01.Eingangslicht.dum','STATE','') eq "on"
Days:
Devices:
0 EG.ss.TK.Haustuer EG.ss.LS.Eingang
1 seq.01.EG.fl.WS.Eingangslicht EI.ss.SA.Licht
3 EG.ss.TK.Haustuer EG.ss.LS.Eingang EI.ss.SA.Licht
4 seq.01.EG.fl.WS.Eingangslicht EI.ss.SA.Licht
6 help.01.Eingangslicht.dum
all EG.ss.TK.Haustuer EG.ss.LS.Eingang seq.01.EG.fl.WS.Eingangslicht EI.ss.SA.Licht help.01.Eingangslicht.dum
Do:
0:
0 set EI.ss.SA.Licht on
1:
0 set EI.ss.SA.Licht on
2:
0 set EI.ss.SA.Licht on
3:
0 set EI.ss.SA.Licht off
4:
0 set EI.ss.SA.Licht off
5:
0 set EI.ss.SA.Licht off
6:
0
7:
Helper:
globalinit 1
last_timer 2
sleepdevice EG.ss.TK.Haustuer
sleepsubtimer -1
sleeptimer -1
triggerDev EG.ss.TK.Haustuer
triggerEvents:
buttons: released
Internals:
1 EI.ss.SA.Licht:STATE
3 EI.ss.SA.Licht:STATE
4 EI.ss.SA.Licht:STATE
6 help.01.Eingangslicht.dum:STATE
all EI.ss.SA.Licht:STATE help.01.Eingangslicht.dum:STATE
Itimer:
Readings:
0 EG.ss.TK.Haustuer:buttons EG.ss.LS.Eingang:buttons
3 EG.ss.TK.Haustuer:buttons EG.ss.LS.Eingang:buttons
all EG.ss.TK.Haustuer:buttons EG.ss.LS.Eingang:buttons
Realtime:
0 00:00:00
1 02:00:00
State:
Time:
0 00:00:00
1 02:00:00
Timecond:
0 2
1 5
Timer:
0 0
1 0
Timerfunc:
Timers:
2 0 0
5 1 1
Trigger:
all seq.01.EG.fl.WS.Eingangslicht
Attributes:
alias autom. Eingangslicht
cmdState Sensor_on|manual_on|Silvester_on|Sensor_off|manual_off|Silvester_off|Notaus
disable 0
group Scripte
initialize manual_off
room 05-Eingang
wait 0:0:0:120:0:0:0
Danke und Gruß,
Spartacus
Um dem Fehler auf die Spur zu kommen köntest Du die Events des DOIF loggen, dann siehst Du, was genau nicht klappt.
Loggen mit:
define logni notify di.02.EI.ss.SA.Licht.* {Log 1, $NAME.": ".$EVENT)}
Zusätzlich könntest Du das DOIF zum Testen auf das Wesentliche reduzieren, und wenn dieser Teil funktioniert, erweitern usw.
Noch ein Hinweis zu do resetwait (http://fhem.de/commandref_DE.html#DOIF_do_resetwait)
ZitatDie Auschaltverzögerung (wait 120) arbeitet nicht korrekt.
Was meinst Du damit genau?
Hi Elbert,
danke für die Hinweise ich werde das mal versuchen, um dem Fehler auf die Schliche zu kommen. Aber es kann nur an diesem DOELSEIF liegen, welches auch die Ausschaltverzögerung für "EI.ss.SA.Licht" enthält
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and
[EI.ss.SA.Licht] eq "on" and [?di.02.EI.ss.SA.Licht] eq "Sensor_on")
(set EI.ss.SA.Licht off)
Wenn die "Haustür" und die "Lichtschranke" den Zustand "released" haben, dann läuft fangen die 120s an zu ticken. Dieser Timer muss aber abgebrochen werden, wenn Haustür oder Lichtschranke wieder auf "pressed" wechseln. Das hat alles mal funktioniert und hängt irgendwie mit der Tatsache zusammen, das im DOIF die Rekursion unterbunden wird. Ursprünglich lautet die Zeile:
DOELSEIF ([EG.ss.TK.Haustuer:buttons] eq "released" and [EG.ss.LS.Eingang:buttons] eq "released" and
[EI.ss.SA.Licht] eq "on" and [di.02.EI.ss.SA.Licht] eq "Sensor_on")
(set EI.ss.SA.Licht off)
. Heisst, dass auf das DOIF selbst (di.02.EI.ss.SA.Licht) getriggert wurde. Aber Damin hat dies in einer der letzten Versionen unterbunden und gab mirden Tipp mit dem "?" vor dem "di.02.EI.ss.SA.Licht". Nur leider funktioniert das immer noch nicht sauber!
Christian
Welche Funktion hat das
Zitatand [EI.ss.SA.Licht] eq "on"
? Könntest Du das ggf. mit FILTER lösen, um die Bedingung zu vereinfachen? http://fhem.de/commandref_DE.html#devspec
Hallo,
Das mit dem Filter verstehe ich in diesem Zusammenhang nicht! Ich glaube, das and [EI.ss.SA.Licht] eq "on"
Kann man weglassen. Den Sinn verstehe ich auch nicht mehr!
Das war damals eine Hilfskonstruktion, da DOIF noch nicht den Funktionsumfang hatte!
Ich glaube, ich muss das ganz neu aufdröseln....
Ich beschreibe noch mal, was das Ziel sein soll:
Es gibt drei Sensoren:
1. Lichtschranke (LS: EG.ss.LS.Eingang:buttons)
2. Türkontakt (TK:EG.ss.TK.Haustuer:buttons )
3. Taster (seq.01.EG.fl.WS.Eingangslicht:?partial_1)
Funktionen:
a) Wenn es dunkel ist (help.Tageslicht.dum), soll das Licht (EI.ss.SA.Licht) eingeschaltet werden, sobald LS oder TK auf "pressed" gehen. Solange der Zustand "pressed" anhält, wird nachgetriggert. Erst wenn beide Sensoren den state "released" haben, läuft die Ausschaltverzögerung des Lichtes von 120s. Wird während des Timers erneut LS oder TK betätigt, wird nachgetriggert und der Timer abgebrochen.
b) Wenn LS oder TK länger als 600s auf "pressed" stehen (Hilfsvariable: "help.Tageslicht.dum" wird in einem anderen DOIF gesetzt) schaltet das Licht dauerhaft ab. Der Reset erfolgt durch das Zurücksetzten der Sensoren LS und TK auf "released".
c) Der Taster kann das Licht zu jeder Zeit ein und ausschalten, unabhängig von TK und LS.
d) Silverster um Mitternacht geht das Licht für 2h an, unabhängig von TK und LS und die Sicherheitsabschaltung nach 600s
Hat, wie gesagt, bis vor ein paar Wochen mit dem o.a. Code einwandfrei funktioniert.
Christian
ZitatDas mit dem Filter verstehe ich in diesem Zusammenhang nicht!
Falls Du damit
Zitatand [EI.ss.SA.Licht] eq "on"
erreichen wolltest, dass EI.ss.SA.Licht nur off gesetzt wird, wenn es on ist, dann könntest Du das mit
set EI.ss.SA.Licht:FILTER=STATE=on off
erreichen.
Auf den ersten Blick müsste das Rücksetzen des Waittimers klappen. Das gewünschte Verhalten ist aber recht komplex. Ich denke, man kann den Fehler nur aufdecken, wenn man jeden Zustand mitloggt und die tatsächlichen Zustände aller beteiligten Parameter (und ggf. die Zeitstempel) mit den erwarteten Zuständen abgleicht.
Erstmal würde ich klären, ob die Bedingungen im 1. Bedingungszweig nach Beginn des waittimers, auch wirklich alle vorliegen und ein Trigger vorhanden ist.
Das verhindern von "LOOPS" könnte eigentlich nur [EI.ss.SA.Licht] betreffen, denke ich.
Hallo Ellert,
danke Dir für Deine Unterstützung. Werde heute nicht mehr dazu kommen, aber ich denke, am WE werde ich die Sache abspecken, neu aufbauen und hier berichten.
Ich wünsche Dir und allen anderen fhem Usern einen guten Rutsch ins Jahr 2016.
Bis bald,
Spartacus.