(Google) Kalender zur Müllabfuhr Auswertung & Visualisierung

Begonnen von berndp, 27 März 2015, 19:59:07

Vorheriges Thema - Nächstes Thema

berndp

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
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.

2P4u

Hi,
coole Idee mit dem Kalender über Google.
Ich hab das jetzt mal nachgebaut. Habe meinen Abfallkalender von Google eingebunden.
Dort habe ich im "Titel" des Termines immer stehen was abgeholt wird, z.B.: BlaueTonne, GelberSack.

Ich habe dein Noti erstellt und den unteren Code in 99_myUtils.pm eingefügt.
Anschliessend habe ich erstmal Dummys für die Blaue Tonne erstellt: BlaueTonneDatum und BlaueTonneStatus.
Nun frage ich mich, ob den der Titel des Kalenders ausgelesen wird?
Ich sehe da immer nur diese IDs.

Vielleicht kannst du mir da weiterhelfen.

Lieben Dank
Gruss Daniel
1x Ubuntu Server
1x LaCrosse Gateway für PCA301 /1x HMLAN /1x HMLGW
2x HueBridge mit Devices/ 1x Logitech Harmony Ultimate

berndp

Hi!

Ja, der Titel des Ereignisses wird ausgewertet. Diese werden aus den vorhandenen Einträgen ausgelesen. Am Ende bleibt dann das Datum und der Status (Abholung in x-Stunden) übrig.
Dass nur IDs da stehen, kannst du ruhig ignorieren :)

Vg
bernd