98_JsonMod.pm - typo in commandref

Begonnen von betateilchen, 01 März 2022, 17:51:39

Vorheriges Thema - Nächstes Thema

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

herrmannj

da liegst du richtig:) Danke, wird korrigiert.

betateilchen

#2
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".
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

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
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

herrmannj

#4
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!

betateilchen

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!
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

herrmannj

#6
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)

herrmannj

#7
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.

betateilchen

Im Moment läuft das Ganze unauffällig.
*/10 funktioniert mit den Änderungen auch wie gewünscht.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

yersinia

viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

betateilchen

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)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

herrmannj

@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 ;)

herrmannj

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

yersinia

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]
viele Grüße, yersinia
----
FHEM 6.4 (SVN) on RPi 4B with RasPi OS Bookworm (perl 5.36.0) | FTUI
nanoCUL->2x868(1x ser2net)@tsculfw, 1x433@Sduino | MQTT2 | Tasmota | ESPEasy
VCCU->14xSEC-SCo, 7xCC-RT-DN, 5xLC-Bl1PBU-FM, 3xTC-IT-WM-W-EU, 1xPB-2-WM55, 1xLC-Sw1PBU-FM, 1xES-PMSw1-Pl

herrmannj

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.