FHEM Forum

FHEM => Automatisierung => Thema gestartet von: ToKa am 09 Dezember 2016, 20:28:44

Titel: WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 09 Dezember 2016, 20:28:44
Hallo zusammen,

ich nutze bei einem WeekdayTimer die Möglichkeit den time Parameter mit einer eigenen Perlfunktion zu berechnen. In der Perlfunktion benutze ich ein Reading (state = Urlaub: ja/nein) aus einem Dummy-Device. Das funktioniert auch beim Speichern der Definition prima.

Wenn ich fhem per shutdown/restart neustarte, werden die Werte im WeekdayTimer zwar neu berechnet, aber das Reading hat nur den Defaultwert aus ReadingsVal und nicht den zuletzt gesetzten Wert. Kann es sein, dass beim Neustart der state des Dummy noch nicht gesetzt ist, während WeekdayTimer die Werte neuberechnet? Oder muss ich in meiner Perlfunktion etwas für den Neustart berücksichtigen?

Beste Grüße

Torsten
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 10 Dezember 2016, 02:05:40
Ja, es kommt auf die Reihenfolge der Definitionen an
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 10 Dezember 2016, 02:23:03
Hallo Dietmar,

danke für die schnelle Antwort. Kann ich denn die Reihenfolge ändern?

Gruß

