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
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.
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?
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.
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?
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
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)...
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.
Wo genau muss ich die printIntTimer denn aufrufen bzw einhängen?
ü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:
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?
Ich habe mir ein dummy gebastelt.
ja, die Tagestimer sind ja abgearbeitet. Kurz nach Mitternacht werden die timer von morgen gesetzt.
Habe ich nun gemacht! Mal sehen, was heraus kommt.
Vielen Dank für deinen Einsatz und deine Hilfe!
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: ===============================================
Das ist in der Tat merkwürdig.
Ich probiere das heute Abend bei mir mal aus.
kannst du mir den Code von randomtime() schicken.
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...
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
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. ;)
@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 (https://forum.fhem.de/index.php/topic,69704.0.html) 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
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
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...
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.
Wir wechseln mal zum anderen Thread... ;)
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...