WeekDayTimer - Problem mit variabler Zeitberechnung

Begonnen von Cluni, 03 April 2017, 09:57:45

Vorheriges Thema - Nächstes Thema

Cluni

Morgen zusammen,

ich habe mir für meine Rollladen jeweils einen WeekDayTimer angelegt und möchte, dass der jeweilige Rollladen zu immer unterschiedlichen Zeiten fährt. Hier erstmal ein List von einem Timer:

Internals:
   COMMAND
   CONDITION
   DEF        Rol.Flur Mo-Fr|{sunrise_abs("REAL",1200-rand(2400),randomtime("07,00,30"),randomtime("08,00,30"))}|on Sa-So|{sunrise_abs("REAL",600-rand(1200),randomtime("08,30,30"),randomtime("09,30,30"))}|on Mo-So|{sunset_abs("REAL",1200-rand(2400),randomtime("18,30,30"),randomtime("19,45,30"))}|off
   DEVICE     Rol.Flur
   GlobalDaylistSpec
   LANGUAGE   de
   NAME       Timer.Rol.Flur
   NR         259
   Profil 0: Sonntag 08:42:40 on, 20:03:11 off
   Profil 1: Montag 07:24:53 on, 20:14:45 off
   Profil 2: Dienstag 07:22:37 on, 19:51:59 off
   Profil 3: Mittwoch 07:15:57 on, 19:49:38 off
   Profil 4: Donnerstag 07:30:51 on, 19:55:29 off
   Profil 5: Freitag 07:22:51 on, 19:59:03 off
   Profil 6: Samstag 08:55:05 on, 19:58:36 off
   STATE      2017-04-03 07:24:53:on
   STILLDONETIME 0
   TYPE       WeekdayTimer
   Readings:
     2017-04-03 07:11:09   currValue       off
     2017-04-02 22:41:42   disabled        0
     2017-04-03 07:11:09   nextUpdate      2017-04-03 07:24:53
     2017-04-03 07:11:09   nextValue       on
     2017-04-03 07:11:09   state           on
   SWITCHINGTIMES:
     Mo-Fr|{sunrise_abs("REAL",1200-rand(2400),randomtime("07,00,30"),randomtime("08,00,30"))}|on
     Sa-So|{sunrise_abs("REAL",600-rand(1200),randomtime("08,30,30"),randomtime("09,30,30"))}|on
     Mo-So|{sunset_abs("REAL",1200-rand(2400),randomtime("18,30,30"),randomtime("19,45,30"))}|off
   Timer:
     Timer.rol.flur_1:
       HASH       Timer.Rol.Flur
       MODIFIER   1
       NAME       Timer.Rol.Flur_1
     Timer.rol.flur_2:
       HASH       Timer.Rol.Flur
       MODIFIER   2
       NAME       Timer.Rol.Flur_2
     Timer.rol.flur_3:
       HASH       Timer.Rol.Flur
       MODIFIER   3
       NAME       Timer.Rol.Flur_3
     Timer.rol.flur_settimerofday:
       HASH       Timer.Rol.Flur
       MODIFIER   SetTimerOfDay
       NAME       Timer.Rol.Flur_SetTimerOfDay
       SETTIMERATMIDNIGHT 1
   Daynumber:
     !$we       8
     $we        7
     di         2
     do         4
     fr         5
     mi         3
     mo         1
     sa         6
     so         0
   Helper:
     daysRegExp (so|mo|di|mi|do|fr|sa|\$we|\!\$we)
     daysRegExpMessage (so|mo|di|mi|do|fr|sa|$we|!$we)
     Switchingtime:
       0:
         08:42:40   on
         20:03:11   off
       1:
         07:24:53   on
         20:14:45   off
       2:
         07:22:37   on
         19:51:59   off
       3:
         07:15:57   on
         19:49:38   off
       4:
         07:30:51   on
         19:55:29   off
       5:
         07:22:51   on
         19:59:03   off
       6:
         08:55:05   on
         19:58:36   off
   Longdays:
     de:
       Sonntag
       Montag
       Dienstag
       Mittwoch
       Donnerstag
       Freitag
       Samstag
       Wochenende
       Werktags
     en:
       Sunday
       Monday
       Tuesday
       Wednesday
       Thursday
       Friday
       Saturday
       weekend
       weekdays
     fr:
       Dimanche
       Lundi
       Mardi
       Mercredi
       Jeudi
       Vendredi
       Samedi
       weekend
       jours de la semaine
   Profil:
     1:
       EPOCH      1491196269
       PARA       on
       TIME       {sunrise_abs("REAL",1200-rand(2400),randomtime("07,00,30"),randomtime("08,00,30"))}
       TAGE:
         1
         2
         3
         4
         5
     2:
       EPOCH      1491202477
       PARA       on
       TIME       {sunrise_abs("REAL",600-rand(1200),randomtime("08,30,30"),randomtime("09,30,30"))}
       TAGE:
         0
         6
     3:
       EPOCH      1491242481
       PARA       off
       TIME       {sunset_abs("REAL",1200-rand(2400),randomtime("18,30,30"),randomtime("19,45,30"))}
       TAGE:
         0
         1
         2
         3
         4
         5
         6
   Profile_idx:
     0:
       08:42:40   2
       08:48:00   2
       19:48:24   3
       20:03:11   3
     1:
       07:22:00   1
       07:24:53   1
       19:56:36   3
       20:14:45   3
     2:
       07:22:37   1
       07:24:01   1
       19:51:59   3
       20:02:03   3
     3:
       07:15:57   1
       07:27:17   1
       19:43:39   3
       19:49:38   3
     4:
       07:20:56   1
       07:30:51   1
       19:43:47   3
       19:55:29   3
     5:
       07:22:51   1
       07:28:36   1
       19:59:03   3
       20:13:08   3
     6:
       08:43:10   2
       08:55:05   2
       19:58:36   3
       19:59:34   3
   Shortdays:
     de:
       so
       mo
       di
       mi
       do
       fr
       sa
       $we
       !$we
     en:
       su
       mo
       tu
       we
       th
       fr
       sa
       $we
       !$we
     fr:
       di
       lu
       ma
       me
       je
       ve
       sa
       $we
       !$we
