Hallo,
ich nutze schon mehrere Wochen den Ical Kalender von meinem Entsorungsunternehmen im Fhem plus den Dummy der mir mittels Code in der 99_myUtils.pm die Tage ausgibt wann die nächste Leerung sein wird.
Inzwischen habe ich mir einen Tonnenanzeiger auf Mysensors Basis gebastelt. Dieser zeigt mir mittels einer Multicolor Led an, wann ich welche Tonne rausstellen muss.
Also Blau für Papiertonne, Gelb für Gelbe Tonne, Braun für Biomüll usw.. Dafür habe ich auf die Schnelle den Relaissketch hergenommen und entsprechend angepasst. Ein set Tonne status1 on übermittelt dem Anzeiger das die blaue Led leuchten soll, für die anderen Tonnen wäre das also status 2,3,4. Dies funktioniert schonmal aus Fhem heraus super. Nun mal der Code wo ich die Frage dazu habe:
sub
Abfalltermine()
{
my $t = time;
my @Tonnen = ("BioTonne", "GelbeTonne", "PapierTonne", "AscheTonne");
my @SuchTexte = (".*Bio.*", ".*Gelbe.*", ".*Blaue.*", ".*Rest.*");
my $uid;
my $dayDiff;
for(my $i=0; $i<4; $i++)
{
$dayDiff = -1; #BUG behoben
my @uids = split(/;/,fhem("get Abfallplan find $SuchTexte[$i]"));
#den nächsten Termin aus allen uids finden
foreach $uid (@uids)
{
my $eventDate = KalenderDatum('Abfallplan', $uid);
my $dayDiffNeu = floor(($eventDate - $t) / 60 / 60 / 24 + 1);
if ($dayDiffNeu >= 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1)) #BUG behoben
{
$dayDiff = $dayDiffNeu;
}
}
fhem("setreading Muelltermin $Tonnen[$i] $dayDiff");
if ($dayDiff == 1) <--- meine Idee dazu
{ <--- meine Idee dazu
fhem("set Tonne status$i on") <--- meine Idee dazu
} else { <--- meine Idee dazu
fhem("set Tonne status$i off") <--- meine Idee dazu
}
}
}
Nun will ich ja das der LedAnzeiger einen Tag eher leuchtet, da der Code die Anzahl der Tage an Fhem zurückgibt, werte ich einfach aus wann $dayDiff ==1 ist. Für mein Perlverständnis verstehe ich den Code so das dieser mittels der Schleife 4 mal durchlaufen wird, quasi für ("BioTonne", "GelbeTonne", "PapierTonne", "AscheTonne").
Die Variable $i zählt jedesmal eins hoch, wenn nun dayDiff gleich 1 wäre, was einen Tag vor der Leerung wäre, kann ich doch einfach fhem("set Tonne status$i on") setzen und die Led würde leuchten. Zum Teil macht sie das auch, nur mittels der falschen Farben. Kann mir jemand sagen wie man es vielleicht geschickter angeht, der Ansatz wäre ja schonmal gut. -> Das mysensors Device erkennt also status1 ist Blaue Tonne, status2 gelbe Tonne, status3 Biotonne, status4 Restmüll. Irgendwo fehlt mir also bissl das Verständnis zu Perl.
Okay ich geb mir antwort jetzt mal selber. Hab einfach folgende Zeile my $j = $i + 1; eingefügt und nun klappt es wie es soll. Bei Interesse kann ich ja mal das gesamte Projekt zur Verfügung stellen.
sub
Abfalltermine()
{
my $t = time;
my @Tonnen = ("BlaueTonne", "GelbeTonne", "BioTonne", "AscheTonne");
my @SuchTexte = (".*Blaue.*", ".*Gelbe.*", ".*Bio.*", ".*Rest.*");
my $uid;
my $dayDiff;
for(my $i=0; $i<4; $i++)
{
$dayDiff = -1; #BUG behoben
my @uids = split(/;/,fhem("get Abfallplan find $SuchTexte[$i]"));
#den nächsten Termin aus allen uids finden
foreach $uid (@uids)
{
my $eventDate = KalenderDatum('Abfallplan', $uid);
my $dayDiffNeu = floor(($eventDate - $t) / 60 / 60 / 24 + 1);
if ($dayDiffNeu >= 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1)) #BUG behoben
{
$dayDiff = $dayDiffNeu;
}
}
fhem("setreading Muelltermin $Tonnen[$i] $dayDiff");
my $j = $i + 1;
if ($dayDiff == 1)
{
fhem("set Tonne status$j on")
} else {
fhem("set Tonne status$j off")
}
}
}
Grüße Grobby