Zeitbereich mit DOIF

Begonnen von manne44, 04 Januar 2018, 20:19:34

Vorheriges Thema - Nächstes Thema

manne44

Hallo,
mal eine kurze Frage:
Wenn ich innerhalb eines Zeitbereiches mit DOIF folgendes angebe:

define di_swS20_1_Ctrl DOIF ([[swS20_1_On_Time] - [swS20_1_Off_Time]]) (set swS20_1 on) DOELSE (set swS20_1 off)

Das funktioniert auch, aber wenn ich innerhalb dieser Zeit (hh:mm:ss) "einsteige", also fhem.cfg speichere, dann passiert nichts. Das DOIF scheint nur dann zu triggern, wenn die Startzeit erkannt wird. Ist das so?
Ich möchte aber, dass das gleiche auch bei Angabe eines Zeitbereiches passiert wie bei
define ActTime dummy
define at_ActTime at +*00:00:01 { fhem 'set ActTime '.time() }
define di_swS20_1_Ctrl DOIF (([ActTime] > [swS20_1_On_TimeSec]) and ([ActTime] < [swS20_1_Off_TimeSec])) (set swS20_1 on) DOELSE (set swS20_1 off)
Hier wird in jedem Fall geschaltet und die Zeit wird als Unixtime in Sekunden angegeben.
Wie ich die time-Funktion in dem DOIF-Teil direkt unterbringen kann, das weiß ich leider nicht.
RPI4-Buster mit SSD, RPI-Zero mit Bookworm

Damian

Zitat von: manne44 am 04 Januar 2018, 20:19:34
Hallo,
mal eine kurze Frage:
Wenn ich innerhalb eines Zeitbereiches mit DOIF folgendes angebe:

define di_swS20_1_Ctrl DOIF ([[swS20_1_On_Time] - [swS20_1_Off_Time]]) (set swS20_1 on) DOELSE (set swS20_1 off)

Das funktioniert auch, aber wenn ich innerhalb dieser Zeit (hh:mm:ss) "einsteige", also fhem.cfg speichere, dann passiert nichts. Das DOIF scheint nur dann zu triggern, wenn die Startzeit erkannt wird. Ist das so?

So ist es, du musst dem Modul beibringen, was "einsteigen" bedeutet.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

manne44

Vielen Dank, das hatte ich mir schon gedacht. Deshalb habe ich das mit meinen rudimentären Perl-Kenntnissen "zu Fuß" in Perl realisiert. Funktioniert auch tadellos, aber trotzdem vielen Dank für DOIF, was sehr vieles sehr viel einfacher macht.
RPI4-Buster mit SSD, RPI-Zero mit Bookworm

Damian

Zitat von: manne44 am 05 Januar 2018, 01:48:24
Vielen Dank, das hatte ich mir schon gedacht. Deshalb habe ich das mit meinen rudimentären Perl-Kenntnissen "zu Fuß" in Perl realisiert. Funktioniert auch tadellos, aber trotzdem vielen Dank für DOIF, was sehr vieles sehr viel einfacher macht.

Du musst nur genau definieren, was du unter "einsteigen" verstehst, dann kannst du es genauso mit and und deiner Zeitspanne verknüpfen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

manne44

#4
In diesem Zusammenhang habe ich noch eine Frage, weil ich in dieser DOIF-Abfrage eine Unstimmigkeit entdeckt habe, die ich mir nicht erklären kann. Und zwar habe ich eine geflashte SonOff-Schaltsteckdose, die verschiedene Modi beherrschen soll: Innerhalb eines Zeitbereiches oder nur nach Helligkeit oder kombiniert Helligkeit und innerhalb des Zeitbereiches usw. schalten. Auch abhängig davon,ob der Homestatus Present oder Absent ist, also nur wenn zuhause oder nur wenn abwesend, entweder nur nachts oder nur am Tage.
Dazu habe ich eine DOIF-Abfrage, die schematisch so aussieht:


define di_XY DOIF (Ax and T and (C or ((D and E) or (F and G)))) (Switch ON)
   DOELSEIF (Bx and Lx and Ly and (C or ((D and E) or (F and G)))) (Switch ON)
   DOELSEIF (Cx and Ly and T and (C or ((D and E) or (F and G)))) (Switch ON)
   DOELSEIF (Dx and Lx and T and (C or ((D and E) or (F and G)))) (Switch ON)
   DOELSEIF (Ex and Ly and (C or ((D and E) or (F and G)))) (Switch ON)
   DOELSEIF (Fx and Lx and (C or ((D and E) or (F and G)))) (Switch ON)
   DOELSEIF (Dx) (log)
   DOELSE (Switch OFF)


Im Logfile sehe ich dann bei der Betriebsart LDR_NIGHT folgende Einträge:

2018.01.10 08:00:00 2: AUTOMATIK: swS20_1:AUS X -  Betriebsart:LDR_NIGHT Present:PRESENT HomePresence:present ActTime:08:00:00 OnTime:08:00:00 OffTime:23:50:00 actLDR:20  LDR_on:50 LDR_off:1000
2018.01.10 08:01:36 2: AUTOMATIK: swS20_1:EIN F -  Betriebsart:LDR_NIGHT Present:PRESENT HomePresence:present ActTime:08:01:36 OnTime:08:00:00 OffTime:23:50:00 actLDR:29  LDR_on:50 LDR_off:1000
2018.01.10 08:11:11 2: AUTOMATIK: swS20_1:AUS X -  Betriebsart:LDR_NIGHT Present:PRESENT HomePresence:present ActTime:08:11:11 OnTime:08:00:00 OffTime:23:50:00 actLDR:59  LDR_on:50 LDR_off:1000


Es ist aber so, dass in dieser Betriebsart, die im schematischen DOIF der Betriebsart Fx entspricht, der Switch solange EIN sein soll wie actLDR < LDR_on ist, aber um OnTime wird ausgeschaltet, was in dieser Betriebsart nicht relevant ist, und dann erkennt DOIF seinen Fehler und schaltet wieder EIN, um richtig bei actLDR > LDR_on auszuschalten.
Ich verstehe das nicht. DOIF geht abends bei actLDR < LDR_on in den richtigen Zweig und schaltet ein. Wenn die aktuelle Zeit die Zeit OnTime erreicht, wobei dieser Wert in dieser Betriebsart  aber keine Rolle spielen sollte, dann wird falsch ausgeschaltet.
Mir kommt es so vor, als ob immer dann das DOIF getriggert wird, wenn sich einer der dortigen Werte ändert. Und nun ist es 8:00 Uhr, der Wert, der hier nicht relevant ist, es werden alle Zweige abgeprüft, die etwas mit dieser Zeit zu tun haben, was aber nirgends zu einer wahren Aussage führt und dann geht es in den DOELSE-Zweig und es wird abgeschaltet. Aber werden die Zweige nicht der Reihe nach abgearbeitet, so dass die Zweige nicht betreten werden, wo schon die erste Bedingung nicht stimmt? Nach meine Erinnerung ist das in C so, dass bei If-Bedingungen schon dann abgebrochen wird, wenn schon die erste Bedingung nicht stimmt, hier offenbar nicht.
Was kann ich denn tun, damit das hier richtig schaltet?
RPI4-Buster mit SSD, RPI-Zero mit Bookworm

Damian

Bei DOIF werden nur Zweige geprüft, bei denen auch der aktuelle Trigger des Events vorkommt.

Bei DOELSEIF wird aufgehört, wenn die Bedingung wahr ist. Diese Verhalten entspricht elsif in Perl.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF