Wunsch: Zeitfenster bei DOIF optional ab Mitternacht

Begonnen von Morgennebel, 25 Januar 2017, 21:08:33

Vorheriges Thema - Nächstes Thema

Morgennebel

Moin Moin,


beim ausprobieren von Zeitfenstern bei DOIF-Anweisungen ist mir oft aufgefallen, daß der nächste Schaltpunkt erst morgen ist.

Z.B.

define DI_Demo DOIF ([18:00-02:30|7] and ...) (set light on)

würde abends um 21 Uhr erst am nächsten Tag zuschlagen. Das macht das ausprobieren und testen recht langsam und manchmal soll z.B. die Beleuchtung schon am selben Tag wieder angehen.

Es wäre daher toll, wenn man DOIF über ein Attribut überzeugen könnte, diese Uhrzeiten ab Mitternacht des heutigen Tages zu betrachten - d.h. das Beispiel um 21 Uhr definiert würde sofort in cmd1 springen.

Danke, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Damian

Zitat von: Morgennebel am 25 Januar 2017, 21:08:33
Moin Moin,


beim ausprobieren von Zeitfenstern bei DOIF-Anweisungen ist mir oft aufgefallen, daß der nächste Schaltpunkt erst morgen ist.

Z.B.

define DI_Demo DOIF ([18:00-02:30|7] and ...) (set light on)

würde abends um 21 Uhr erst am nächsten Tag zuschlagen. Das macht das ausprobieren und testen recht langsam und manchmal soll z.B. die Beleuchtung schon am selben Tag wieder angehen.

Es wäre daher toll, wenn man DOIF über ein Attribut überzeugen könnte, diese Uhrzeiten ab Mitternacht des heutigen Tages zu betrachten - d.h. das Beispiel um 21 Uhr definiert würde sofort in cmd1 springen.

Danke, -MN

wenn 18:00 Uhr vorbei ist, wann soll denn deiner Meinung nach der nächste Timetrigger kommen?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Morgennebel

Zitat von: Damian am 25 Januar 2017, 21:50:00
wenn 18:00 Uhr vorbei ist, wann soll denn deiner Meinung nach der nächste Timetrigger kommen?

Mit gesetztem Attribut sofort... Das ganze ist ja ein Zeitfenster und um 21 Uhr wäre ich mitten drin...

Danke, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Damian

Zitat von: Morgennebel am 25 Januar 2017, 22:03:21
Mit gesetztem Attribut sofort... Das ganze ist ja ein Zeitfenster und um 21 Uhr wäre ich mitten drin...

Danke, -MN

Das Intervall ist doch heute bis 00:00 wahr und ab 00:00 bis 02:30 nach Mitternacht.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Morgennebel

Hi Damian,


das Intervall ist nach einem SAVE nicht wahr - obwohl 21:00 (SAVE-Zeitpunkt) im Fenster [18:00-02:30] liegt. Das ist ja mein Wunsch.

Schau mal hier:

Internals:
   DEF        ([18:00-09:00] and [Gewaechshaus.Katzenhaus:temperature] < 0)
   (set Scheune.4Switch_Sw_Gewaechshaus on)
