Weil ich den Bedarf habe, am ersten Samstag des Monats eine Erinnerung zu erhalten, dachte ich an eine Cron-Definition (https://crontab.guru/#35_11_1-6_*_sat) für zB ein at-Device. Es gibt für periodische ats bereits einen passenden Wiki-Eintrag AT kleine Helferlein (https://wiki.fhem.de/wiki/AT_kleine_Helferlein), welche dies bereits zur Verfügung stellt.
Für JsonMods (https://fhem.de/commandref.html#JsonMod) Interval definition wird eine Crontab-nahe Syntax verwendet, welche durch Cron.pm (https://svn.fhem.de/trac/browser/trunk/fhem/lib/FHEM/Scheduler/Cron.pm) verarbeitet wird. Diese Funktionalität steht FHEM-weit zur Verfügung.
Vielen Dank geht hier an herrmannj (https://forum.fhem.de/index.php?action=profile;u=769) für die Arbeit zu Cron.pm - und auch JsonMod.
Diese Crontab-nahe Syntax kann man über eine Wrapperfunktion auch at-Devices zugänglich machen, dafür benötigt man folgenden Code-Schnippsel in zB der 99_myUtils.pm.
Dies ist ein erster Wurf (frühe Testversion) und kann sicher noch verbessert werden - ist demnach derzeit mit Vorsicht zu genießen.sub CronConvert {
# created by yersinia - version 2026-06-30
# based on and with code from herrmannj Cron.pm and 98_JsonMod.pm
#
# Forum:
# call examples:
# {main::CronConvert('35 11 * * sat#2')} = second saturday each month at 11:35; returns epoch time
#
# if perlfunc() is used as timespec for at, blanks are not allowed and cron definition requires to mask blanks with \_
# {main::CronConvert('35\_11\_*\_*\_sat#2')}
#
my $cc_cron_def = shift // return 'CRON definition missing';
my $cc_ret_fmt = shift // 'unix_epoch';
my $hash;
my $r;
my $err;
$cc_cron_def =~ s/\\\_/ /g; #if perlfunc() is used as timespec for at device, blanks are not allowed and are masked as \_
$hash->{'CRONCONVERT'}->{'CRON'} = $cc_cron_def;
($hash->{'CRONCONVERT'}->{'CRON'}, $err) = FHEM::Scheduler::Cron->new($cc_cron_def);
if ($err) {
return "CronConvert $cc_dev: $err";
}
my @t = localtime(Time::HiRes::time());
$t[4] += 1;
$t[5] += 1900;
($r, $err) = $hash->{'CRONCONVERT'}->{'CRON'}->next(sprintf('%04d%02d%02d%02d%02d%02d', $t[5], $t[4], $t[3], $t[2], $t[1], $t[0]));
if ($err) {
return "CronConvert $cc_dev, cron returned error: $err";
} else {
my @u = ($r =~ m/([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})/);
# 0 = year, 1 = month, 2 = day, 3 = hour, 4 = minutes, 5 = secs
$u[0] = $u[0] - 1900;
$u[1] = $u[1] -1;
my $ts = timelocal($u[5], $u[4], $u[3], $u[2], $u[1], $u[0]);
if ($cc_ret_fmt eq "date") {
return FmtDateTime($ts);
} else {
return $ts; #unix_epoch
}
}
return "CronConvert $cc_dev, something did not work; end of function sub reached";
}Crontab-syntax kann über https://crontab.guru/ (https://crontab.guru/) getestet werden.
Die Funktion erwartet folgende Parameter:
{main::CronConvert('<Crontab Definition>'[,'<Ausgabeformat'])}- <Crontab Definition>: crontab Definition, siehe auch https://crontab.guru/ (https://crontab.guru/), dabei gilt zu beachten:
- at erlaubt in der perlfunc keine Leerzeichen - diese werden durch \_ maskiert; aus
2 2 * * monwird
2\_2\_*\_*\_monDie Funktion kann (außerhalb vom at Aufruf) auch mit Leerzeichen arbeiten - Crontab Definitionen wie
35 11 1-7 * satwerden nicht unterstützt und müssen als
35 11 * * sat#1geschrieben werden, wobei für die Wochentagsdefinition
<Wochentag>#<welcher(1., 2., 3. usw)>gilt.
- <Ausgabeformat>, optional: mit date wird YYYY-MM-DD HH:MM:SS ausgegeben, ansonsten unix epoch (Standard)
Aufruf der Funktion zB in der FHEM-Befehlszeile:
{main::CronConvert('0 9 * * mon','date')}gibt den nächsten Montag, 9:00 zurück.
Ein at, welches immer am zweiten Sonnabend im Monat ausgeführt werden soll, könnte so definiert werden:
defmod at_Erinnerung at *{main::CronConvert('5\_12\_*\_*\_sat#2')} Tu was
Zitat von: yersinia am 30 Juni 2026, 13:11:54Ein at, welches immer am zweiten Sonntag im Monat ausgeführt werden soll, könnte so definiert werden:
defmod at_Erinnerung at *{main::CronConvert('5\_12\_*\_*\_sat#2')} Tu was
Bist Du sicher, dass das am Sonntag funktioniert, wenn Du in der timespec "sat" angibst?
Zitat von: betateilchen am 30 Juni 2026, 17:50:09Zitat von: yersinia am 30 Juni 2026, 13:11:54Ein at, welches immer am zweiten Sonntag im Monat ausgeführt werden soll, könnte so definiert werden:
defmod at_Erinnerung at *{main::CronConvert('5\_12\_*\_*\_sat#2')} Tu was
Bist Du sicher, dass das am Sonntag funktioniert, wenn Du in der timespec "sat" angibst?
Ich bin mir sicher, dass das nicht funktionieren wird. Danke für den Hinweis, ich korrigiere das.