Attributes:
   commandTemplate set $NAME  $EVENT
   disable    0
   group      Rollladen-Timer
   icon       fts_shutter_automatic
   room       Flur,Rollladen
   stateFormat nextUpdate:nextValue


Ich möchte z.B. durch meine Zeitangabe sunrise_abs("REAL",1200-rand(2400),randomtime("07,00,30"),randomtime("08,00,30")) erreichen, dass
1. durch randomtime("07,00,30") frühestens zwischen 7Uhr und 7:30Uhr geschaltet wird, wenn der Sonnenaufgang früher ist,
2. durch randomtime("08,00,30") spätestens zwischen 8Uhr und 8:30Uhr geschaltet wird, wenn der Sonnenaufgang später ist und
3. durch 1200-rand(2400) +/-20 Minuten um den Sonnenaufgang herum geschaltet wird, wenn der Zeitpunkt zwischen 1. und 2. liegt.

Die Zeitberechnung klappt auch recht gut, aber für mich sieht es so aus als würde manchmal ein Schaltzeitpunkt einfach übergangen (wie im obigen Listing - der angegebene Schaltzeitpunkt war bereits abgelaufen. Es könnte aber auch sein, dass ein Zeitpunkt berechnet und eingetragen wird als nächster Schaltzeitpunkt, der bereits in der Vergangenheit liegt. So richtig konnte ich das bis jetzt noch nicht nachvollziehen.

Es scheint ja so zu sein, dass alle Zeiten bei einem Timer-Event neu berechnet werden, richtig?! Dabei ist mir jedenfalls schon aufgefallen, dass z.B. das on-Event ja auch öfters hintereinander kommen kann, bei meiner Konstruktion - und zwar dann, wenn der neu berechnete Zeitpunkt nach der aktuellen Uhrzeit liegt. Könnte man dies irgendwie verhindern? Und könnte es sein, dass an dieser Stelle auch der Fehler auftreten könnte, dass ein früherer Zeitpunkt als die aktuelle Uhrzeit herauskommt und als nächsten Timer-Zeitpunkt gesetzt wird (der dann ja nicht eintreten kann, weil ja schon vorbei)? Wird im Modul überprüft, ob de nächste Schalttermin gültig und in der Zukunft ist?

Ich hoffe, dass ich mich nicht zu kompliziert ausgedrückt habe und dass alles einigermaßen verständlich ist?! Ansonsten bitte nochmal nachfragen... ;)

Lieben Gruß und schon mal Danke für eure Hilfe
Bernd

Dietmar63

Die Zeiten werden jede Nacht gegen Mitternacht neu berechnet.
Meines Wissens werden die Zeiten der aktuellen Woche berechnet, auch wenn sie schon in der Vergangenheit liegen.
Weiterhin werden die InternalTimer(interne at) des aktuelle Tages gesetzt, in deinem Fall immer zwei. Ich habe mir eine kleine Funktion geschrieben, die alle aktiven  InternalTimer  ins Log ausgeben kann, könnte ich zur Verfügung stellen.

Logische Abhängigkeiten zwischen den unabhängig voneinander berechneten Werten, werden nicht berücksichtigt.

Mit verbose 4 oder verbose 5 kannst du Dir Logging pro WDT einschalten, und prüfen, ob alles zum richtigen Zeitpunkt auch passiert.
Eventuell reichen die Infos aus, um analysieren zu können was nicht korrekt läuft.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Cluni

Zitat von: Dietmar63 am 03 April 2017, 11:26:20
Ich habe mir eine kleine Funktion geschrieben, die alle aktiven  InternalTimer  ins Log ausgeben kann, könnte ich zur Verfügung stellen.

Das wäre toll! Dank dir. Den verbose habe ich schon mal auf 5 gestellt. ;)