DOELSE
   (set Scheune.4Switch_Sw_Gewaechshaus off)
   NAME       DI_KatzenHausHintenHeizung
   NR         1124
   NTFY_ORDER 50-DI_KatzenHausHintenHeizung
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2017-01-26 09:43:03   Device          Gewaechshaus.Katzenhaus
     2017-01-25 23:23:15   cmd             2
     2017-01-25 23:23:15   cmd_event       Gewaechshaus.Katzenhaus
     2017-01-25 23:23:15   cmd_nr          2
     2017-01-26 09:43:03   e_Gewaechshaus.Katzenhaus_temperature 3.9
     2017-01-25 23:23:15   state           cmd_2
     2017-01-26 09:00:00   timer_01_c01    26.01.2017 18:00:00
     2017-01-26 09:00:00   timer_02_c01    27.01.2017 09:00:00
     2017-01-25 23:23:14   wait_timer      no timer
   Condition:
     0          DOIF_time($hash,0,1,$wday,$hms) and ReadingValDoIf($hash,'Gewaechshaus.Katzenhaus','temperature') < 0
   Days:
   Devices:
     0           Gewaechshaus.Katzenhaus
     all         Gewaechshaus.Katzenhaus
   Do:
     0:
       0          set Scheune.4Switch_Sw_Gewaechshaus on
     1:
       0          set Scheune.4Switch_Sw_Gewaechshaus off
   Helper:
     event      battery: ok,humidity: 70,absFeuchte: 4.4,T: 3.9 H: 70 D: -1.1 A: 4.4
     globalinit 1
     last_timer 2
     sleepdevice Gewaechshaus.Katzenhaus
     sleepsubtimer -1
     sleeptimer -1
     timerdev   Gewaechshaus.Katzenhaus
     timerevent battery: ok,humidity: 70,absFeuchte: 4.4,T: 3.9 H: 70 D: -1.1 A: 4.4
     triggerDev Gewaechshaus.Katzenhaus
     timerevents:
       battery: ok
       humidity: 70
       absFeuchte: 4.4
       T: 3.9 H: 70 D: -1.1 A: 4.4
     timereventsState:
       battery: ok
       humidity: 70
       absFeuchte: 4.4
       T: 3.9 H: 70 D: -1.1 A: 4.4
     triggerEvents:
       battery: ok
       humidity: 70
       absFeuchte: 4.4
       T: 3.9 H: 70 D: -1.1 A: 4.4
     triggerEventsState:
       battery: ok
       humidity: 70
       absFeuchte: 4.4
       T: 3.9 H: 70 D: -1.1 A: 4.4
   Internals:
   Interval:
     0          -1
     1          0
   Itimer:
   Localtime:
     0          1485450000
     1          1485504000
   Readings:
     0           Gewaechshaus.Katzenhaus:temperature
     all         Gewaechshaus.Katzenhaus:temperature
   Realtime:
     0          18:00:00
     1          09:00:00
   Regexp:
     0:
     All:
   State:
   Time:
     0          18:00:00
     1          09:00:00
   Timecond:
     0          0
     1          0
   Timer:
     0          0
     1          0
   Timers:
     0           0  1
   Trigger:
   Triggertime:
     1485450000:
       localtime  1485450000
       Hash:
     1485504000:
       localtime  1485504000
       Hash:
Attributes:
   room       Aussen,Gewaechshaus,Scheune
   wait       300:5400


Wenn dieses DOIF nach 18:00 Uhr aber vor 09:00 Uhr (also abends) geändert und gespeichert wird, wird timer_01_c01 auf 18:00 Uhr des Folgetages berechnet. Damit feuert das DOIF den ganzen verbleibenden Tag nicht mehr.

Ich fände es ganz hilfreich, wenn man DOIF über ein neues Attribut sagen könnte, daß timer_01_c01 für heute berechnet werden soll und dann nach dem speichern um 21:00 Uhr der Event nochmals erzeugt wird.

In Pseudocode ausgedrückt:


  if (DOIFDefinitionSaved) {         ## Nach dem Save (Anlegen/Update eines DOIFs)

     ## Calculate Timer-Events
    @events = IdentifyHoursAndMinutesFromDefinition();

     ## Ist das mögliche neue Attribut FromMidnight gesetzt   
     if (DOIFAttrFromMidnight) {   
            for each $event (@events) {
                 adjustDateToToday();
            }

           ## Finde den letzten Event bei allen moeglichen
           for each $event (@events) {
                 $lastevent = MIN($event, $now);
           }

           ## Sind wir in einem der Zeitfenster           
           if (match(now(), $lastevent, $matchingEvent())
                 triggerEventDOIFCmd();
     }
     else {
             ## Wie gewohnt...
     }


Dies würde bei allen DOIF-Definitionen helfen, die z.B. Heizungen und Raumklima steuern und dabei Zeitfenster verwenden - z.B. für eine Nachtabsenkung, für Heizperioden, für Aquarien usw. Bei all diesen muß ich momentan aufpassen, wann ich das DOIF modifiziere, damit es am nächsten Tag korrekt läuft.
Derweil friere ich in der Nacht, die Fische sind "on ice" usw.

Ich fände es sehr hilfreich, wenn die DOIFs immer geändert werden könnten, das System aber weiterläuft und eventuelle Zeitfenster in der Definition berücksichtigt.

Danke, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Damian

Auch hier ist es so, dass du durch die Änderung der Zeit ein Intervall [18:00-09:00] definiert hast. Dieses Intervall ist per Definition von 18:00 Uhr bis 00:00 am selben Tag und nach Mitternacht von 00:00 Uhr bis 09:00 wahr. Es ist also am selben Tag um 21:00 wahr.

Wenn cmd_2 innerhalb dieser Zeit zuschlägt, dann nicht weil das Intervall nicht wahr ist, sondern weil deine mit and verknüpfte Bedingung hier  [Gewaechshaus.Katzenhaus:temperature] < 0) nicht wahr ist.


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

Damian

#6
Zitat von: Damian am 26 Januar 2017, 10:44:11
Auch hier ist es so, dass du durch die Änderung der Zeit ein Intervall [18:00-09:00] definiert hast. Dieses Intervall ist per Definition von 18:00 Uhr bis 00:00 am selben Tag und nach Mitternacht von 00:00 Uhr bis 09:00 wahr. Es ist also am selben Tag um 21:00 wahr.

Wenn cmd_2 innerhalb dieser Zeit zuschlägt, dann nicht weil das Intervall nicht wahr ist, sondern weil deine mit and verknüpfte Bedingung hier  [Gewaechshaus.Katzenhaus:temperature] < 0) nicht wahr ist.