Torsten
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 10 Dezember 2016, 03:12:18
Ich glaube es geht mit Löschen und neu anlegen
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 10 Dezember 2016, 10:02:48
Ups... das wäre aber umständlich  :(
Dann müsste ich ja den WeekdayTimer immer neu anlegen, wenn ich eine neue "Variable" benutzen will.
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 10 Dezember 2016, 13:00:37
Die defines werden beim Start  in einer bestimmten Reihenfolge abgearbeitet. Die Reihenfolge bestimmt fhem.cfg.
Mir ist nicht bekannt wie man das beeinflussen kann ohne löschen Neuanlegen zu nutzen.


Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 10 Dezember 2016, 18:39:48
Dann werde ich das mal versuchen...
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 11 Dezember 2016, 13:11:14
Hallo Dietmar,

ich habe den WeekdayTimer gelöscht und neu angelegt. In der fhem.cfg ist der Timer nun der letzte Eintrag, so dass mein "Urlaubsdummy" weit vorher in der Datei steht.

Das Verhalten beim Neustart hat sich aber nicht geändert und der Dummy wird beim Berechnen der Zeiten im WeekdayTimer nicht berücksichtigt.

Was nun? Kann ich Dir mit einem Log weiterhelfen?

Gruß Torsten
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 11 Dezember 2016, 13:58:15
Da bin auch ich dann ratlos
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 15 Dezember 2016, 22:33:51
veröffentliche bitte mal deine Definition
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 15 Dezember 2016, 22:49:50
Hallo Dietmar,

die vom WeekdayTimer oder meinem dummy?

Gruß
Torsten
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 16 Dezember 2016, 00:37:04
WDT
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 16 Dezember 2016, 19:37:31
Hallo Dietmar,

hier das list des WDT:

Internals:
   COMMAND
   CONDITION
   DEF        KG.hz.ZS.Zirkulationspumpe de !$we|{myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","on",1)}|on !$we|{myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","off",1)}|off !$we|{myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","on",2)}|on !$we|{myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","off",2)}|off $we|{myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","on",1)}|on $we|{myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","off",1)}|off $we|{myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","on",2)}|on $we|{myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","off",2)}|off
   DEVICE     KG.hz.ZS.Zirkulationspumpe
   GlobalDaylistSpec
   LANGUAGE   de
   NAME       KG.hz.ZS.Zirkulationspumpe.tim
   NR         165
   Profil 0: Sonntag 06:30:00 on, 08:00:00 off, 18:30:00 on, 20:00:00 off
   Profil 1: Montag 04:30:00 on, 06:00:00 off, 16:30:00 on, 18:00:00 off
   Profil 2: Dienstag 04:30:00 on, 06:00:00 off, 16:30:00 on, 18:00:00 off
   Profil 3: Mittwoch 04:30:00 on, 06:00:00 off, 16:30:00 on, 18:00:00 off
   Profil 4: Donnerstag 04:30:00 on, 06:00:00 off, 16:30:00 on, 18:00:00 off
   Profil 5: Freitag 04:30:00 on, 06:00:00 off, 16:30:00 on, 18:00:00 off
   Profil 6: Samstag 06:30:00 on, 08:00:00 off, 18:30:00 on, 20:00:00 off
   Profil 7: Wochenende 06:30:00 on, 08:00:00 off, 18:30:00 on, 20:00:00 off
   Profil 8: Werktags 04:30:00 on, 06:00:00 off, 16:30:00 on, 18:00:00 off
   STATE      active
   STILLDONETIME 0
   TYPE       WeekdayTimer
   Readings:
     2016-12-16 19:29:32   currValue       off
     2016-12-16 19:29:32   nextUpdate      2016-12-17 06:30:00
     2016-12-16 19:29:32   nextValue       on
     2016-12-16 19:29:32   state           active
   SWITCHINGTIMES:
     !$we|{myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","on",1)}|on
     !$we|{myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","off",1)}|off
     !$we|{myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","on",2)}|on
     !$we|{myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","off",2)}|off
     $we|{myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","on",1)}|on
     $we|{myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","off",1)}|off
     $we|{myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","on",2)}|on
     $we|{myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","off",2)}|off
   Timer:
     Kg.hz.zs.zirkulationspumpe.tim_8:
       HASH       KG.hz.ZS.Zirkulationspumpe.tim
       MODIFIER   8
       NAME       KG.hz.ZS.Zirkulationspumpe.tim_8
     Kg.hz.zs.zirkulationspumpe.tim_settimerofday:
       HASH       KG.hz.ZS.Zirkulationspumpe.tim
       MODIFIER   SetTimerOfDay
       NAME       KG.hz.ZS.Zirkulationspumpe.tim_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:
         06:30:00   on
         08:00:00   off
         18:30:00   on
         20:00:00   off
       1:
         04:30:00   on
         06:00:00   off
         16:30:00   on
         18:00:00   off
       2:
         04:30:00   on
         06:00:00   off
         16:30:00   on
         18:00:00   off
       3:
         04:30:00   on
         06:00:00   off
         16:30:00   on
         18:00:00   off
       4:
         04:30:00   on
         06:00:00   off
         16:30:00   on
         18:00:00   off
       5:
         04:30:00   on
         06:00:00   off
         16:30:00   on
         18:00:00   off
       6:
         06:30:00   on
         08:00:00   off
         18:30:00   on
         20:00:00   off
       7:
         06:30:00   on
         08:00:00   off
         18:30:00   on
         20:00:00   off
       8:
         04:30:00   on
         06:00:00   off
         16:30:00   on
         18:00:00   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      1481859000
       PARA       on
       TIME       {myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","on",1)}
       TAGE:
         8
     2:
       EPOCH      1481864400
       PARA       off
       TIME       {myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","off",1)}
       TAGE:
         8
     3:
       EPOCH      1481902200
       PARA       on
       TIME       {myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","on",2)}
       TAGE:
         8
     4:
       EPOCH      1481907600
       PARA       off
       TIME       {myWeekdayTimerTimeTable(0,"KG.hz.ZS.Zirkulationspumpe","off",2)}
       TAGE:
         8
     5:
       EPOCH      1481866200
       PARA       on
       TIME       {myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","on",1)}
       TAGE:
         7
     6:
       EPOCH      1481871600
       PARA       off
       TIME       {myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","off",1)}
       TAGE:
         7
     7:
       EPOCH      1481909400
       PARA       on
       TIME       {myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","on",2)}
       TAGE:
         7
     8:
       EPOCH      1481914800
       PARA       off
       TIME       {myWeekdayTimerTimeTable(1,"KG.hz.ZS.Zirkulationspumpe","off",2)}
       TAGE:
         7
   Profile_idx:
     0:
       06:30:00   5
       08:00:00   6
       18:30:00   7
       20:00:00   8
     1:
       04:30:00   1
       06:00:00   2
       16:30:00   3
       18:00:00   4
     2:
       04:30:00   1
       06:00:00   2
       16:30:00   3
       18:00:00   4
     3:
       04:30:00   1
       06:00:00   2
       16:30:00   3
       18:00:00   4
     4:
       04:30:00   1
       06:00:00   2
       16:30:00   3
       18:00:00   4
     5:
       04:30:00   1
       06:00:00   2
       16:30:00   3
       18:00:00   4
     6:
       06:30:00   5
       08:00:00   6
       18:30:00   7
       20:00:00   8
     7:
       06:30:00   5
       08:00:00   6
       18:30:00   7
       20:00:00   8
     8:
       04:30:00   1
       06:00:00   2
       16:30:00   3
       18:00:00   4
   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:
   alias      Zeitsteuerung
   group      Zirkulationspumpe
   icon       sani_pump
   room       Heizungsraum,Zentrale Steuerung


Meine eigene Funktion myWeekdayTimerTimeTable wertet wie beschrieben, den Dummy mit den Informationen zu Urlaub aus und passt entsprechend die Start-/Endzeiten für die Zirkulationspumpe an.

Gruß

Torsten
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 16 Dezember 2016, 20:29:17
Die Zeitfunktionen werden immer Mitternachts ausgewertet.
Wenn du dein Dummy änderst, must du Weekdaytimer_SetAllParam() aufrufen
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 16 Dezember 2016, 21:51:23
Hallo Dietmar,

danke für den Hinweis, das würde ich dann in mein notify des dummy einbauen. Das Problem liegt ja aber nach wie vor darin, dass bei einem Neustart von fhem der Wert des Dummy bei der Berechnung des WDT nicht "berücksichtigt" wird.

Gruß

Torsten
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 17 Dezember 2016, 01:39:21
Starte das System mal mit hohem log Level. Nach dem Start sofort log Level auf einen normalen Wert zurück setzen.
Dann kannst du vielleicht erkennen ob die Reihenfolge oder sonst etwas stört.

Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 25 Dezember 2016, 18:22:26
Hallo Dietmar,

habe mir mal über die Feiertage die Zeit genommen und beim Neustart von fhem verbose 5 aktiviert. Nachfolgend die Ausschnitte aus der Logdatei und man sieht m.E. gut, dass das setstate für meinen "Urlaubsdummy" viel später kommt, nachdem bereits der WDT abgearbeitet wurde:

2016.12.25 17:21:03.462 5: Cmd: >get BW 12-31<
2016.12.25 17:21:03.465 4: myWeekdayTimerTimeTable - Wochenende: 1
2016.12.25 17:21:03.465 4: myWeekdayTimerTimeTable - Device: KG.hz.ZS.Zirkulationspumpe
2016.12.25 17:21:03.465 4: myWeekdayTimerTimeTable - Event: on
2016.12.25 17:21:03.465 4: myWeekdayTimerTimeTable - Index: 1
2016.12.25 17:21:03.466 4: myWeekdayTimerTimeTable - Urlaub: nein
2016.12.25 17:21:03.466 3: myWeekdayTimerTimeTable - Return: 06:30
2016.12.25 17:21:03.467 4: myWeekdayTimerTimeTable - Wochenende: 1
2016.12.25 17:21:03.467 4: myWeekdayTimerTimeTable - Device: KG.hz.ZS.Zirkulationspumpe
2016.12.25 17:21:03.467 4: myWeekdayTimerTimeTable - Event: on
2016.12.25 17:21:03.467 4: myWeekdayTimerTimeTable - Index: 1
2016.12.25 17:21:03.468 4: myWeekdayTimerTimeTable - Urlaub: nein
2016.12.25 17:21:03.468 3: myWeekdayTimerTimeTable - Return: 06:30
2016.12.25 17:21:03.469 4: myWeekdayTimerTimeTable - Wochenende: 1
2016.12.25 17:21:03.469 4: myWeekdayTimerTimeTable - Device: KG.hz.ZS.Zirkulationspumpe
2016.12.25 17:21:03.469 4: myWeekdayTimerTimeTable - Event: on
2016.12.25 17:21:03.469 4: myWeekdayTimerTimeTable - Index: 1
2016.12.25 17:21:03.469 4: myWeekdayTimerTimeTable - Urlaub: nein
2016.12.25 17:21:03.470 3: myWeekdayTimerTimeTable - Return: 06:30
2016.12.25 17:21:03.470 4: myWeekdayTimerTimeTable - Wochenende: 1
2016.12.25 17:21:03.471 4: myWeekdayTimerTimeTable - Device: KG.hz.ZS.Zirkulationspumpe
2016.12.25 17:21:03.471 4: myWeekdayTimerTimeTable - Event: on
2016.12.25 17:21:03.471 4: myWeekdayTimerTimeTable - Index: 1
2016.12.25 17:21:03.471 4: myWeekdayTimerTimeTable - Urlaub: nein
2016.12.25 17:21:03.472 3: myWeekdayTimerTimeTable - Return: 06:30
2016.12.25 17:21:03.473 5: Cmd: >get BW 12-25<
...
2016.12.25 17:21:04.986 5: Cmd: >setstate T_L_Kalender_Start active<
2016.12.25 17:21:04.987 5: Cmd: >setstate T_L_Kalender_Start 2016-12-25 17:19:00 state active<
2016.12.25 17:21:04.987 5: Cmd: >setstate Tischleuchten off<
2016.12.25 17:21:04.988 5: Cmd: >setstate Tischleuchten 2016-12-25 17:14:06 LastDevice E1.wz.ZS.Tischleuchte<
2016.12.25 17:21:04.988 5: Cmd: >setstate Tischleuchten 2016-12-25 17:14:06 LastDevice_Abs E1.wz.ZS.Tischleuchte<
2016.12.25 17:21:04.989 5: Cmd: >setstate Tischleuchten 2016-12-25 17:14:06 state off<
2016.12.25 17:21:04.989 5: Cmd: >setstate Urlaub.ZS.dum atHome<
2016.12.25 17:21:04.990 5: Cmd: >setstate Urlaub.ZS.dum 2016-12-25 17:18:40 state atHome<
2016.12.25 17:21:04.991 5: Cmd: >setstate WeatherAtHome <strong>Schwetzingen (Yahoo)</strong></br>Temperatur: 8 °C</br>Feuchtigkeit: 81 %</br>Luftdruck: 1013 hPa</br>Konditionen: wolkig</br>Wind: Wind: SW 14 km/h</br>Stand: 2016-12-25 17:20:22<


Insgesamt wir zwar WDT mehrfach durchlaufen, aber eben leider ohne, dass mein Dummy wieder den richtigen Wert hat.

Gibt es eine Lösung für das Problem?

Gruß
Torsten
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 25 Dezember 2016, 21:26:54
Du kannst nach dem Ereignis initialized Heating_Control_SetAllTemp () in einem notify aufrufen.
Dann werden die timer erneut geladen
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 25 Dezember 2016, 21:45:24
Hallo Dietmar,

danke für den Tipp, werde dann ein notify dafür nutzen.

Gruß

Torsten
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 26 Dezember 2016, 12:51:12
Hallo Dietmar,

habe ein Notify eingericht, das ausgeführt wird, sobald fhem initialisiert ist.

Der Aufruf von Heating_Control_SetAllTemps() geht aber nur auf alle mit HC definierten Timer:
2016.12.26 12:44:49.897 3: Heating_Control_SetAllTemps() done on: E2.ku.ZS.Heizung.tim ST.bz.HR.Steuerung.tim


Dann habe ich es mit WeekdayTimer_SetAllParms() probiert, mit dem zwar alle WDT angesprochen werden - auch der für die Zirkulationspumpe, aber meine eigene Funktion wird dabei nicht ausgeführt. Es fehlen die Log-Einträge meiner Funktion und für die Werte der Schaltzeiten wird der Urlaubsdummy nicht berücksichtigt.

2016.12.26 12:38:46.032 3: WeekdayTimer_SetAllParms() done on: E1.wz.ZS.Bodenheizung.tim.wt E1.wz.ZS.Heizung.tim E1.wz.ZS.Wandheizung.tim.we E1.wz.ZS.Wandheizung.tim.wt E2.ez.ZS.Bodenheizung.tim.we E2.ez.ZS.Bodenheizung.tim.wt EG.fl.HR.Steuerung.tim KG.hz.ZS.Zirkulationspumpe.tim ST.sz.HR.Steuerung.tim ZS.zs.HR.mainRadiators.tim

Was mache ich falsch?

Gruß
Torsten
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 26 Dezember 2016, 14:13:32
Es werden nur Devices, die als Heizung erkannt werden, automatisch geschaltet. Zirkulationspumpen gehören nicht dazu.
Man kann das aber mit Switchinthepast erzwingen.
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: ToKa am 26 Dezember 2016, 19:40:07
Hallo Dietmar,

ich will ja auch gar nicht, dass etwas geschaltet wird, sondern nur, dass die Schaltzeiten neu berechnet werden, so dass mein "Urlaubsdummy" berücksichtigt wird.

Kann ich nicht die Funktion von WDT aufrufen, die Du um Mitternacht benutzt, um die Schaltzeiten neu zu berechnen? Wenn ja, wie lautet diese?

Gruß

Torsten
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 26 Dezember 2016, 20:08:05
Ja, das geht, ist aber nicht so einfach.
Bin noch bis morgen Abend im Weihnachtsurlaub. Dann suche ich den Aufruf heraus.
Titel: Antw:WeekdayTimer und Perlfunktion für time
Beitrag von: Dietmar63 am 27 Dezember 2016, 18:42:34
versuch mal:
WeekdayTimer_SetTimerForMidnightUpdate( { HASH => $defs{WDTNAME}} )
WDTNAME musst du ersetzen, durch deine Bezeichung des WDT.