Wie schaut das eigentlich mit der Berechnung aus, wenn der WDT auf disable gestellt wird - werden die Werte dann trotzdem um Mitternacht neu berechnet? Oder erst, wenn er wieder enabled wird? Ich würde das enable/disable gerne für alle Rollladen-WDT über die Anwesenheitserkennung ein- bzw ausschalten. D.h. wenn wir zu Hause sind, dann sollen die Rollladen auf Handbetrieb stehen und wenn niemand da ist die Automatik eingeschaltet sein. Das sollte sich ja recht einfach durch ein notify mit der bereits vorhandenen Anwesenheitserkennung schnell machen lassen...

Ich würde auch gerne noch eine Sache machen: Ich habe mir für die Rollladen einige UserAttribute erzeugt - diese würde ich gerne im WDT benutzen. Dazu hatte ich bereits folgendes ausprobiert:
Rol.Bad Mo-Fr|{sunrise_abs("REAL",1200-rand(2400),randomtime("07,00,30"),randomtime("08,00,30"))}|{AttrVal("$DEVICE", "Auto_offen_Pos", "Luft")} Sa-So|{sunrise_abs("REAL",600-rand(1200),randomtime("08,30,30"),randomtime("09,30,30"))}|(AttrVal("$DEVICE", "Auto_offen_Pos", "Luft")) Mo-So|{sunset_abs("REAL",1200-rand(2400),randomtime("18,30,30"),randomtime("19,45,30"))}|off

Erklärung: Ich würde gerne den als UserAttribut eingetragenen Schaltwert ("Luft" ist ein bei mir in der eventMap hinterlegter Wert: "eventMap /pct 41:Luft/") auslesen und diesen Rollladen entsprechend fahren. Später würde ich auch gerne die eingetragenen frühesten bzw spätesten Schaltzeiten daher holen. Aber das holen des gewünschten Zustands funktioniert schon nicht. Oder muss ich das anders erledigen?

Dietmar63


sub printIntTimer() {

  my %cop;
  foreach my $a (keys %intAt) {

    my $nam = "";
    my $aaa = sprintf ("%6d",$a);
    my $arg = $intAt{$a}{ARG};
       $nam = $arg->{NAME} if (ref($arg) eq "HASH" && defined($arg->{NAME})  );
    my $tim = strftime('%d.%m.%Y %H:%M:%S',localtime($intAt{$a}{TRIGGERTIME}));
    my $func = sprintf ("%-35s %-35s",$nam,$intAt{$a}{FN});

    $cop{$nam." ".$aaa} = $aaa . " " . $tim . " " .  " " . $func if ($nam =~  m/.*/g);
   #$cop{$nam." ".$aaa} = $aaa . " " . $tim . " " .  " " . $func if ($nam =~  m/Twilight_wea/g);
  }
  Log 3, "===============================================";
  foreach my $k (sort keys %cop) {
    Log 3, $cop{$k};
  }
  Log 3, "===============================================";
}



ZitatWie schaut das eigentlich mit der Berechnung aus, wenn der WDT auf disable gestellt wird - werden die Werte dann trotzdem um Mitternacht neu berechnet? Oder erst, wenn er wieder enabled wird? Ich würde das enable/disable gerne für alle Rollladen-WDT über die Anwesenheitserkennung ein- bzw ausschalten. D.h. wenn wir zu Hause sind, dann sollen die Rollladen auf Handbetrieb stehen und wenn niemand da ist die Automatik eingeschaltet sein. Das sollte sich ja recht einfach durch ein notify mit der bereits vorhandenen Anwesenheitserkennung schnell machen lassen...

Es wird immer um Mitternacht alles neu berechnet - dass sollte auch aus dem Logging so hervorgehen.
Mit dem Attribut disable kannst du die aktiven timer quasi unterdrücken - im laufendem Betrieb. Die allerletzte Feinheit funktioniert manchmal nicht so wie erwartet - aber wir sind dran.

Besser funktioniert das Attribut disableCond. Hier musst du eine Condition angeben, wann der Timer abgeschaltet werden soll(neg. Logik) - Da kannst du auf den notify verzichten, weil der Ausdruck immer  zum Zeitpunkt des Schaltens ausgeführt wird.

Ich würde auch gerne noch eine Sache machen: Ich habe mir für die Rollladen einige UserAttribute erzeugt - diese würde ich gerne im WDT benutzen. Dazu hatte ich bereits folgendes ausprobiert:

Zitat
Variabler Parameter:

Auch das funktionierte mit WDT schon einmal. Aber leider haben viele hier im Forum nicht wirklich genau verstanden, wie er zu gebrauchen ist. Deshalb habe ich ihn wieder ausgebaut - zu viel Arbeit beim Support. Der Code steckt noch im Modul drin und müsste aktiviert werden.

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Cluni

