Mrz 30, 2015

Mülltonnenkalender in FHEM einbinden

Vielleicht kennt der ein oder andere das Problem, dass man mal vergisst, die Mülltonne rauszustellen und dann werden alle Mülltonnen der Nachbarschaft bis auf die eigene abgeholt.

Um das zu verhindern, habe ich mir gedacht, dass ganze einfach in meine Hausatomation einzubauen. Wenn man erstmal die Daten im FHEM hat, kann man sich dann auf verschiedenste Weise erinnern lassen. Mein Plan sah dabei folgendes vor:

  • Ändern der Regalhintergrundbeleuchtung in der entsprechenden Mülltonnenfarbe
  • Anzeige im RSS Bild
  • Pushnachricht aufs Smartphone

Nun müssen natürlich die Abholtermine erstmal in FHEM eingelesen werden. Dazu habe ich mir einen Google-Kalender angelegt und die Abholtermine eingetragen (immer einen Tag vorher, damit ich auch rechtzeitig erinnert werde). In manchen Komunen wird auf der Internetpräsenz schon eine entsprechende Kalenderdatei zur Verfügung gestellt. Da ich in einer relativ kleinen Gemeinde wohne, musste ich es leider selbst machen. Dabei ist darauf zu achten, die Einträge immer gleich zu gestalten, da später diese Einträge abgefragt und nach dem Namen sortiert werden. Soweit, so gut.

Zum Glück gibt es für FHEM schon ein entsprechendes Modul zum einbinden von Kalendern.

define Muelltonnen_Kalender Calendar ical url https://www.google.com/calendar/ical/ti5ccgm9vi074aeb3b5tceq0i0%40group.calendar.google.com/private-117bb6a6f5f2957a05ffb7858e151709/basic.ics 14400

define Gelbe_Saecke_dummy dummy
attr Gelbe_Saecke_dummy room Kalender
attr Gelbe_Saecke_dummy setList ja nein
attr Gelbe_Saecke_dummy webCmd ja:nein

define Bio_Tonne_dummy dummy
attr Bio_Tonne_dummy room Kalender
attr Bio_Tonne_dummy setList ja nein
attr Bio_Tonne_dummy webCmd ja:nein

define Restmuell_Tonne_dummy dummy
attr Restmuell_Tonne_dummy room Kalender
attr Restmuell_Tonne_dummy setList ja nein
attr Restmuell_Tonne_dummy webCmd ja:nein

define Papier_Tonne_dummy dummy
attr Papier_Tonne_dummy room Kalender
attr Papier_Tonne_dummy setList ja nein
attr Papier_Tonne_dummy webCmd ja:nein

Erklärung:

Für jeder Mülltonne muss zunächst ein Dummy erzeugt werden, der den Status darstellt, ob die Mülltonne raus muss, oder nicht. Dieser Status wird dann durch ein Notify ausgelesen. Man kann die Abfrage natürlich direkt im Notfiy angeben, allerdings wird das schnell sehr unübersichtlich. Ich habe mir deshalb angewöhnt, komplexere Abläufe direkt in Perl zu prgrammieren. Dies kann man dann als Bibliothek in FHEM einbinden  (99_myutils.pm).

Im Notify wird dann nur die Routine in der Bibliothek aufgerufen. Die Routine zum Abfragen des Kalenders habe ich mir vom FHEM-Wiki geholt.

In der 99_myutils.pm steht nun folgendes:

sub Kalenderstart ($)
{
	my ($Ereignis) = @_;
	my @Ereignisarray = split(/.*:\s/,$Ereignis);
	my $Ereignisteil1 = $Ereignisarray[1];
	my @uids=split(/;/,$Ereignisteil1);
	foreach my $uid (@uids) {
		my $Kalendertext = fhem("get Muelltonnen_Kalender summary $uid");
		if ($Kalendertext =~ /gelb/) {
			fhem("set Gelbe_Saecke_dummy ja");
		};
		if ($Kalendertext =~ /bio/) {
			fhem("set Bio_Tonne_dummy ja");
		};
        if ($Kalendertext =~ /rest/) {
			fhem("set Restmuell_Tonne_dummy ja");
		};
        if ($Kalendertext =~ /papier/) {
			fhem("set Papier_Tonne_dummy ja");
		};
	};
}
sub Kalenderende ($) {
	my ($Ereignis) = @_;
	my @Ereignisarray = split(/.*:\s/,$Ereignis);
	my $Ereignisteil1 = $Ereignisarray[1];
	my @uids=split(/;/,$Ereignisteil1);
	foreach my $uid (@uids) {
		my $Kalendertext = fhem("get Muelltonnen_Kalender summary $uid");
		if ($Kalendertext =~ /gelb/) {
			fhem("set Gelbe_Saecke_dummy nein");
		};
		if ($Kalendertext =~ /bio/) {
			fhem("set Bio_Tonne_dummy nein");
		};
        if ($Kalendertext =~ /rest/) {
			fhem("set Restmuell_Tonne_dummy nein");
		};
        if ($Kalendertext =~ /papier/) {
			fhem("set Papier_Tonne_dummy nein");
		};
	};
}

Hier noch der Aufruf der Notifys:

define Muelltonnen_Kalender_Start notify Muelltonnen_Kalender:modeStarted.*googlecom.* {\
Kalenderstart("$EVENT");;\
}
define Muelltonnen_Kalender_Ende notify Muelltonnen_Kalender:modeEnded.*googlecom.* {\
Kalenderende("$EVENT");;\
}

Erläuterung:

Im Kalender wird beim starten des Ereignisses das Notify ausgelöst und das Event als Parameter übergeben. Das Event wird dann erstmal in seine Bestandteile gesplittet und in ein Array geleitet. Danach wird jedes Element des Arrays mittels „foreach“ durchlaufen und nach den entsprechenden Einträgen gefiltert. Dort wird dann die jeweilige Mülltonne auf „ja“ bzw. „nein“ gestellt.

Somit haben wir nun den Status der jeweiligen Mülltonne erfasst. Dies lässt sich natürlich auch mit anderen Einträgen realisieren (z.B. verschiedenes Verhalten am Wochende oder Urlaub).

Nun kann man diesen Status verwenden wie man möchte. Ich zum Beispiel lasse mir im RSS-Status Screen anzeigen, welche Mülltonne wann raus muss. Außerdem habe ich die meine Regalbeleuchtung damit gekoppelt. Dazu aber mehr in einem anderen Beitrag.

Leave a Reply