Abfallkalender auswerten

Begonnen von raspklaus, 17 Juni 2014, 17:45:34

Vorheriges Thema - Nächstes Thema

RoBra81

Hier nochmal mein Code, vielleicht findest du ja noch den entscheidenden Unterschied:

sub
Muelltermine ($)
{
  my ($Ereignis) = @_;
  my @Ereignisarray = split(/.*:\s/,$Ereignis);
  my $Ereignisteil1 = $Ereignisarray[1];
  my @uids=split(/;/,$Ereignisteil1);
  my (undef,undef,undef,$mday,$mon,$year) = localtime;
  my $t  = timelocal(0,0,0,$mday,$mon,$year);
  my $dtBio = 0;
  my $dtYellow = 0;
  my $dtRest = 0;
  foreach my $uid (@uids) {
    my $Kalendertext = fhem("get Muellkalender summary $uid");
    if ($Kalendertext =~ /Biomüll/) {
        my $dt = fhem("get Muellkalender 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 ($dtBio == 0 || ($eventDate < $dtBio && $eventDate >= $t))
        {
          $dtBio = $eventDate;
        }
    };
    if ($Kalendertext =~ /Gelbe Tonne/) {
        my $dt = fhem("get Muellkalender 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 ($dtYellow == 0 || ($eventDate < $dtYellow && $eventDate >= $t))
        {
          $dtYellow  = $eventDate;
        }
    };
    if ($Kalendertext =~ /Restmüll/) {
        my $dt = fhem("get Muellkalender 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 == 0 || ($eventDate < $dtRest && $eventDate >= $t))
        {
          $dtRest = $eventDate;
        }
    };
  };

  my $dayDiff = 0; 
 
  $dayDiff = floor(($dtBio - $t) / 60 / 60 / 24);
  if ($dayDiff >= 0) {
    fhem("set BiomuellIn $dayDiff");
  }
  $dayDiff = floor(($dtYellow - $t) / 60 / 60 / 24);
  if ($dayDiff >= 0) {
    fhem("set GelbeTonneIn $dayDiff");
  }
  $dayDiff = floor(($dtRest - $t) / 60 / 60 / 24);
  if ($dayDiff >= 0) {
    fhem("set RestmuellIn $dayDiff");
  }
}


Ansonsten sehe ich es mir morgen nochmal an...

Ronny

Tommy82

Ok, werd die mal vergleichen, vieleicht findest du ja auch noch was, bist ja echt fit in den Themen.

Danke für deine Hilfe
Fhem Cubitruck  Armbian Buster with Linux 5.3.9-sunxi
HM-CC_RT-DN, HM-Sec-RHS,HM-Sec-SD, HM-Sec-SCo,IT1500,1xIT GRR-3500 Fritz!Dect200,Powerline546E,Enigma2 Modul mit 3 Vu+,Wol Modul für WinServer2016 und WinServer 2019,FB6590
Allnetl Wandtablett mit FTUI

RoBra81

Der Unterschied ist vermutlich, dass ich mit 0 initialisiere

  my $dtBio = 0;
  my $dtYellow = 0;
  my $dtRest = 0;


und dann statt

$dtBio eq ''

das nehme:

$dtBio == 0

Dann musst du auch am Ende bei den einzelnen dayDiff das

+1

wegnehmen. (Kann es sein, dass dein Müll gestern schon abgeholt wurde - das +1 sieht komisch aus)

Spartacus

Hallo,
m.E. hat das etwas mit modeStarted und modeUpcomming zu tun. Der Wert "0" wird nie erreicht. Das Problem hatte ich weiter oben im Thread schon beschrieben! (ab hier...http://forum.fhem.de/index.php/topic,24646.msg237362.html#msg237362)
Wenn der Tag des Termins kommt, dann verschwindet der Eintrag aus modeUpcomming und wandert zu modeStart bzw. modeStared. Und dafür bräuchte man m.E. zwei Aufrufe um das Problem zu lösen. Vielleicht hat ja jemand eine Idee. Ich habe noch keine vernünftige Lösung  gefunden...
Spartacus.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

RoBra81

Also mein obiges sub funktioniert zuverlässig mit folgendem notify:

define Muellkalender.not.Update notify Muellkalender:mode.*abfallamtbautzende.* {Muelltermine("$EVENT")}

-> Damit wird die Funktion auch für modeStart und modeStarted aufgerufen...

Ronny

Spartacus

Zitat von: RoBra81 am 08 Januar 2015, 14:06:09
Also mein obiges sub funktioniert zuverlässig mit folgendem notify:

define Muellkalender.not.Update notify Muellkalender:mode.*abfallamtbautzende.* {Muelltermine("$EVENT")}

-> Damit wird die Funktion auch für modeStart und modeStarted aufgerufen...

Ronny
Hi Ronny,
der Aufruf funktioniert bei mir auch! Aber die künftigen Termine (>1 Tag) stehen doch in modeUpcomming, oder? Nur der jeweils aktuelle Termin steht in modeStart/Started. Und wenn der aktelle Termin von modeUpcomming auf modeStarted rutscht, dann bleibt der Counter für den aktuellen Tag auf "1" stehen !

Zumindest bei meinem Kalender (siehe Posts weiter oben).
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

RoBra81

Aber es wird doch mit modeStart nochmal aufgerufen und da steht ja der Termin für heute drin. Entweder hat es was mit der +1 am Ende zu tun oder ich habe das Glück, dass bei mir die Reihenfolge der events (erst modeUpcoming und dann der Wert durch erneuten Aufruf mit modeStart überschrieben) immer passt...

Spartacus

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.

Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

RoBra81

Ja, das hatte ich auch um Weihnachten bevor ich die neuen Termine eingepflegt hatte...

Spartacus

Hallo,
hat irgendjemand eine Idee, wie man das abfangen könnte? Anstelle der "0" sollte hier "kein Termin" angezeigt werden.

Gruß,
Christian.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

RoBra81

Das Problem wird hier sein, dass er ja mehrere Listen (modeUpcoming, modeStarted, ...) durchsucht und erst wenn in der letzten nix steht die Entscheidung treffen kann...
Da es beim Abfallkalender nur einmal im Jahr passiert, könnte ich damit leben.

Spartacus

Zitat von: RoBra81 am 08 Januar 2015, 17:25:48
Das Problem wird hier sein, dass er ja mehrere Listen (modeUpcoming, modeStarted, ...) durchsucht und erst wenn in der letzten nix steht die Entscheidung treffen kann...
Da es beim Abfallkalender nur einmal im Jahr passiert, könnte ich damit leben.
...nicht wirklich! Ich habe beispielsweise auch Altkleidersammlung mit drin und das trifft nur 3 x im Jahr zu. Da ist der Zeitraum schon größer! (ca. 100 Tage)

Ich habe keine gute Idee, wo man da anpacken könnte... Der Abfallkalender meiner Stadt ist immer ab Mitte Dezember verfügbar! Wäre halt schön, wenn man da einen Workaround schaffen könnte...
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

RoBra81

Vielleicht sehe ich es mir die Tage mal an - das muss ich ausprobieren, aus der Kalten kann ich noch nix sagen...

Spartacus

...wäre echt ne tolle Sache Ronny,
ich denke da schon länger drüber nach und finde keinen wirklichen Ansatz..Melde Dich mal, wenn Du ne Idee hast!
Gruß,
Christian
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

vestaxb

Mal eine kurze Frage;
Könnte es sein, dass die Abfragen mit Serienterminen nicht funktionieren? Ich habe nämlich für die Abholtermine Serientermine in Outlook erstellt und den Kalender dann exportiert.

Wenn ich in FHEM dann alle Einträge mittels

get Abfall full all

anzeigen möchte, sehe ich nur Einzel- aber keine Serientermine... ???