#4
Ich habe jetzt wieder einen Rollladen, der nicht geschaltet wurde:
Internals:
   COMMAND
   CONDITION
   DEF        Rol.WZ.Seitentuer Mo-Fr|{sunrise_abs("REAL",1200-rand(2400),randomtime("07,00,30"),randomtime("08,00,30"))}|Luft Sa-So|{sunrise_abs("REAL",600-rand(1200),randomtime("08,30,30"),randomtime("09,30,30"))}|Luft Mo-So|{sunset_abs("REAL",1200-rand(2400),randomtime("18,30,30"),randomtime("21,30,30"))}|off
   DEVICE     Rol.WZ.Seitentuer
   GlobalDaylistSpec
   LANGUAGE   de
   NAME       Timer.Rol.WZ.Seitentuer
   NR         261
   Profil 0: Sonntag 08:30:14 Luft, 20:01:26 off
   Profil 1: Montag 07:29:26 Luft, 19:46:03 off
   Profil 2: Dienstag 07:13:49 Luft, 20:06:03 off
   Profil 3: Mittwoch 07:20:04 Luft, 20:06:57 off
   Profil 4: Donnerstag 07:28:27 Luft, 20:08:27 off
   Profil 5: Freitag 07:12:16 Luft, 19:46:45 off
   Profil 6: Samstag 08:43:25 Luft, 20:06:41 off
   STATE      2017-04-03 19:46:03:off
   STILLDONETIME 0
   TYPE       WeekdayTimer
   Readings:
     2017-04-03 12:57:06   currValue       Luft
     2017-04-03 12:56:54   disabled        0
     2017-04-03 12:57:06   nextUpdate      2017-04-03 19:46:03
     2017-04-03 12:57:06   nextValue       off
     2017-04-03 12:57:06   state           active
   SWITCHINGTIMES:
     Mo-Fr|{sunrise_abs("REAL",1200-rand(2400),randomtime("07,00,30"),randomtime("08,00,30"))}|Luft
     Sa-So|{sunrise_abs("REAL",600-rand(1200),randomtime("08,30,30"),randomtime("09,30,30"))}|Luft
     Mo-So|{sunset_abs("REAL",1200-rand(2400),randomtime("18,30,30"),randomtime("21,30,30"))}|off
   Timer:
     Timer.rol.wz.seitentuer_3:
       HASH       Timer.Rol.WZ.Seitentuer
       MODIFIER   3
       NAME       Timer.Rol.WZ.Seitentuer_3
     Timer.rol.wz.seitentuer_settimerofday:
       HASH       Timer.Rol.WZ.Seitentuer
       MODIFIER   SetTimerOfDay
       NAME       Timer.Rol.WZ.Seitentuer_SetTimerOfDay
       SETTIMERATMIDNIGHT 1
   Daynumber:
     !$we       8
     $we        7
     di         2
     do         4
     fr         5
     mi         3
     mo         1
     sa         6
     so         0
   Helper:
     daysRegExp (so|mo|di|mi|do|fr|sa|\$we|\!\$we)
     daysRegExpMessage (so|mo|di|mi|do|fr|sa|$we|!$we)
     Switchingtime:
       0:
         08:30:14   Luft
         20:01:26   off
       1:
         07:29:26   Luft
         19:46:03   off
       2:
         07:13:49   Luft
         20:06:03   off
       3:
         07:20:04   Luft
         20:06:57   off
       4:
         07:28:27   Luft
         20:08:27   off
       5:
         07:12:16   Luft
         19:46:45   off
       6:
         08:43:25   Luft
         20:06:41   off
   Longdays:
     de:
       Sonntag
       Montag
       Dienstag
       Mittwoch
       Donnerstag
       Freitag
       Samstag
       Wochenende
       Werktags
     en:
       Sunday
       Monday
       Tuesday
       Wednesday
       Thursday
       Friday
       Saturday
       weekend
       weekdays
     fr:
       Dimanche
       Lundi
       Mardi
       Mercredi
       Jeudi
       Vendredi
       Samedi
       weekend
       jours de la semaine
   Profil:
     1:
       EPOCH      1491196306
       PARA       Luft
       TIME       {sunrise_abs("REAL",1200-rand(2400),randomtime("07,00,30"),randomtime("08,00,30"))}
       TAGE:
         1
         2
         3
         4
         5
     2:
       EPOCH      1491201616
       PARA       Luft
       TIME       {sunrise_abs("REAL",600-rand(1200),randomtime("08,30,30"),randomtime("09,30,30"))}
       TAGE:
         0
         6
     3:
       EPOCH      1491243240
       PARA       off
       TIME       {sunset_abs("REAL",1200-rand(2400),randomtime("18,30,30"),randomtime("21,30,30"))}
       TAGE:
         0
         1
         2
         3
         4
         5
         6
   Profile_idx:
     0:
       08:30:14   2
       20:01:26   3
     1:
       07:29:26   1
       19:46:03   3
     2:
       07:13:49   1
       20:06:03   3
     3:
       07:20:04   1
       20:06:57   3
     4:
       07:28:27   1
       20:08:27   3
     5:
       07:12:16   1
       19:46:45   3
     6:
       08:43:25   2
       20:06:41   3
   Shortdays:
     de:
       so
       mo
       di
       mi
       do
       fr
       sa
       $we
       !$we
     en:
       su
       mo
       tu
       we
       th
       fr
       sa
       $we
       !$we
     fr:
       di
       lu
       ma
       me
       je
       ve
       sa
       $we
       !$we
