Hallo zusammen,
nachdem ich hier schon viel gelesen und gelernt habe, möchte ich mal mein Snippet zur Müllabfuhr Auswertung einwerfen.
Hab selbst viel gespielt, bis ich zu diesem brauchbaren Ergebnis gekommen bin. Das Script basiert auf den Wiki Eintrag
http://www.fhemwiki.de/wiki/Google-Kalender_zur_Steuerung_von_Dummies (http://www.fhemwiki.de/wiki/Google-Kalender_zur_Steuerung_von_Dummies)
und wurde von mir etwas vereinfacht.
Ich wollte:
- Datum tt.mm bis zum nächsten Termin
- ein Dummy, das on ist, wenn der Termin in 48 Stunden ist
- Das Script nicht ändern müssen, wenn eine neue Art Termin dazu kommt
Voraussetungen:
- Ein definierter Kalender (ich verwende einen Google Kalender mit wiederkehrenden Terminen). Im Beispiel: Abfallkalender
- Dummys für die Arten der Müllabfuhr. Im Beispiel: BioDatum (zur Datumsanzeige), BioStatus (Für on/off Anzeige), RestmuellDatum, RestmuellStatus
- Das angepasste Snippet
- Ein Notify dass das Script aufruft
Deutsch/Englisch ist bei mir etwas gemischt, da ich Backend Code gerne Englisch verfasse.
define AbfallNotify notify Abfallkalender:.*googlecom.* {\
GarbageParsing("$EVENT");;;;\
}
use Date::Parse;
use Time::Piece;
my $calenderName = "Abfallkalender"; # name of calendar
my $timeDiffSet = 48; #time in hours to set event dummy 1
my $dateDummyName = "Datum"; #name of dummy for event date
my $stateDummyName ="Status"; #name of dummy for event status
sub GarbageParsing ($) {
my ($eventData) = @_;
my @eventArray = split(":",$eventData);
my $eventType = $eventArray[0];
my @uids=split(/;/, $eventArray[1]);
foreach my $uid (@uids) {
my $calendarText = fhem("get $calenderName summary $uid");
my $calendarDate = fhem("get $calenderName start $uid");
my $calendarTime = Time::Piece->strptime($calendarDate, "%d.%m.%Y %H:%M:%S");
my $date = $calendarTime->strftime('%d.%m');
my $now = localtime;
my $timeDiff = ($calendarTime-$now)/3600;
fhem("set $calendarText$dateDummyName $date");
if($eventType eq "modeUpcoming" || $eventType eq "modeStarted") {
if($timeDiff<$timeDiffSet) {
fhem("set $calendarText$stateDummyName on");
}
else {
fhem("set $calendarText$stateDummyName off");
}
}
elsif($eventType eq "modeEnded" || $eventType eq "modeEnd") {
fhem("set $calendarText$stateDummyName off");
fhem("set $calendarText$dateDummyName 0");
}
};
}
Die Termine werden geholt, das Datum mittels Piece und strftime in mm.tt umgewandelt und die Dummies entsprechend gesetzt.
Um das Anlegen von vielen Notifies und Anpassung des Scripts für verschiedene Terminarten zu vermeiden habe ich es so allgemein gestaltet.
Es müssen eben zu jedem Ereignisname im Kalender die entsprechenden Dummies mit den Namenserweiterungen, wie in
$dateDummyName und
$stateDummyName definiert, vorhanden sein.
Am Ende des Termins wird der Status Dummy wieder auf off gesetzt und das Datum, sofern nicht durch einen neuen, wiederkehrenden Termin neu gesetzt, auf 0 gestellt.