Wenn du nach einer Änderung der Zeit noch mal cmd_1 ausgelöst haben willst, dann musst du mit der Änderung der Zeit mit set <dein_DOIF_Modul> initialize das DOIF-Modul neu initialisieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Morgennebel

Hi Damian,


zunächst ein Danke, daß Du mir zuhörst, mir antwortest und versuchst zu helfen...

Zitat von: Damian am 26 Januar 2017, 10:44:11
Auch hier ist es so, dass du durch die Änderung der Zeit ein Intervall [18:00-09:00] definiert hast. Dieses Intervall ist per Definition von
8:00 Uhr bis 00:00 am selben Tag und nach Mitternacht von 00:00 Uhr bis 09:00 wahr. Es ist also am selben Tag um 21:00 wahr.

Das ist das von mir gewünschte Verhalten. In der Realität funktioniert dies bei mir aber nicht.

Hier ist ein DOIF, daß von 18:00 (heute) bis 09:00 (morgen) zuschlagen soll. Achte bitte auf timer_01_c01, dieser zeigt auf den 26. Januar 2017.


Internals:
   DEF        ([18:00-09:00] and [Gewaechshaus.Katzenhaus:temperature] < 0)
   (set Scheune.4Switch_Sw_Gewaechshaus on)
DOELSE
   (set Scheune.4Switch_Sw_Gewaechshaus off)
   NAME       DI_KatzenHausHintenHeizung
   NR         1124
   NTFY_ORDER 50-DI_KatzenHausHintenHeizung
   STATE      cmd_2
   TYPE       DOIF
   Readings:
     2017-01-26 19:07:19   Device          Gewaechshaus.Katzenhaus
     2017-01-25 23:23:15   cmd             2
     2017-01-25 23:23:15   cmd_event       Gewaechshaus.Katzenhaus
     2017-01-25 23:23:15   cmd_nr          2
     2017-01-26 19:07:19   e_Gewaechshaus.Katzenhaus_temperature 2.1
     2017-01-25 23:23:15   state           cmd_2
     2017-01-26 09:00:00   timer_01_c01    26.01.2017 18:00:00
     2017-01-26 09:00:00   timer_02_c01    27.01.2017 09:00:00
     2017-01-25 23:23:14   wait_timer      no timer
   Condition:
     0          DOIF_time($hash,0,1,$wday,$hms) and ReadingValDoIf($hash,'Gewaechshaus.Katzenhaus','temperature') < 0
   Days:
   Devices:
     0           Gewaechshaus.Katzenhaus
     all         Gewaechshaus.Katzenhaus
   Do:
     0:
       0          set Scheune.4Switch_Sw_Gewaechshaus on
     1:
       0          set Scheune.4Switch_Sw_Gewaechshaus off
   Helper:
     event      battery: ok,humidity: 67,absFeuchte: 3.7,T: 2.1 H: 67 D: -3.4 A: 3.7
     globalinit 1
     last_timer 2
     sleepdevice Gewaechshaus.Katzenhaus
     sleepsubtimer -1
     sleeptimer -1
     timerdev   Gewaechshaus.Katzenhaus
     timerevent battery: ok,humidity: 67,absFeuchte: 3.7,T: 2.1 H: 67 D: -3.4 A: 3.7
     triggerDev Gewaechshaus.Katzenhaus
     timerevents:
       battery: ok
       humidity: 67
       absFeuchte: 3.7
       T: 2.1 H: 67 D: -3.4 A: 3.7
     timereventsState:
       battery: ok
       humidity: 67
       absFeuchte: 3.7
       T: 2.1 H: 67 D: -3.4 A: 3.7
     triggerEvents:
       battery: ok
       humidity: 67
       absFeuchte: 3.7
       T: 2.1 H: 67 D: -3.4 A: 3.7
     triggerEventsState:
       battery: ok
       humidity: 67
       absFeuchte: 3.7
       T: 2.1 H: 67 D: -3.4 A: 3.7
   Internals:
   Interval:
     0          -1
     1          0
   Itimer:
   Localtime:
     0          1485450000
     1          1485504000
   Readings:
     0           Gewaechshaus.Katzenhaus:temperature
     all         Gewaechshaus.Katzenhaus:temperature
   Realtime:
     0          18:00:00
     1          09:00:00
   Regexp:
     0:
     All:
   State:
   Time:
     0          18:00:00
     1          09:00:00
   Timecond:
     0          0
     1          0
   Timer:
     0          0
     1          0
   Timers:
     0           0  1
   Trigger:
   Triggertime:
     1485504000:
       localtime  1485504000
       Hash:
