Moin ich habe ein doif, das sehr merkwürdig reagiert. Wenn ich z.B. checkall mache und auch alle Bedingungen für cmd4 erfüllt sind, wird dieses auch geschaltet. Paar sek später wird aber cmd6 (elseif) durchgeführt, obwohl Bedingungen für cmd4 immer noch erfüllt sind. Wodurch kann das sein?
Das doif in vereinfachter form:
(
[{sunset("CIVIL",-1500,"16:31","22:20")}-{sunrise("CIVIL",1800,"06:21","08:00")}] and
[AussenlichtSteuerung:state] eq "on" and
[Yyy:xxx] > 400 )
(set Licht on)
DOELSEIF
(
[{sunset("CIVIL",-1500,"16:31","22:20")}-22:30] and
[AussenlichtSteuerung:state] eq "on" and
[Yyy:xxx] <= 400 )
(set Licht on)
DOELSEIF
(
[6:20-{sunrise("CIVIL",1800,"06:21","08:00")}] and
[AussenlichtSteuerung:state] eq "on" and
[Yyy:xxx] <= 400 )
(set Licht on)
DOELSEIF
(
[{sunset("CIVIL",-1500,"16:31","22:20")}-22:30] and
[AussenlichtSteuerung:state] eq "off" )
(set Licht on)
DOELSEIF
(
[6:20-{sunrise("CIVIL",1800,"06:21","08:00")}] and
[AussenlichtSteuerung:state] eq "off" )
(set Licht on)
DOELSE
(set Licht off)
Es seinen nur Bedingungen 4 und 5 nicht richtig zu laufen...
Wodurch kann das passieren? Andere Bedingungen sind nicht erfüllt. Was übersehe ich?
Grüße
Heatseeker
Ich vermute, dass das Schalten in cmd6 durch ein Event erfolgt, das zum Reading "Yyy:xxx" gehört. Dann werden nur die Zweige geprüft, die dieses Reading enthalten, und weil die Bedingung für cmd4 dies nicht tut, wird cmd4 übergangen und gleich in cmd6 gewechselt.
Damit bei jedem Event alle Zweige geprüft werden, muss das Attribut "checkall" auf "event" gesetzt werden. Wenn es auch für Zeittrigger gelten soll, dann auf "all".
http://fhem.de/commandref_DE.html#DOIF_checkall
Mmmh,
Denke nicht. Der Aussenlichtsteuerung ist ein Dummy Schalter der nur manuell geschaltet wird und yyy:xxx ist der Füllstand des Solarspeichers der im Fall eines ausgeschalteten dummys egal ist...
Was sagt denn das Device und der Event Monitor, wenn fälschlicherweise ausgeschaltet wird? Das bleibt ja nicht ohne Spuren.
Ich sehe leider nur, dass cmd6 ausgelöst hat. Im Eventlog konnte ich noch nichts beobachten, da kommt leider sehr viel rein...
Bei mir haben DOIF's immer Readings für das jeweilige Event mit e_DEVICE_READING.
Wenn der Zeitstempel des e_.. Readings mit dem des state (und cmd-Reading) übreinstimmt, war dieses Event der Trigger.
Eventuell kommst du so weiter.
Das DOELSE würde zumindest auslösen, wenn keine der anderen Bedingungen "wahr" ist. Hast du zusätzlich Attribute gesetzt, die das Verhalten beinflussen können?
Ansonsten schreibe ich mir bei solchen "Problemen" auch gerne mal eine Zeile pro cmd ins Log-File
Log(0,"$SELF: cmd x triggered by $DEVICE with $EVENT");
Dann kann man hinterher im Log schauen (ob) was passiert ist...
Ich kann das leider nur abends wieder beobachten, aber ich meine, dass das e_yyy:xxx gleichzeitig getriggert hat, aber in diesem cmd ist das nicht als Bedingung enthalten... und true ist cmd4 ja trotzdem. Wenn gar keine Bedingung trug ist soll ja das doelse auslösen, nur cmd 4 (Zeit und dummyschalter) sind ja true
Weitere relevante Attribute habe ich nicht.
Muss das mit dem log mal ausprobieren. Wo ko,mt das denn rein?
Zitat von: Heatseeker am 07 August 2024, 15:40:53Muss das mit dem log mal ausprobieren. Wo ko,mt das denn rein?
Bin mir nicht sicher, ob man in der Ausführung selbst Perl und fhem Befehle mischen kann. So sollte es aber funktionieren:
(
[{sunset("CIVIL",-1500,"16:31","22:20")}-{sunrise("CIVIL",1800,"06:21","08:00")}] and
[AussenlichtSteuerung:state] eq "on" and
[Yyy:xxx] > 400 )
(
{
fhem("set Licht on");
Log(0,"$SELF: cmd_1 triggered by $DEVICE with $EVENT");
}
)
DOELSEIF
(
[{sunset("CIVIL",-1500,"16:31","22:20")}-22:30] and
[AussenlichtSteuerung:state] eq "on" and
[Yyy:xxx] <= 400 )
(
{
fhem("set Licht on");
Log(0,"$SELF: cmd_2 triggered by $DEVICE with $EVENT");
}
)
...
Wenn du das in jedem Block einfügst, wird jede Ausführung mit auslösenden Device und Event ins Log geschrieben.
Danke, ich habe es mal für cmd4 und 6 eingebaut. Bin gespannt. Ein checkall schreibt leider nix
Was passiert denn mit den DOIF-Readings beim checkall?
Schaltet er beim checkall die Lampe?
Mmmh,
Da zur Zeit immer nur alles ausgeschaltet werden soll, habe ich sie mal per Hand eingeschaltet und dann ein checkall gemacht. Lampe war danach noch an, obwohl cmd6 sie ausschalten sollte...
Denke da passt was nicht im command...
Edit... habe in wirklichkeit mehrere Lichter zu schalten und habe nun den befehl umgestellt. nun schaltet er...
bekomme im Log nun:
2024-08-07 17:56:24 DOIF AussenlichtSteuerung_doif cmd_nr: 6
2024-08-07 17:56:24 DOIF AussenlichtSteuerung_doif cmd: 6
2024-08-07 17:56:24 DOIF AussenlichtSteuerung_doif cmd_event: AussenlichtSteuerung_doif
2024-08-07 17:56:24 DOIF AussenlichtSteuerung_doif cmd_6
wenn es zyklisch aufgerufen wurde kam:
2024-08-07 17:59:09 DOIF AussenlichSteuerung_doif cmd_nr: 6
2024-08-07 17:59:09 DOIF AussenlichSteuerung_doif cmd: 6
2024-08-07 17:59:09 DOIF AussenlichSteuerung_doif cmd_event: xxx
2024-08-07 17:59:09 DOIF AussenlichSteuerung_doif cmd_6
xxx ist das Device vom redaing xxx:yyy
Ja OK. das XXX hat ausgelöst und scheinbar waren keine der Bedingungen erfüllt sodass er den DOELSE Zweig ausgeführt hat.
Aber das kann ich ohne tieferen Einblick nur vermuten...
Zitat von: tobi01001 am 07 August 2024, 18:10:08Ja OK. das XXX hat ausgelöst und scheinbar waren keine der Bedingungen erfüllt sodass er den DOELSE Zweig ausgeführt hat.
Aber das kann ich ohne tieferen Einblick nur vermuten...
Genau,
xxx:yyy wird alle 30s neu berechnet und triggert vermutlich das doif.
Da z.Z. richtigerweise keine Bedingung erfüllt ist, ist cmd auch richtig. Spannend wird es ab 21:23 dann sollte cmd4 true werden
Aber du hast jetzt nicht alle 30 Sekunden die Einträge im Log, sonst hast du vermutlich zusätzlich ein Attribut do always gesetzt. Ansonsten sollte der Zweig nur einmal bis zum Zustandswechsel des DOIF aufgerufen werden und im Log erscheinen (abgesehen vom checkall).
Zitat von: tobi01001 am 07 August 2024, 21:12:31Aber du hast jetzt nicht alle 30 Sekunden die Einträge im Log, sonst hast du vermutlich zusätzlich ein Attribut do always gesetzt. Ansonsten sollte der Zweig nur einmal bis zum Zustandswechsel des DOIF aufgerufen werden und im Log erscheinen (abgesehen vom checkall).
ja genau,
so nun hatte ich die Einträge...
Also
2024-08-07 21:23:16 DOIF AussenlichSteuerung_doif cmd_nr: 4
2024-08-07 21:23:16 DOIF AussenlichSteuerung_doif cmd: 4
2024-08-07 21:23:16 DOIF AussenlichSteuerung_doif cmd_event: timer_7
2024-08-07 21:23:16 DOIF AussenlichSteuerung_doif cmd_4
Korrekt, Bedingung ist nach dem Timer true geworden. Licht wurde geschaltet...
aber dann...
2024-08-07 21:23:26 DOIF AussenlichSteuerung_doif cmd_nr: 6
2024-08-07 21:23:26 DOIF AussenlichSteuerung_doif cmd: 6
2024-08-07 21:23:26 DOIF AussenlichSteuerung_doif cmd_event: xxx
2024-08-07 21:23:26 DOIF AussenlichSteuerung_doif cmd_6
wurde es wieder abgeschaltet wegen des xxx readings was aber, wenn man alle Bedinungen von vorne bis hinten ausführt nicht wieder cmd6 (elseif) seind dürfen, da cmd4 immer noch erfüllt ist...
ich versteh das doif nicht.
natürlich könnte ich das xxx reading so setzten dass es immer irgendwie true ist, aber das kann ja nicht Sinn der Sche sein...
Wenn ich xxx ebenfalls in vmd4 als Bedingung mit aufführen sodass diese immer true ist, funktioniert es aber nicht wenn ich es nicht als Bedingung betrachte...
Für mich nicht wirklich ein logisches Verhalten... :-X
Deinen Ausführungen zufolge vermute ich, dass du xxx:yyy gar nicht als Trigger benötigst, sondern zum gegebenen Zeitpunkt in Abhängigkeit des dummy [AussenlichtSteuerung:state] das Licht einschalten möchtest.
Dann kannst du den trigger mit
[?Yyy:xxx] > 400
unterdrücken. Damit wird beim Eintreten der verbleibenden Ereigniss yyy:xxx nur geprüft abr nicht auf Events von yyy:xxx reagiert.
Was du eigentlich erreichen möchtest im Automatikbetrieb:
- Wenn genug Reserve da ist, ist Licht an von Sonnenuntergang bis Sonnenaufgang (frühestens ab 16:31, spätestens ab 22:20 bis frühestens 06:21 und spätestens 08:00).
- Wenn zu wenig Reserve da ist oder die Aussenlichtseuerung inaktiv, ist Licht aus zwischen 22:30 und 06:20 aus.
- zwischen Sonnenaufgang und Sonnenuntergasng ist das Licht aus
Zwischen 22:20 und 22:30 ist das Licht übrigens immer an. Ebenso zwischen 06:20 und 06:21... Soll das so?
Das lässt sich mit umgekehrter Logik wohl einfacher erreichen:
([{sunrise("CIVIL",1800,"06:21","08:00")}-{sunset("CIVIL",-1500,"16:31","22:20")}] or (([AussenlichtSteuerung:state] eq "off" or [Yyy:xxx] <= 400) and [22:30-06:20]))
(set Licht off)
DOELSE
(set Licht on)
Zwischen Sonnenaufgang und Untergang ist das Licht auf jeden Fall aus. Nachts ist das Licht aus wenn entweder die Automatiksteuerung aus ist oder yyy:xxx <= 400 ist (oder wird). Ansonsten ist das Licht an.
Fällt in der Zeit von 22:30 - 06:20 yyy:xxx unter 400, geht das Licht aus...