Kann WeekdayTimer ein Schaltevent bei delayedExecutionCond überspringen?

Begonnen von gandy, 28 Dezember 2015, 20:11:11

Vorheriges Thema - Nächstes Thema

gandy

Gibt es eine Möglichkeit, WeekdayTimer anzuweisen, ein Schaltkommando komplett zu verwerfen, wenn es von delayedExecutionCond bis über den Schaltpunkt des folgenden Kommandos hinaus verzögert wird? Ich habe im Forum und Wiki gesucht und auch versucht, mich in den Code einzulesen, konnte aber (noch) keine Antwort finden.

Der Hintergrund:

Für meine Rollosteuerung habe ich einen WeekdayTimer definiert, der die Rollos relativ zu Sonnenauf- und untergang hoch und runterfährt, wobei das Hochfahren in zwei Schritten erfolgt: Zunächst ein "up 20", ein paar Minuten später dann auf 100%. Dadurch ist man vorgewarnt (die bodentiefen Fenster zeigen zur Straße) und wenn einzelne Rollos schon über Nacht ein Stück geöffnet waren, fahren sie durch das "up 20" trotzdem nach oben und nicht auf einen starren Wert.

Das funktioniert sehr gut - was aktuell noch nicht ganz zufriedenstellend umgesetzt ist, ist das verzögerte Hochfahren am Wochenende. Für die Verzögerung ist im Attribut delayedExecutionCond die Funktion check_rollo_up_delay() eingetragen, die anhand der gewünschten Schlafdauer und anderer Kriterien entscheidet, ob morgens schon Sonnenlicht reindarf (return false) oder nicht (return true). Im Grunde macht die Funktion auch das was sie soll und hält die Rollos am Wochenende morgens unten.

Nun kann es aber passieren, dass um 8:07 ein "up 20" ansteht, gefolgt von einem "100" um 8:08. Beides wird verzögert, bis der Wecker um 8:50 manuell ausgeschaltet wird, ein Zeichen für check_rollo_up_delay(), die Rollos nicht weiter unten zu halten. In der Folge werden sowohl "set RolloSchalterPennW up 20" als auch "set RolloSchalterPennW 100" ausgeführt, was in manchen Fällen funktioniert, in anderen aber zu einem kleinen Rollo-Ballett führt: Das Rollo fährt erst auf 100% und danach auf 45% (über Nacht war es auf 25%, mit 20% up wird daraus 45%). Offenbar gerät hier irgendwas in der Kommunikation durcheinander, was sicherlich nicht das Problem von WeekdayTimer ist, aber auch nicht einfach zu beheben sein dürfte, ohne  check_rollo_up_delay() unnötig aufzublähen.

Eine elegante Lösung könnte so aussehen, dass WeekdayTimer das durch delayedExecutionCond verzögerte Kommando "up 20" verwirft, sobald der Schaltzeitpunkt für das folgende "100" eintritt (welches zunächst auch verzögert wird). Damit gäbe es immer nur ein ausstehendes Schaltevent. Allerdings habe ich kein Attribut gefunden, über das sich dieses Verhalten steuern ließe. Das Attribut switchInThePast ist m.E. nur für die Define- und Startup-Phase zuständig, richtig?

Danke schonmal für konstruktiven Input,
Andy.

Hier das (leicht eingekürzte) list auf dem fraglichen WeekdayTimer device:

Internals:
   COMMAND    { if (ReadingsVal("RolloModusPenn","state","off") =~ m/nacht/i) { $EVENT=~s/_/ /g; fhem("set $NAME $EVENT"); fhem("setreading RolloSchalterPenn auto_level $EVENT") if ($EVENT =~ m/^\d+$/) } }
   DEF        RolloSchalterPennW {sunrise_abs_dat($date,ReadingsVal("RolloTimerSunriseDelay","state",2400)-60+5)}|up_20 {sunrise_abs_dat($date,ReadingsVal("RolloTimerSunriseDelay","state",2400)-30+5)}|100 {sunset_abs_dat($date,ReadingsVal("RolloTimerSunsetDelay","state",-600)+5)}|0 { if (ReadingsVal("RolloModusPenn","state","off") =~ m/nacht/i) { $EVENT=~s/_/ /g; fhem("set $NAME $EVENT"); fhem("setreading RolloSchalterPenn auto_level $EVENT") if ($EVENT =~ m/^\d+$/) } }
   DEVICE     RolloSchalterPennW
   GlobalDaylistSpec
   LANGUAGE   de
   NAME       RolloTimerPennW
   NR         322
   Profil 0: Sonntag 08:06:04 up_20, 08:07:04 100, 16:51:46 0
   Profil 1: Montag 08:06:21 up_20, 08:07:21 100, 16:52:28 0
   Profil 2: Dienstag 08:06:35 up_20, 08:07:35 100, 16:53:14 0
   Profil 3: Mittwoch 08:06:47 up_20, 08:07:47 100, 16:54:01 0
   Profil 4: Donnerstag 08:06:56 up_20, 08:07:56 100, 16:54:51 0
   Profil 5: Freitag 08:07:06 up_20, 08:08:06 100, 16:56:37 0
   Profil 6: Samstag 08:07:07 up_20, 08:08:07 100, 16:57:32 0
   STATE      0
   STILLDONETIME 0
   TYPE       WeekdayTimer
   Readings:
     2015-12-28 16:52:29   nextUpdate      2015-12-29 08:06:35
     2015-12-28 16:52:29   nextValue       up_20
     2015-12-28 16:52:29   state           0
   SWITCHINGTIMES:
     {sunrise_abs_dat($date,ReadingsVal("RolloTimerSunriseDelay","state",2400)-60+5)}|up_20
     {sunrise_abs_dat($date,ReadingsVal("RolloTimerSunriseDelay","state",2400)+5)}|100
     {sunset_abs_dat($date,ReadingsVal("RolloTimerSunsetDelay","state",-600)+5)}|0
   Timer:
     Rollotimerpennw_4:
       HASH       RolloTimerPennW
       MODIFIER   4
       NAME       RolloTimerPennW_4
     Rollotimerpennw_settimerofday:
       HASH       RolloTimerPennW
       MODIFIER   SetTimerOfDay
       NAME       RolloTimerPennW_SetTimerOfDay
   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:06:04   up_20
         08:07:04   100
         16:51:46   0
       1:
         08:06:21   up_20
         08:07:21   100
         16:52:28   0
       2:
         08:06:35   up_20
         08:07:35   100
         16:53:14   0
       3:
         08:06:47   up_20
         08:07:47   100
         16:54:01   0
       4:
         08:06:56   up_20
         08:07:56   100
         16:54:51   0
       5:
         08:07:06   up_20
         08:08:06   100
         16:56:37   0
       6:
         08:07:07   up_20
         08:08:07   100
         16:57:32   0
Attributes:
   delayedExecutionCond check_rollo_up_delay("$WEEKDAYTIMER","$TIME","$NAME","$EVENT")
fhem (svn) auf i5-4210U NUC
2x HMLAN, 19x HM-SEC-RHS, 15x HM-LC-Bl1PBU-FM, etc.
ODYS Neron Tablet / Android 4.2
Samsung Galaxy Tab 2 10.1N / Android 4.1.2
Samsung Galaxy Note / Android 6.0.1

gandy

fhem (svn) auf i5-4210U NUC
2x HMLAN, 19x HM-SEC-RHS, 15x HM-LC-Bl1PBU-FM, etc.
ODYS Neron Tablet / Android 4.2
Samsung Galaxy Tab 2 10.1N / Android 4.1.2
Samsung Galaxy Note / Android 6.0.1