Attributes:
   commandTemplate set $NAME  $EVENT
   disable    0
   group      Rollladen-Timer
   icon       fts_shutter_automatic
   room       Rollladen,Wohnzimmer
   stateFormat nextUpdate:nextValue
   verbose    5


Habe erstmal den List kopiert, damit er nicht abhanden kommt. Der Rolladen hätte um 19:46 zu fahren müssen. Schaue nun mal ins Log, ob ich was finde...

Edit: So nun ist er grade gefahren - eine knappe halbe Stunde später. Gibt es dafür eine Erklärung?

Cluni

2017.04.03 20:14:00 4: [Timer.Rol.WZ.Seitentuer] time={sunset_abs("REAL",1200-rand(2400),randomtime("18,30,30"),randomtime("21,30,30"))}/1491243240 delay=0, nextDelay=60, nextRetry=1491243300
2017.04.03 20:14:00 4: [Timer.Rol.WZ.Seitentuer] delayedExecutionCond:0
2017.04.03 20:14:00 4: [Timer.Rol.WZ.Seitentuer] result of delayedExecutionCond:0
2017.04.03 20:14:00 4: [Timer.Rol.WZ.Seitentuer] list of window sensors found: 'Timer.Rol.WZ.Seitentuer'
2017.04.03 20:14:00 4: [Timer.Rol.WZ.Seitentuer] condition: - Tage:0,1,2,3,4,5,6
2017.04.03 20:14:00 5: [Timer.Rol.WZ.Seitentuer] condition: {my $days={};;map{$days->{$_}=1}(0,1,2,3,4,5,6);;;;( 1 && (defined $days->{$wday}))}
2017.04.03 20:14:00 5: [Timer.Rol.WZ.Seitentuer] result of condition:1
2017.04.03 20:14:00 4: [Timer.Rol.WZ.Seitentuer] Update   - timer seems to be active today: 0123456|{sunset_abs("REAL",1200-rand(2400),randomtime("18,30,30"),randomtime("21,30,30"))}|off
2017.04.03 20:14:00 4: [Timer.Rol.WZ.Seitentuer] aktParam: newParam:off - is  not disabled
2017.04.03 20:14:00 4: [Timer.Rol.WZ.Seitentuer] command: 'set $NAME  $EVENT' executed with %NAME=>Rol.WZ.Seitentuer,%EVENT=>off
2017.04.03 20:14:00 3: CUL_HM set Rol.WZ.Seitentuer off

Cluni

Bei der nächsten Rolllade ist die Zeit nun auch vorbei, aber der Rollladen ist noch oben. Ist das etwa normal, dass nicht genau der Zeitpunkt eingehalten wird? Die Fhem Uhr geht jedenfalls richtig. Und jetzt grade fährt auch dieser Rollladen (ca. 6 Minuten zu spät)...

Dietmar63

Nein, dafür habe ich keine Erklärung.
Versuch mal mit printIntTimer() in 99_utils zu prüfen, ob dort die Zeiten mit den Zeiten des RT übereinstimmen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Cluni

Wo genau muss ich die printIntTimer denn aufrufen bzw einhängen?

Dietmar63

#9
über Edit Files:

Dort solltest du dir langfristig eine eigene 99_utils unter eingenem Namen anlegen( 99_myUtils.pm ... ich habe zwei) - kannst du auch später machen.

Dort die Funktion hineinkopieren, speichern und eventuell reload 99_utils ausführen - ich editiere direkt, deshalb muss ich einen reload ausführen, wenn man aus der Oberfläche heraus editiert ist das vielleicht überflüssig  - lange nicht gemacht.

Passs aber auf, dass du die Struktur nicht zerstörst - dann hast du ein Problem.

Umfangreichen Perlcode am besten immer in die eigene 99_utils erfassen - dann bekommst du Syntaxfehler besser heraus.
so etwas:
{sunrise_abs("REAL",1200-rand(2400),randomtime("07,00,30"),randomtime("08,00,30"))}
könntest du dann in eine eigene Funktion auslagern, und der WDT bleibt übersichtlicher. Habe selbst viele eigene Funktionen:

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Cluni

Ach so, nein, du hast mich falsch verstanden. Wie das mit der 99_utils läuft, weiß ich. Meine Frage war nur, wo ich die Funktion einbinden muss.

Ich habe sie nun über die command line über "{printIntTimer()}" aufgerufen und dann die Log angesehen:

