Zitat
Attributes
interval
set <name> interval <*/15 * * * *>
utilize a cron expression to define the interval at which the source file will be loaded. Default is one hour.
Da sollte vermutlich "attr" statt "set" stehen.
da liegst du richtig:) Danke, wird korrigiert.
Wo wir gerade beim Thema Intervall sind...
interval */10 8-19 * * *
Berechnet aktuell (20:45 Uhr) den nächsten Ausführungszeitpunkt auf 08:10 Uhr morgen früh.
Meine Erwartung war eigentlich, dass die erste Ausführung damit um 08:00 Uhr erfolgt.
Edit:
interval 0/10 8-19 * * *
bewirkt keine Änderung, auch hier wird die Ausführung auf 08:10 Uhr berechnet.
Vorübergehend habe ich nun
interval 1/10 8-19 * * *
gesetzt, damit erfolgt die Ausführung erstmalig um 08:01 Uhr. Das ist unschön, aber immerhin nur 1 Minute "falsch".
Hallo Jörg,
kannst Du das mal bitte prüfen?
Mit dem patch erfolgt bei mir die Berechnung der Startzeit augenscheinlich korrekt.
Ob das gleiche Problem auch in parseHourEntry() auftritt, habe ich nicht geprüft.
Index: 98_JsonMod.pm
===================================================================
--- 98_JsonMod.pm (revision 25757)
+++ 98_JsonMod.pm (working copy)
@@ -1557,7 +1557,7 @@
$res = $now + $res;
return $start + 60 if ($res > $stop); # carry over
- return $res; # regular next
+ return $start; # regular next
};
sub parseHourEntry {
@@ -1875,4 +1875,4 @@
</ul>
=end html
-=cut
\ No newline at end of file
+=cut
Danke für die Fehlersuche, liegt aber tiefer. So wie unten müsste es passen. Es gibt einen Nebeneffekt:
Wenn ich um 20:45:30 einen Timer hole, welcher auf "45 Minuten" matched (zb '*/5') würde der Cron jetzt 20:45:00 liefern, ergo sofort wieder laufen. Der JSON File würde also in der Minute mehrfach abgeholt, das soll so nicht sein. Damit das nicht passiert, muss noch die Zeile #526 geändert werden:
my @t = localtime(Time::HiRes::time() +60);
parseMinuteEntry:
sub parseMinuteEntry {
my ($self, $in, $now) = @_;
my ($res, $start, $stop, $step);
($step) = ($in =~ m/\/([0-9]|[0-5][0-9])$/);
($start, $stop) = ($in =~ m/^([*]|[0-9]|[0-5][0-9])(?:-([0-9]|[0-5][0-9]))?(?:\/(?:[0-9]|[0-5][0-9]))?$/);
return if (not defined($start) or ($start eq '*' and defined($stop))); # syntax error
$stop = (defined($step) or ($start eq '*'))?59:$start if (not defined($stop));
$start = 0 if $start eq '*';
return if ($start > $stop); # syntax error
return $start if ($now < $start); # literal start
$res = $step //= 1;
$res = ($now - $start) % $res;
return $now if ($res == 0) and ($now <= $stop); # current minute
$res = $now + $step - $res;
return $start + 60 if ($res > $stop); # carry over
return $res; # regular next
};
Magst Du das testen? Danke!
Moin, danke für die schnelle Reaktion.
Die vorgeschlagene Änderungen habe ich eingebaut. Getestet mit dem Intervall "0/10 8-10 * * *" ergab sich das gewünschte Verhalten.
- Der Abruf der Daten erfolgt im 10-Minuten-Takt, die letzte Ausführung war um 10:50 Uhr.
- Der nächste Ausführungszeitpunkt ist nun für morgen 08:00 Uhr berechnet.
Genau so hatte ich mir das vorgestellt. Super!
perfekt, dank zurück.
Ich teste das nochmal gründlich gegen diverse mögliche und unmögliche cron expressions. Falls das alles ok ist checke ich das dann die kommenden Tage ein. Zusätzliche Tests Deinerseits natürlich ebenfalls hoch willkommen. ("0/10 8-10 * * *" sollte gleich "*/10 8-10 * * *", das meine ich gestern Abend auch getestet zu haben)
wart mal, 8-10 ... dann müsste die letzte Ausführung vmtl 9:50 sein, nicht 10:50 (?).
Edit: ne, das macht eigentlich keinen Sinn. Hour darf 0-23 sein. Ergo muss STOP inkludiert sein, sonst würde ich nie auf 23:30 kommen. Gleiches für "30 23 * * *" da ist die auch drin. Passt.
Im Moment läuft das Ganze unauffällig.
*/10 funktioniert mit den Änderungen auch wie gewünscht.
Hi herrmannj,
beinhaltet der fix auch die erweitertete cron-notation (https://forum.fhem.de/index.php/topic,111487.msg1057145.html#msg1057145)?
Zitat von: herrmannj am 02 März 2022, 10:59:09
Ich teste das nochmal gründlich gegen diverse mögliche und unmögliche cron expressions.
dann teste doch mal
1,59 0-7,20-23 * * *
da wird aktuell (15:50) die nächste Ausführung auf 20:59 berechnet anstatt auf 20:01 8)
@yersinia. nein noch nicht
@betateilchen, ja weil Kommata (so wie Wochentage) nicht berücksichtigt werden.
Aber gut, ich wollte das eh noch für was anderes nehmen, dann bau ich mal den syntax auf eure corner cases aus ;)
https://crontab.guru/#5/5,28/5,53-55_4_*_*_*
5/5,28/5,53-55 4 * * *
"At every 5th minute from 5 through 59, every 5th minute from 28 through 59, and every minute from 53 through 55 past hour 4."
message to me: einfach mal die Klappe halten
Zitat von: herrmannj am 04 März 2022, 16:14:26Aber gut, ich wollte das eh noch für was anderes nehmen, dann bau ich mal den syntax auf eure corner cases aus ;)
pff, corner case ;D
aber mal [OT]: die cron-Notation und die dazugehörige Funktion hätte ich -neben JsonMod- auch gern für at, DOIF, HTTPMOD, Calendar, ABFALL und alles andere was irgendwie mit Interval arbeitet. Das wäre geil und mächtig. imho.
Gibt es Ambitionen/Möglichkeiten die cron-Notation außerhalb von JsonMod zur Verfügung zu stellen?[/OT]
CRON (.pm oder was auch immer) so zur Verfügung zu stellen wäre mein Ziel. Ob die maintainer der genannten Module das dann nutzen, das liegt nicht bei mir.
Kann man denn nicht Schedule::Cron (https://metacpan.org/pod/Schedule::Cron) (ja, ich kann eine Suchmaschine benutzen ^^) nutzen? Oder weicht deine Implementierung ab?
eher schwierig
Zitat von: herrmannj am 04 März 2022, 16:14:26
@betateilchen, ja weil Kommata (so wie Wochentage) nicht berücksichtigt werden.
Nur mal so (ja ich habe Deinen Folgekommentar gelesen): meine Intervalldefinition funktioniert grundsätzlich von 20-07:59 wie gewünscht.
Nur der erste Zeitpunkt stimmt nicht. Soll: 20:01, Ist: 20:59
Danach wird um 21:01 Uhr korrekt weitergearbeitet.
"1,30,59 0-7,20-23 * * *" funktioniert auch, dann wird der erste Ausführungszeitpunkt auf 20:30 Uhr berechnet.
Es scheint so, dass der erste Eintrag in der Komma-Liste verlorengeht.
Zitat von: yersinia am 04 März 2022, 16:31:36
aber mal [OT]: die cron-Notation und die dazugehörige Funktion hätte ich -neben JsonMod- auch gern für at, DOIF, HTTPMOD, Calendar, ABFALL und alles andere was irgendwie mit Interval arbeitet.
Das hätte ich auch gerne.
Zitat von: herrmannj am 04 März 2022, 16:43:27
CRON (.pm oder was auch immer) so zur Verfügung zu stellen wäre mein Ziel. Ob die maintainer der genannten Module das dann nutzen, das liegt nicht bei mir.
Naja, es muss halt möglichst einfach zu verwenden sein. Es gab vor einiger Zeit schonmal den Versuch, mit computeAlignTime() in fhem.pl die Berechnung von align-Attributen zu vereinfachen/vereinheitlichen. Aber ausser dem at selbst kenne ich kein Modul, das diese Funktion tatsächlich benutzt.
Zitat von: betateilchen am 04 März 2022, 17:20:51
Nur mal so (ja ich habe Deinen Folgekommentar gelesen): meine Intervalldefinition funktioniert grundsätzlich von 20-07:59 wie gewünscht.
Nur der erste Zeitpunkt stimmt nicht. Soll: 20:01, Ist: 20:59
Danach wird um 21:01 Uhr korrekt weitergearbeitet.
"1,30,59 0-7,20-23 * * *" funktioniert auch, dann wird der erste Ausführungszeitpunkt auf 20:30 Uhr berechnet.
Es scheint so, dass der erste Eintrag in der Komma-Liste verlorengeht.
du hast recht, Kommata hatte ich bereits implementiert. ist dann offensichtlich ein bug, danke fürs aufspüren, ich arbeite dran
Ja, mach Dir keinen Streß. Ich bin da auch nur zufällig drauf gestoßen, ist aber eher unkritisch.
Eigentlich wollte ich nur einen Tippfehler melden :D
den ignoriere ich erstmal :D hat ja zu zwei (echten) bug meldungen geführt, da gilts nachzuarbeiten
Bezüglich des ignorierten Tippfehler könnte man auch darüber nachdenken, ob "interval" die richtige Bezeichnung für das Attribut ist. Mit crontab-ähnlichen Einträgen werden ja nicht Ausführungsintervalle definiert, sondern Ausführungszeitpunkte. Vielleicht wäre "schedule" oder "crontab" als Attributname klarer in ihrer Bedeutung.
Ich habe keine Ahnung wieso, aber die eingebauten Änderungen funktionieren heute nicht mehr.
*/10 7-20 * * *
liefert aktuell 07:20 als nächsten Ausführungszeitpunkt.
Aber vielleicht übersehe ich auch gerade irgendwas aufgrund der späten Uhrzeit.
Danke fürs bescheid sagen. Steck nicht zu viel rein, sobald die kommende version fertig ist, wären ausführliche tests nochmals sehr hilfreich. da dann auch im 'at'