Hallo zusammen,
ich habe mehrere DOIFs, welche teilweise in Abhängigkeit zueinander stehen. In einem DOIF werden bspw. zufällige Startzeiten erzeugt. Damit ein anderes DOIF nicht vor dieser Startzeit aktiv wird, schreibe ich über ein "at" die geupdatete Timerzeiten des ersten DOIFs eine Minute nach Mitternacht in einen Dummy. Dieser wird von DOIF 2 wiederum als Bedingung ausgelsen.
Frage: Gibt es vielleicht noch eine elegantere Lösung, wie ich das Reading des ersten DOIF's direkt als Bedingung einbinden kann? Ich scheitere daran, das Zeitfromat, ohne Datumsangabe, auszulesen.
Vielen Dank für eure Hilfe vorab,
Max
Zitat von: Sirel am 22 November 2015, 16:44:02
Hallo zusammen,
ich habe mehrere DOIFs, welche teilweise in Abhängigkeit zueinander stehen. In einem DOIF werden bspw. zufällige Startzeiten erzeugt. Damit ein anderes DOIF nicht vor dieser Startzeit aktiv wird, schreibe ich über ein "at" die geupdatete Timerzeiten des ersten DOIFs eine Minute nach Mitternacht in einen Dummy. Dieser wird von DOIF 2 wiederum als Bedingung ausgelsen.
Frage: Gibt es vielleicht noch eine elegantere Lösung, wie ich das Reading des ersten DOIF's direkt als Bedingung einbinden kann? Ich scheitere daran, das Zeitfromat, ohne Datumsangabe, auszulesen.
Vielen Dank für eure Hilfe vorab,
Max
Du kannst zufällige Startzeiten im Zeitintervall mit or verknüpft in einem DOIF angeben, dann brauchst du kein weiteres DOIF oder at.
Gruß
Damian
Hi Damian,
das meine ich nicht.
Ein Beispiel:
Ich habe einen Bewegungsmelder draußen, der triggert ein DOIF zum schließen der Rollläden, sobald sich etwas bewegt. Meldet der Bewegungsmelder keine Bewegung mehr, fahren die Rollläden mit einem zufälligen Zeitverzug wieder hoch. Nennen wir es mal Einbruchschutz.
Zeitgleich habe ich eine Anwesenheitssimulation laufen (ein anderes DOIF), welche alle Rollläden morgens zu einer zufälligen Zeit öffnet. Heute war es kurz vor 11.
Nun hat sich heute aber bereits vor 11 Uhr etwas im Garten bewegt, wordurch die durch DOIF 1 definierten Rollläden nach der "Bewegung" hochfuhren. Die übrigen blieben geschlossen bis DOIF 2 auslöste.
Daher würde ich gerne die aus DOIF 2 generierte Zeit mit ins DOIF 1 einfließen lassen, so dass das Modul nicht vor dieser Zeit aktiv wird.
Wie gesagt, heute mache ich das über den Umweg mit einem Dummy. Könnte ich nicht in DOIF 1 irgendwie den Timer von DOIF2 direkt auslesen?
Besten Dank für Deine Hilfe vorab,
Max
Zitat von: Sirel am 22 November 2015, 18:36:20
Hi Damian,
das meine ich nicht.
Ein Beispiel:
Ich habe einen Bewegungsmelder draußen, der triggert ein DOIF zum schließen der Rollläden, sobald sich etwas bewegt. Meldet der Bewegungsmelder keine Bewegung mehr, fahren die Rollläden mit einem zufälligen Zeitverzug wieder hoch. Nennen wir es mal Einbruchschutz.
Zeitgleich habe ich eine Anwesenheitssimulation laufen (ein anderes DOIF), welche alle Rollläden morgens zu einer zufälligen Zeit öffnet. Heute war es kurz vor 11.
Nun hat sich heute aber bereits vor 11 Uhr etwas im Garten bewegt, wordurch die durch DOIF 1 definierten Rollläden nach der "Bewegung" hochfuhren. Die übrigen blieben geschlossen bis DOIF 2 auslöste.
Daher würde ich gerne die aus DOIF 2 generierte Zeit mit ins DOIF 1 einfließen lassen, so dass das Modul nicht vor dieser Zeit aktiv wird.
Wie gesagt, heute mache ich das über den Umweg mit einem Dummy. Könnte ich nicht in DOIF 1 irgendwie den Timer von DOIF2 direkt auslesen?
Besten Dank für Deine Hilfe vorab,
Max
Es sind doch die gleichen Rollläden, also sollte alles in einem einzigen DOIF machbar sein.
Mit konkreten Definitionsangaben, kann ich dir auch konkrete Vorschläge machen.
Gruß
Damian
Hi Damian,
gerne, hier mal die 2 DOIFs:
Zunächst mein Einbruchschutz:
Internals:
DEF ([BM_Aussen:motion] eq "on" and [?BM_Aussen:brightness] > [Schwellwert_dunkelheit] and [?rgr_Bewohner] =~ /gone|absent/) (set struc_RL_Gaestezimmer [FILTER=state!=closed:FILTER=state!=off] Runter, set struc_RL_EG_Gesamt [FILTER=state!=closed:FILTER=state!=off] Runter) DOELSEIF ([BM_Aussen:motion] eq "off" and [?BM_Aussen:brightness] > [Schwellwert_dunkelheit] and [?rgr_Bewohner] =~ /gone|absent/) (set struc_RL_Gaestezimmer [FILTER=state!=open:FILTER=state!=on] Hoch, set struc_RL_EG_Gesamt [FILTER=state!=open:FILTER=state!=on] Hoch) DOELSE
NAME di_Einbruchschutz_absent
NR 167
NTFY_ORDER 50-di_Einbruchschutz_absent
STATE initialized
TYPE DOIF
Readings:
2015-11-22 19:15:28 state initialized
Condition:
0 ReadingValDoIf('BM_Aussen','motion','') eq "on" and ReadingValDoIf('BM_Aussen','brightness','') > InternalDoIf('Schwellwert_dunkelheit','STATE','') and InternalDoIf('rgr_Bewohner','STATE','') =~ /gone|absent/
1 ReadingValDoIf('BM_Aussen','motion','') eq "off" and ReadingValDoIf('BM_Aussen','brightness','') > InternalDoIf('Schwellwert_dunkelheit','STATE','') and InternalDoIf('rgr_Bewohner','STATE','') =~ /gone|absent/
Devices:
0 BM_Aussen Schwellwert_dunkelheit
1 BM_Aussen Schwellwert_dunkelheit
all BM_Aussen Schwellwert_dunkelheit
Do:
0:
0 set struc_RL_Gaestezimmer [FILTER=state!=closed:FILTER=state!=off] Runter, set struc_RL_EG_Gesamt [FILTER=state!=closed:FILTER=state!=off] Runter
1:
0 set struc_RL_Gaestezimmer [FILTER=state!=open:FILTER=state!=on] Hoch, set struc_RL_EG_Gesamt [FILTER=state!=open:FILTER=state!=on] Hoch
2:
0
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Internals:
0 Schwellwert_dunkelheit:STATE
1 Schwellwert_dunkelheit:STATE
all Schwellwert_dunkelheit:STATE
Itimer:
Readings:
0 BM_Aussen:motion
1 BM_Aussen:motion
all BM_Aussen:motion
State:
Timerfunc:
Attributes:
wait :600
Und hier die Anwesenheitssimulation:
Internals:
DEF ([rgr_Bewohner] =~ /gone|absent/ and [BM_Aussen:brightness] < [Schwellwert_dunkelheit] and [?16:00-23:00]) (set struc_RL_Alle [FILTER=state!=closed:FILTER=state!=off] Runter) DOELSEIF ([rgr_Bewohner] =~ /gone|absent/ and (([?07:45-09:00|8] and [BM_Aussen:brightness] > [Schwellwert_dunkelheit]) or [([10:30]+int(rand(3600)))|7])) (set struc_RL_Alle [FILTER=state!=open:FILTER=state=off] Hoch) DOELSE
NAME di_Rollladensteuerung_Absent
NR 111
NTFY_ORDER 50-di_Rollladensteuerung_Absent
STATE initialized
TYPE DOIF
Readings:
2015-11-22 19:16:55 state initialized
2015-11-22 19:16:55 timer_1_c1 23.11.2015 16:00:00
2015-11-22 19:16:55 timer_2_c1 22.11.2015 23:00:00
2015-11-22 19:16:55 timer_3_c2 23.11.2015 07:45:00|8
2015-11-22 19:16:55 timer_4_c2 23.11.2015 09:00:00|8
2015-11-22 19:16:55 timer_5_c2 23.11.2015 11:00:57|7
Condition:
0 InternalDoIf('rgr_Bewohner','STATE','') =~ /gone|absent/ and ReadingValDoIf('BM_Aussen','brightness','') < InternalDoIf('Schwellwert_dunkelheit','STATE','') and DOIF_time($hash,$hash->{realtime}{0},$hash->{realtime}{1},$wday,$hms,"")
1 InternalDoIf('rgr_Bewohner','STATE','') =~ /gone|absent/ and ((DOIF_time($hash,$hash->{realtime}{2},$hash->{realtime}{3},$wday,$hms,"8") and ReadingValDoIf('BM_Aussen','brightness','') > InternalDoIf('Schwellwert_dunkelheit','STATE','')) or DOIF_time_once($hash,$hash->{timer}{4},$wday,"7"))
Days:
2 8
3 8
4 7
Devices:
0 rgr_Bewohner BM_Aussen Schwellwert_dunkelheit
1 rgr_Bewohner BM_Aussen Schwellwert_dunkelheit
all rgr_Bewohner BM_Aussen Schwellwert_dunkelheit
Do:
0:
0 set struc_RL_Alle [FILTER=state!=closed:FILTER=state!=off] Runter
1:
0 set struc_RL_Alle [FILTER=state!=open:FILTER=state=off] Hoch
2:
0
Helper:
globalinit 1
last_timer 5
sleeptimer -1
Internals:
0 rgr_Bewohner:STATE Schwellwert_dunkelheit:STATE
1 rgr_Bewohner:STATE Schwellwert_dunkelheit:STATE
all rgr_Bewohner:STATE Schwellwert_dunkelheit:STATE
Itimer:
Readings:
0 BM_Aussen:brightness
1 BM_Aussen:brightness
all BM_Aussen:brightness
Realtime:
0 16:00:00
1 23:00:00
2 07:45:00
3 09:00:00
4 11:00:57
State:
Time:
0 16:00:00
1 23:00:00
2 07:45:00
3 09:00:00
4 ([10:30]+int(rand(3600)))
Timecond:
0 0
1 0
2 1
3 1
4 1
Timer:
0 0
1 0
2 0
3 0
4 0
Timerfunc:
Timers:
1 4
Attributes:
wait 900
Den Dummy habe ich in dieser Umgebung noch nich mit eingebaut. Das problem tritt eben auch nur am Wochenende ein, wo keine Helligkeit mit abgefragt wird ( [([10:30]+int(rand(3600)))|7]) ).
Ich würde daher gerne die Realtime 4 abfragen, dann noch 1 minute dazu addieren und dann wären die beiden DOIFS wieder parallel unterwegs.
Ich hoffe, Du steigst da noch irgendwie durch ;)
Viele Grüße,
Max
Ja, es ist schon etwas komplexer und es sind ja offenbar nicht alles die gleichen Rollläden, daher kann man sie nicht im gleichen DO-Fall abwickeln. Timer abfragen ist komplizierter, weil sie Datum beinhalten. Evtl. kannst du den Status des anderen DOIF-Moduls abfragen. Ansonsten würde ich es bei der Lösung über ein Dummy belassen.
Gruß
Damian
Hi Damian,
gut, werde mit dem Dummy erstmal weitermachen.
Vielen Dank für Deine Hilfe und für das super Modul!
Max