2017.04.03 21:36:31 3: ===============================================
2017.04.03 21:36:31 3:   5266 04.04.2017 00:00:05  Timer.Rol.Bad_SetTimerOfDay         WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3:    250 04.04.2017 00:00:05  Timer.Rol.Buero_SetTimerOfDay       WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3:    240 04.04.2017 00:00:05  Timer.Rol.Flur_SetTimerOfDay        WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3:    242 04.04.2017 00:00:05  Timer.Rol.GaesteWC_SetTimerOfDay    WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3:    234 04.04.2017 00:00:05  Timer.Rol.Gaestezimmer_SetTimerOfDay WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3:    238 04.04.2017 00:00:05  Timer.Rol.Jana_SetTimerOfDay        WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3:    230 04.04.2017 00:00:05  Timer.Rol.Kueche_SetTimerOfDay      WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3:    236 04.04.2017 00:00:05  Timer.Rol.Schlafzimmer_SetTimerOfDay WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3:    244 04.04.2017 00:00:05  Timer.Rol.WZ.Seitentuer_SetTimerOfDay WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3:    246 04.04.2017 00:00:05  Timer.Rol.WZ.links_SetTimerOfDay    WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3:    248 04.04.2017 00:00:05  Timer.Rol.WZ.rechts_SetTimerOfDay   WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3:    192 04.04.2017 00:00:05  WDT.Licht.WZ.Gruppe_SetTimerOfDay   WeekdayTimer_SetTimerOfDay         
2017.04.03 21:36:31 3: ===============================================


Ich denke mal, dass ich das nach Mitternacht machen müsste?! Vielleicht automatisch über ein at?

Dietmar63

Ich habe mir ein dummy gebastelt.

ja, die Tagestimer sind ja abgearbeitet. Kurz nach Mitternacht werden die timer von morgen gesetzt.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Cluni

Habe ich nun gemacht! Mal sehen, was heraus kommt.

Vielen Dank für deinen Einsatz und deine Hilfe!

Cluni

Da passt irgendetwas absolut nicht. So wie ich das sehe, stimmen die Zeiten, die von deiner Funktion ausgelesen werden. Aber die in den WDT sind total Banane. Ich frage mich aber auch, warum 3 Timer pro Rollladen (außer bei denen, die keinen on-Timer haben) angelegt werden laut deiner Funktion? Oder wird beim zweiten Timer dann erst das nächste interne at angelegt?

2017.04.04 00:00:05 4: [Timer.Rol.Flur] 07:19:36 on, 19:51:18 off (Profil 2: Dienstag)

2017.04.04 00:00:05 4: [Timer.Rol.GaesteWC] 07:09:05 on, 19:52:11 off (Profil 2: Dienstag)

2017.04.04 00:00:05 4: [Timer.Rol.Jana] 07:20:01 on, 20:08:20 off (Profil 2: Dienstag)

2017.04.04 00:00:05 4: [Timer.Rol.Bad] 07:28:02 on, 19:55:16 off (Profil 2: Dienstag)

2017.04.04 00:00:05 4: [Timer.Rol.Kueche] 07:30:02 on, 19:51:32 off (Profil 2: Dienstag)

2017.04.04 00:00:05 4: [Timer.Rol.WZ.links] 07:20:50 Luft, 20:10:36 off (Profil 2: Dienstag)

2017.04.04 00:00:05 4: [Timer.Rol.WZ.Seitentuer] 07:29:31 Luft, 20:12:03 off (Profil 2: Dienstag)

2017.04.04 00:00:05 4: [Timer.Rol.WZ.rechts] 19:54:20 off (Profil 2: Dienstag)

2017.04.04 00:00:05 4: [Timer.Rol.Gaestezimmer] 07:29:54 on, 19:48:53 off (Profil 2: Dienstag)

2017.04.04 00:00:05 4: [Timer.Rol.Buero] 19:59:31 off (Profil 2: Dienstag)


2017.04.04 00:00:05 4: [Timer.Rol.Schlafzimmer] 07:29:43 on, 19:52:07 off (Profil 2: Dienstag)