Attributes:
   room       Aussen,Gewaechshaus,Scheune
   wait       300:5400


Ich habe dies genau jetzt (19:11) geändert und die Uhrzeit leicht variiert:


Internals:
   DEF        ([18:00-08:30] and [Gewaechshaus.Katzenhaus:temperature] < 0)
   (set Scheune.4Switch_Sw_Gewaechshaus on)
DOELSE
   (set Scheune.4Switch_Sw_Gewaechshaus off)
   NAME       DI_KatzenHausHintenHeizung
   NR         1124
   NTFY_ORDER 50-DI_KatzenHausHintenHeizung
   STATE      initialized
   TYPE       DOIF
   Readings:
     2017-01-26 19:09:25   cmd             0
     2017-01-26 19:09:25   state           initialized
     2017-01-26 19:09:25   timer_01_c01    27.01.2017 18:00:00
     2017-01-26 19:09:25   timer_02_c01    27.01.2017 08:30:00
   Condition:
     0          DOIF_time($hash,0,1,$wday,$hms) and ReadingValDoIf($hash,'Gewaechshaus.Katzenhaus','temperature') < 0
   Days:
   Devices:
     0           Gewaechshaus.Katzenhaus
     all         Gewaechshaus.Katzenhaus
   Do:
     0:
       0          set Scheune.4Switch_Sw_Gewaechshaus on
     1:
       0          set Scheune.4Switch_Sw_Gewaechshaus off
   Helper:
     globalinit 1
     last_timer 2
     sleeptimer -1
   Interval:
     0          -1
     1          0
   Itimer:
   Localtime:
     0          1485536400
     1          1485502200
   Readings:
     0           Gewaechshaus.Katzenhaus:temperature
     all         Gewaechshaus.Katzenhaus:temperature
   Realtime:
     0          18:00:00
     1          08:30:00
   Regexp:
     All:
   State:
   Time:
     0          18:00:00
     1          08:30:00
   Timecond:
     0          0
     1          0
   Timer:
     0          0
     1          0
   Timers:
     0           0  1
   Triggertime:
     1485502200:
       localtime  1485502200
       Hash:
     1485536400:
       localtime  1485536400
       Hash:
Attributes:
   room       Aussen,Gewaechshaus,Scheune
   wait       300:5400


Nach der Änderung ist timer_01_c01 auf morgen gewechselt (27. Januar 2017), weil der Beginn des Zeitfensters in der Vergangenheit liegt.

Nun kann die mit and-verknüpfte Bedingung tun und machen was sie will, die Zeitfenster-Steuerung greift erst morgen.

Der Zeitpunkt der Änderung (19:11) liegt aber mitten im angegebenen Zeitfenster von 18:00-09:00 Uhr - und ich möchte daher wieder die Aktion (cmd1) in Abhängigkeit von der zweiten Bedingung ausführen - und zwar bis zum Ende des angegebenen Zeitfensters um 9 Uhr.

Ansonsten erfrieren die Katzen, die Besucher finden nachts den Weg nicht mehr, und und und...

Nochmals Danke, -MN
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Damian

OK ich sehe jetzt was du meinst. Dennoch

Es ist unerheblich, welches Datum vor 18:00 Uhr steht - das ist nur der Tag der Triggerung. Das Intervall von [18:00-08:30] ist trotzdem heute also jetzt um 19:28 wahr. Es wird für die Überprüfung der Wahrheit des Intervalls nur die Zeit herangezogen und nicht das Triggerdatum.

Ich habe bei mir es gerade nachgestellt:

([18:00-08:30] and [FS]) (set bla on) es wird wie erwartet cmd_1 ausgeführt, wenn ich FS auslöse.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

choetzu

Ich komme darauf zurück.

Wenn ich ([{sunset}] - [{sunrise}] mache, dann nimmt er mir den timer von heute, sprich auch den sunrise, obschon ich diesen von morgen meine.. wie löst man das?
Raspi3, EnOcean, Zwave, Homematic

Damian

Das kann aber nur beim Definieren passieren, sonst werden die beiden Intervallgrenzen erst beim zweiten Trigger (Endzeit) bestimmt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF