Timer eines DOIFs für weitere DOIFs verwenden?

Begonnen von Sirel, 22 November 2015, 16:44:02

Vorheriges Thema - Nächstes Thema

Sirel

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


Damian

#1
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sirel

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

Damian

#3
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
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sirel

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

Damian

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

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sirel

Hi Damian,

gut, werde mit dem Dummy erstmal weitermachen.

Vielen Dank für Deine Hilfe und für das super Modul!

Max