2017.04.04 01:30:00 3: ===============================================
2017.04.04 01:30:00 3:  21598 04.04.2017 07:08:21  Timer.Rol.Bad_1                     WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21599 04.04.2017 08:36:08  Timer.Rol.Bad_2                     WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21600 04.04.2017 19:48:55  Timer.Rol.Bad_3                     WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21601 05.04.2017 00:00:05  Timer.Rol.Bad_SetTimerOfDay         WeekdayTimer_SetTimerOfDay         
2017.04.04 01:30:00 3:  21620 04.04.2017 19:58:27  Timer.Rol.Buero_1                   WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21621 05.04.2017 00:00:05  Timer.Rol.Buero_SetTimerOfDay       WeekdayTimer_SetTimerOfDay         
2017.04.04 01:30:00 3:  21583 04.04.2017 07:26:17  Timer.Rol.Flur_1                    WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21584 04.04.2017 08:31:57  Timer.Rol.Flur_2                    WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21585 04.04.2017 19:54:21  Timer.Rol.Flur_3                    WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21586 05.04.2017 00:00:05  Timer.Rol.Flur_SetTimerOfDay        WeekdayTimer_SetTimerOfDay         
2017.04.04 01:30:00 3:  21590 04.04.2017 07:23:57  Timer.Rol.GaesteWC_1                WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21591 04.04.2017 08:36:43  Timer.Rol.GaesteWC_2                WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21592 04.04.2017 20:25:21  Timer.Rol.GaesteWC_3                WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21593 05.04.2017 00:00:05  Timer.Rol.GaesteWC_SetTimerOfDay    WeekdayTimer_SetTimerOfDay         
2017.04.04 01:30:00 3:  21616 04.04.2017 07:12:02  Timer.Rol.Gaestezimmer_1            WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21617 04.04.2017 08:34:03  Timer.Rol.Gaestezimmer_2            WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21618 04.04.2017 19:46:05  Timer.Rol.Gaestezimmer_3            WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21619 05.04.2017 00:00:05  Timer.Rol.Gaestezimmer_SetTimerOfDay WeekdayTimer_SetTimerOfDay         
2017.04.04 01:30:00 3:  21594 04.04.2017 07:17:11  Timer.Rol.Jana_1                    WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21595 04.04.2017 08:52:25  Timer.Rol.Jana_2                    WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21596 04.04.2017 19:52:43  Timer.Rol.Jana_3                    WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21597 05.04.2017 00:00:05  Timer.Rol.Jana_SetTimerOfDay        WeekdayTimer_SetTimerOfDay         
2017.04.04 01:30:00 3:  21602 04.04.2017 07:25:12  Timer.Rol.Kueche_1                  WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21603 04.04.2017 08:38:05  Timer.Rol.Kueche_2                  WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21604 04.04.2017 20:19:36  Timer.Rol.Kueche_3                  WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21605 05.04.2017 00:00:05  Timer.Rol.Kueche_SetTimerOfDay      WeekdayTimer_SetTimerOfDay         
2017.04.04 01:30:00 3:  21622 04.04.2017 07:29:40  Timer.Rol.Schlafzimmer_1            WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21623 04.04.2017 08:42:21  Timer.Rol.Schlafzimmer_2            WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21624 04.04.2017 19:59:42  Timer.Rol.Schlafzimmer_3            WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21625 05.04.2017 00:00:05  Timer.Rol.Schlafzimmer_SetTimerOfDay WeekdayTimer_SetTimerOfDay         
2017.04.04 01:30:00 3:  21610 04.04.2017 07:02:14  Timer.Rol.WZ.Seitentuer_1           WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21611 04.04.2017 08:48:32  Timer.Rol.WZ.Seitentuer_2           WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21612 04.04.2017 20:07:52  Timer.Rol.WZ.Seitentuer_3           WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21613 05.04.2017 00:00:05  Timer.Rol.WZ.Seitentuer_SetTimerOfDay WeekdayTimer_SetTimerOfDay         
2017.04.04 01:30:00 3:  21606 04.04.2017 07:14:31  Timer.Rol.WZ.links_1                WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21607 04.04.2017 08:46:42  Timer.Rol.WZ.links_2                WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21608 04.04.2017 20:18:29  Timer.Rol.WZ.links_3                WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21609 05.04.2017 00:00:05  Timer.Rol.WZ.links_SetTimerOfDay    WeekdayTimer_SetTimerOfDay         
2017.04.04 01:30:00 3:  21614 04.04.2017 20:23:00  Timer.Rol.WZ.rechts_1               WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21615 05.04.2017 00:00:05  Timer.Rol.WZ.rechts_SetTimerOfDay   WeekdayTimer_SetTimerOfDay         
2017.04.04 01:30:00 3:  20393 04.04.2017 01:30:00  TimerZeitenCheck                    at_Exec                           
2017.04.04 01:30:00 3: ===============================================

Dietmar63

Das ist in der Tat merkwürdig.
Ich probiere das heute Abend bei mir mal aus.

kannst du mir den Code von randomtime() schicken.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Cluni

sub randomtime($)
{
  my ($MeH,$MeM,$MeB) = split(",", shift);
  my $ZtA = int($MeH*3600 + $MeM*60 + rand($MeB*60));
  my $ZtH = int($ZtA/3600);
  my $ZtM = int(($ZtA-$ZtH*3600)/60);
  my $ZtS = int($ZtA-($ZtH*3600+$ZtM*60));
  return sprintf("%2.2d:%2.2d:%2.2d",$ZtH,$ZtM,$ZtS);




Büddäschön! :)

Übrigens ist bei den zweiten Timern nichts passiert. Ich hatte die Rollladen extra vorher auf einen willkürlichen Wert gesetzt, damit man es sieht, wenn nochmal gefahren wurde...

Dietmar63

#16
Bin gestern nicht dazu gekommen, etwas auszuprobieren.

Aber:
Es ist gewollt, dass drei timer pro Tag erzeugt werden. Du hast im WDT schliesslich drei timer definiert - jeder timer wird für jeden Tag eingestellt.
Der dann generiert Code sorgt dafür, dass die Nebenbedingungen (definierte Tage + sonst. if) bei der Schaltung berücksichtigt werden.

Der Code wird zum Schaltzeitpunkt generiert und sieht im verbose 4/5 dann etwas so aus:
var1 = "xx" var2="yyy" ... fhem("set dummy Luft") if(... {my $days={};;map{$days->{$_}=1}(0,1,2,3,4,5,6);;;;( 1 && (defined $days->{$wday}))} ) )
Der Code wird dann mit eval ausgeführt

