Ronny,
Du hast Recht! Mein Code funktioniert jetzt. Mein Aufruf war falsch!
package main;
use strict;
use warnings;
use POSIX;
use Time::Local;
sub myAbfallTermine_Initialize($$)
{
my ($hash) = @_;
}
sub
Abfalltermine ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my $t = time;
my $dtPapier = '';
my $dtWertstoff = '';
my $dtRest = '';
my $dtPfadfinder = '';
my $dtBeda = '';
my $dtDummy = '';
foreach my $uid (@uids) {
my $Kalendertext = fhem("get cal.01.AF summary $uid");
if ($Kalendertext =~ /Papiertonne/) {
my $dt = fhem("get cal.01.AF start $uid");
my @SplitDt = split(/ /,$dt);
my @SplitDate = split(/\./,$SplitDt[0]);
my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
if ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
{
$dtPapier = $eventDate;
}
};
if ($Kalendertext =~ /Wertstofftonne/) {
my $dt = fhem("get cal.01.AF start $uid");
my @SplitDt = split(/ /,$dt);
my @SplitDate = split(/\./,$SplitDt[0]);
my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
if ($dtWertstoff eq '' || ($eventDate < $dtWertstoff && $eventDate > $t))
{
$dtWertstoff = $eventDate;
}
};
if ($Kalendertext =~ /Restmüll/) {
my $dt = fhem("get cal.01.AF start $uid");
my @SplitDt = split(/ /,$dt);
my @SplitDate = split(/\./,$SplitDt[0]);
my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
if ($dtRest eq '' || ($eventDate < $dtRest && $eventDate > $t))
{
$dtRest = $eventDate;
}
};
if ($Kalendertext =~ /Pfadfinder/) {
my $dt = fhem("get cal.01.AF start $uid");
my @SplitDt = split(/ /,$dt);
my @SplitDate = split(/\./,$SplitDt[0]);
my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
if ($dtPfadfinder eq '' || ($eventDate < $dtPfadfinder && $eventDate > $t))
{
$dtPfadfinder = $eventDate;
}
};
if ($Kalendertext =~ /Pater Beda/) {
my $dt = fhem("get cal.01.AF start $uid");
my @SplitDt = split(/ /,$dt);
my @SplitDate = split(/\./,$SplitDt[0]);
my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
if ($dtBeda eq '' || ($eventDate < $dtBeda && $eventDate > $t))
{
$dtBeda = $eventDate;
}
};
if ($Kalendertext =~ /Dummy/) {
my $dt = fhem("get cal.01.AF start $uid");
my @SplitDt = split(/ /,$dt);
my @SplitDate = split(/\./,$SplitDt[0]);
my $eventDate = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
if ($dtDummy eq '' || ($eventDate < $dtDummy && $eventDate > $t))
{
$dtDummy = $eventDate;
}
};
my $dayDiffP = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
if ($dayDiffP >= 0) {
fhem("set SP.xx.AF.Papier.dum $dayDiffP");
}
my $dayDiffW = floor(($dtWertstoff - $t) / 60 / 60 / 24 + 1);
if ($dayDiffW >= 0) {
fhem("set EI.xx.AF.Wertstoffe.dum $dayDiffW");
}
my $dayDiffR = floor(($dtRest - $t) / 60 / 60 / 24 + 1);
if ($dayDiffR >= 0) {
fhem("set NN.xx.AF.RestMuell.dum $dayDiffR");
}
my $dayDiffPf = floor(($dtPfadfinder - $t) / 60 / 60 / 24 + 1);
if ($dayDiffPf >= 0) {
fhem("set NN.xx.AF.Pfadfinder.dum $dayDiffPf");
}
my $dayDiffB = floor(($dtBeda - $t) / 60 / 60 / 24 + 1);
if ($dayDiffB >= 0) {
fhem("set NN.xx.AF.Beda.dum $dayDiffB");
}
my $dayDiffD = floor(($dtDummy - $t) / 60 / 60 / 24 + 1);
if ($dayDiffD >= 0) {
fhem("set NN.xx.AF.Dummy.dum $dayDiffD");
}
}
}
Ich habe in meinen Abfallkalender für heute den Eintrag "Dummy" geschrieben und bekomme nun "0" Tage angezeigt.
Einen Haken hat die Sache dennoch! Wenn es keinen weiteren Eintrag im Kalender mehr gibt, bleibt der Countdown auf "0" stehen, d.h., wenn mein Dummy Eintrag morgen aus dem Kalender verschwunden ist, dann bleibt die "0" stehen. Das Problem tritt zum Jahresende auf, wenn die Abfalltermine für das kommende Jahr noch nicht fest stehen Das ist blöd! Das müsste man noch irgendwie abfangen.
Christian.