Versuche mal zu prüfen, ob die Bedingungen des Codes korrekt sind.

2017.04.04 01:30:00 3:  21598 04.04.2017 07:08:21  Timer.Rol.Bad_1                     WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21599 04.04.2017 08:36:08  Timer.Rol.Bad_2                     WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21600 04.04.2017 19:48:55  Timer.Rol.Bad_3                     WeekdayTimer_Update               
2017.04.04 01:30:00 3:  21601 05.04.2017 00:00:05  Timer.Rol.Bad_SetTimerOfDay         WeekdayTimer_SetTimerOfDay       
 
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Cluni

#17
Hallo Dietmar,

ich habe die Timer gestern gelöscht, weil mir das ein wenig zu unsicher war - da wäre ja was los, wenn im Kinderzimmer oder Schlafzimmer plötzlich der Rollladen während der Schlafenszeit los ginge. Ich habe mir nun in Perl eine eigene Funktion geschrieben, die auch die am Aktor eingestellten UserAttribute ausliest und direkt berücksichtigt. Die Funktion wird nun kurz nach Mitternacht für jeden Aktor über ein at aufgerufen und erzeugt mir die beiden at für die entsprechenden Aktionen. Gleichzeitig wird am Aktor in UserReadings eingetragen, wann die Aktionen ausgeführt werden. So habe ich das auch direkt alles an der richtigen Stelle stehen und finde es übersichtlicher. Ich muss mir nun nur noch überlegen, wie ich die Funktion direkt ausführen kann, sobald ich eine Änderung an den entsprechenden UserAttributen vornehme. Gibt es da eine Möglichkeit wie ein notify, welches bei der Änderung von Attributen ausgeführt wird? Oder geht das nur bei readings? Aber jetzt wird es offtopic...

Ich danke dir vielmals für deine Hilfe zum WDT! Sorry, dass ich jetzt hier so kurzfristig diesen Schwenk gemacht habe und mir selber was programmiert habe. Aber vielleicht nutzt der Thread ja noch jemandem, der auch diese Probleme hat.  ;)

Beta-User

@cluni,
Zitat von: Cluni am 05 April 2017, 09:46:17
...nun in Perl eine eigene Funktion geschrieben, die auch die am Aktor eingestellten UserAttribute ausliest und direkt berücksichtigt. Die Funktion wird nun kurz nach Mitternacht für jeden Aktor über ein at aufgerufen...
die von Dir hier umrissene Funktionalität entspricht in etwa dem, was wir hier erst mal nur theoretisch angedacht haben. Könntest Du den Code (vielleicht in dem verlinkten Thread) mal posten, würde mich interessieren.

Da Änderungen von userattr auch als Event im Monitor angezeigt werden, sollte es kein Problem sein, damit ein notify zu triggern.

Gruß, Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Cluni

Hi Beta-User,

das hatte ich eh bereits vor - ich war ja auch bereits aktiv in diesem Thread und hatte meine Ideen ja auch bereits gepostet. Ich feile aber noch an der einen oder anderen Stelle und wollte den Post erst machen, wenn es etwas ausgereifter und ggf. verständlicher für andere ist. Ich werde auf jeden Fall meine Lösung dort vorstellen - im Groben läuft es auch schon fast so wie gewünscht. ;)

Gruß, Bernd

Beta-User

Hi Bernd,

sorry, hatte den Quervergleich nicht gemacht ::).
Ist aber erst mal schön zu hören, dass das Konzept mit dem Auslesen der userattr an sich zu funktionieren scheint.

Anmerkung noch zu der notify-Sache:
Es dürfte einfacher sein, wenn man das in 2 Subfunktionen teilt, nämlich einen "Rahmenpart", der alle Rolläden dann einzeln an die eigentliche "Mache mir at's"-Funktion (für den einzelnen Rolladen) schickt. Dann sollte man diese Teilfunktion nämlich einfacher vom notify aus direkt mit Angabe des betreffenden Rolladens aufrufen können. Aber wie gesagt: bin auch nur am Experimentieren...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Dietmar63

ZitatIch muss mir nun nur noch überlegen, wie ich die Funktion direkt ausführen kann, sobald ich eine Änderung an den entsprechenden UserAttributen vornehme. Gibt es da eine Möglichkeit wie ein notify, welches bei der Änderung von Attributen ausgeführt wird? Oder geht das nur bei readings?

Mir sind notify nur im Zusammenhang mit readings bekannt.
Ich habe mit dem Attribut userReadings ein reading erstellt, das mit notify abgefragt werden kann. Vielleicht hilft das.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Cluni


Cluni

Zitat von: Dietmar63 am 05 April 2017, 10:35:48
Ich habe mit dem Attribut userReadings ein reading erstellt, das mit notify abgefragt werden kann. Vielleicht hilft das.

Ich denke eher nicht - ich möchte ja das Attribut z.B. für den Öffnen-Zeitpunkt ändern. Dabei hätte ich dann gerne, dass automatisch nach der Änderung die Funktion für die Berechnung aufgerufen wird...