Hallo zusammen,
möchte an dieser Stelle kurz meine (zusammengeklaute ::)) Darstellung für die Müllabfuhr zeigen.
Ziel: Da bei uns immer am gleichen Wochentag der Müll abgeholt wird und nur die Fraktion wechselt (graue Tonne, blaue Tonne, grüne Tonne und gelbe Säcke), reicht mir eine einfache Darstellung mit farbigen Icons für die nächste(n) Tonne(n), die abgeholt werden. Tonnen, die nicht beim nächsten Termin dran sind, sollen nicht angezeigt werden.
Hab es dann folgendermaßen umgesetzt:
1.
Kalenderdatei (ics) mit Calendar eingefügt.
define muellkalender Calendar ical file ./www/muellkalender.ics 86400
2a.
Um die kommenden Termine des Kalenders auszuwerten, erstmal ein notify angelegt:
define no_muelltermine notify muellkalender:modeUpcoming.* { muelltermine("$EVENT") }
2b.
Dummy anlegen, um die Werte vom nachfolgenden Schritt 2c aufzunehmen:
define du_muelltermine dummy
2c.
Folgendes in die 99_myUtils.pm packen:
sub
muelltermine ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my $t = time;
my $dtPapier = '';
my $dtGelberSack = '';
my $dtRestmuell = '';
my $dtBiomuell = '';
foreach my $uid (@uids) {
my $Kalendertext = fhem("get muellkalender summary $uid");
if ($Kalendertext =~ /Papiertonne/)
{
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 ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
{
$dtPapier = $eventDate;
my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
if ($dayDiff >= 0) { fhem("setreading du_muelltermine Papiertonne $dayDiff"); }
}
};
if ($Kalendertext =~ /Gelber Sack/) {
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 ($dtGelberSack eq '' || ($eventDate < $dtGelberSack && $eventDate > $t))
{
$dtGelberSack = $eventDate;
my $dayDiff = floor(($dtGelberSack - $t) / 60 / 60 / 24 + 1);
if ($dayDiff >= 0) { fhem("setreading du_muelltermine GelberSack $dayDiff"); }
}
};
if ($Kalendertext =~ /Restabfall/) {
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 ($dtRestmuell eq '' || ($eventDate < $dtRestmuell && $eventDate > $t))
{
$dtRestmuell = $eventDate;
my $dayDiff = floor(($dtRestmuell - $t) / 60 / 60 / 24 + 1);
if ($dayDiff >= 0) { fhem("setreading du_muelltermine Restmuell $dayDiff"); }
}
};
if ($Kalendertext =~ /Biotonne/) {
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 ($dtBiomuell eq '' || ($eventDate < $dtBiomuell && $eventDate > $t))
{
$dtBiomuell = $eventDate;
my $dayDiff = floor(($dtBiomuell - $t) / 60 / 60 / 24 + 1);
if ($dayDiff >= 0) { fhem("setreading du_muelltermine Biotonne $dayDiff"); }
};
};
}
}
Damit werden die Fraktionen und die verbleibenden Tage ermittelt und als reading in den dummy du_muelltermine geschrieben.
Wichtig hierbei, dass die 99_myUtils.pm use Time::Local; im "header" enthält...wenn nicht, einfügen...
3a.
ReadingsGroup anlegen, in der die Tonnensymbole angezeigt werden:
define muellabfuhr readingsGroup du_muelltermine:Restmuell,Biotonne,Papiertonne,GelberSack
Hiermit werden die Symbole nebeneinander in einer Zeile dargestellt.
3b.
Damit nur die Tonnen des nächsten Termins mit passenden Farben angezeigt werden, folgende Attribute setzen:
nonames: 1
valueFormat: { return $VALUE if ($VALUE < 7); return undef; }
valueIcon: { Biotonne => 'dustbin@green', GelberSack => 'bag@yellow', Papiertonne => 'dustbin@blue', Restmuell => 'dustbin@grey' }
Vielleicht kann es ja jemand gebrauchen...
Falls jemand Verbesserungs- und/oder Vereinfachungsvorschläge hat, immer her damit!
Anbei nach zwei screenshots von der anstehenden Leerung der nächsten Woche und der nächsten vier Wochen...bei mouseover über die Symbole in der readingsGroup werden auch noch die verbleibenden Tage bis zur Abfuhr angezeigt.
Gruß
Andreas
**Edith sagt: Da hat sich ein Fehler beim notify eingeschlichen...und schon korrigiert...
ZitatDa bei uns immer am gleichen Wochentag der Müll abgeholt wird ...
Hallo Vize,
ja, das ist bei mir auch so, nur manchmal verschiebt sich dann doch der Wochentag wegen Feiertagen und so.
Also wenn du jetzt noch den Wochentag vor die Müllsymbole basteln würdest, wäre es perfekt für mich :)
LG
Thomas
Hallo Thomas,
sorry, aber da bin ich raus. Ist mir für meinen Anwendungsfall zu aufwändig...da im Kalender keine Wochentage stehen, müsste ich die dann erst aus dem Datum umwandeln und in den dummy und die readingsGroup bringen...
Vielleicht kannst du das ja mal selber probieren!? Oder vielleicht kann ja jemand anderes weiterhelfen...
Gruß
Andreas
Hallo zusammen,
ich möchte hier doch nochmal bezüglich der Wochentage einhaken.
Könnte mir jemand dabei helfen, wie ich aus dem Datum der jeweiligen Müllabfuhrtermine den entsprechenden Wochentag rauskriege?
Diesen würde ich dann gerne analog zu oben als reading in das dummy-Device du_muelltermine schreiben.
Hier mal ein Auszug aus meiner 99_myUtils für die Papiertonne:
package main;
use strict;
use warnings;
use POSIX;
use Time::Local;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
#
# Abfall Kalender auswerten: "muellkalender"
#
sub
muelltermine ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my $t = time;
my $dtPapier = '';
foreach my $uid (@uids) {
my $Kalendertext = fhem("get muellkalender summary $uid");
if ($Kalendertext =~ /Papiertonne/)
{
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 ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
{
$dtPapier = $eventDate;
my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
if ($dayDiff >= 0) { fhem("setreading du_muelltermine Papiertonne $dayDiff"); }
}
};
Nur wie bekomme ich jetzt aus dem Abfuhrdatum zusätzlich den entsprechendenWochentag ermittelt, und wie kann ich den als "Klartext" als reading schreiben, also in etwa so, wenn
if ($dayDiff >= 0) { fhem("setreading du_muelltermine Papiertonne_Tag $WoTag"); }
dann soll das reading Papiertonne_Tag z.B. "Mittwoch" lauten...
Bin für jede Hilfe dankbar!
Gruß
Andreas
Hallo,
Die Frage finde ich spannend. Habe dazu das gefunden:
{Day_of_Week_to_Text(Day_of_Week($year,$month,$mday))}
evtl. vorher
use Date::Calc qw(Today Decode_Language Language
Day_of_Week Day_of_Week_to_Text
Add_Delta_YMD);
Language(Decode_Language("Deutsch"));
fhem scheint das, ausser Decode_Language("Deutsch"), aber schon zu können.
Gruß
Hans
Edith:
War bei mir nur in meiner Testversion schon vorhanden. use Date::Calc muss wohl in der sub angegeben werden.
Hallo Hans,
danke für die Infos.
Hab aber nochmal weiter recherchiert und eine Lösung gefunden:
in der sub muelltermine folgendes ergänzen:
my $Wochentag = '';
my @Wochentage = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);
Dann noch für jede Abfallfraktion (hier Beispiel Papier) dieses ergänzen:
my $wd = (localtime $dtPapier)[6];
$Wochentag = $wd;
my $WoTag = sprintf("%s", $Wochentage[$Wochentag]);
if ($dayDiff >= 0) { fhem("setreading du_muelltermine Papiertonne_Tag $WoTag"); }
Und schon habe ich zusätzliche readings im dummy du_muelltermine mit den Wochentagen...
Gruß
Andreas
Hi Vize
danke , das muss ich mir die nächsten tage mal ansehen, sowas wollte ich auch noch machen !
kvo1
Hallo zusammen,
ich bräuchte nochmal Hilfe...
Wie beschrieben, lasse ich mir nun auch die Wochentage zur Müllabfuhr in das entsprechende dummy (du_muelltermine) schreiben.
Siehe screenshot "Abfuhr1".
Wenn ich nun die readingsGroup so erweitere (DEF):
du_muelltermine:Restmuell,Biotonne,Papiertonne,GelberSack
du_muelltermine:Restmuell_Tag,Biotonne_Tag,Papiertonne_Tag,GelberSack_Tag
werden mir wie gehabt, nur Tonnensymbole für die Abfuhr der kommenden Woche angezeigt, jedoch darunter die Wochentage für alle Fraktionen.
Siehe screenshot "Abfuhr2".
Im Attribut valueFormat steht:
{ return $VALUE if ($VALUE <= 7); return undef; }
Kann ich das irgendwie anpassen, damit die Wochentage auch nur dann angezeigt werden, wenn ein Tonnensymbol angezeigt wird bzw. der nächste Termin in weniger als 7 Tagen ist?
Wenn ja, wie?
Bin für jede Hilfe dankbar!
Gruß
Andreas
Mahlzeit,
im logfile steht nun auch noch:
[Tue Aug 11 20:56:03 2015] fhem.pl: Argument "Mittwoch" isn't numeric in numeric le (<=) at (eval 28564) line 1.
Die Fehlermeldung taucht nun alle 4-5 min wieder auf...
Ich denke mal das bezieht sich hierauf, oder?
{ return $VALUE if ($VALUE <= 7); return undef; }
Gruß
Andreas
Moin,
so habe eine Lösung für mein letztes Problem mit den zu viel angezeigten Wochentagen und der Fehlermeldung im logfile gefunden. Wahrscheinlich nicht sehr elegant, aber funktioniert.
Wenn es interessiert, kann ich heute Abend mal den entsprechenden code posten...
Vielleicht trudeln ja bis dahin noch weitere Lösungsvorschläge von euch ein?!? ;)
Gruß
Andreas
ZitatWenn es interessiert, kann ich heute Abend mal den entsprechenden code posten...
ja bitte ;)
Wird aber frühestens Sonntag Abend was...Wochenende ist schon komplett ausgebucht... ;) 8)
Gruß
Andreas
Da kann ich auch nur sagen, ja bitte.
und könnte man das Datum evtl., über den Tonnen anzeigen lassen, sozusagen zentriert über allen Symbolen?
bin Grade erst dabei mich in fhem reinzufuchsen, und bin immer wieder begeistert, was man so anstellen kann, (hab mir z.b. einen Fenster Öffner mit funksteckdose gekoppelt, tut in der Garage dienst.^^!
ist das :
{ return $VALUE if ($VALUE <= 7); return undef; }
nicht ein vergleich Srting mit integer ? das könnte den fehler im log erklären.
müsste glaube ich so gehen.:
{ return $VALUE if (int $VALUE <= 7); return undef; }
edit: hab das mit dem Datum hinbekommen.
habe wie aus den Code von Vize aus Post 1 genommen,
die readingsGroup nach Post 7 erweitert. dann hatte ich das gleiche wie dort im screen.
dann habe ich die Code Zeile
if ($dayDiff >= 0) { fhem("setreading du_muelltermine Restmuell $dayDiff"); }
nach fhem("setreading du_muelltermine Restmuell $dayDiff"); geändert, dann sind zwar alle Tonnen da, jedoch mit dem entsprechendem Datum aus der ICE Datei, d.h. das passt auch wenn es nicht zu sehen ist.
darunter noch eine Zeile mit
fhem("setreading du_muelltermine Papiertonne_Tag $SplitDt[0]");
und das Datum ist drin.
Tante edtit sagt:/
Ich habe mal weiter grfriemelt.
nun schaut es so aus bei mir.
fhem.cfg
define muellkalender Calendar ical file ./www/muellkalender.ics 86400
define no_muelltermine notify muellkalender:modeUpcoming.* { muelltermine("$EVENT") }
define du_muelltermine dummy
define muellabfuhr readingsGroup du_muelltermine:Restmuell,Biotonne,Papiertonne,GelberSack\
du_muelltermine:Restmuell_Tag,Biotonne_Tag,Papiertonne_Tag,GelberSack_Tag\
du_muelltermine:Restmuell_dTag,Biotonne_dTag,Papiertonne_dTag,GelberSack_dTag
attr muellabfuhr nonames 1
attr muellabfuhr valueIcon { Biotonne => 'dustbin@green', GelberSack => 'dustbin@yellow', Papiertonne => 'dustbin@blue', Restmuell => 'dustbin@grey', Nix => 'dustbin@white' }
der eintrag Nix naja, soll als dummy herhalten, um inhalte auszublenden, aber das will noch nicht so. ist also wirkungslos im code.
und in der 99_myUtils.pm
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
use Time::Local;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
sub
muelltermine ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my $t = time;
my $dtPapier = '';
my $dtGelberSack = '';
my $dtRestmuell = '';
my $dtBiomuell = '';
my @days = qw/So Mo Di Mi Do Fr Sa/;
foreach my $uid (@uids) {
my $Kalendertext = fhem("get muellkalender summary $uid");
if ($Kalendertext =~ /Blaue 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 ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
{
$dtPapier = $eventDate;
my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
fhem("setreading du_muelltermine Papiertonne $dayDiff");
fhem("setreading du_muelltermine Papiertonne_Tag $wday");
fhem("setreading du_muelltermine Papiertonne_dTag $SplitDt[0]");
}
};
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 ($dtGelberSack eq '' || ($eventDate < $dtGelberSack && $eventDate > $t))
{
$dtGelberSack = $eventDate;
my $dayDiff = floor(($dtGelberSack - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
fhem("setreading du_muelltermine GelberSack $dayDiff");
fhem("setreading du_muelltermine GelberSack_Tag $wday");
fhem("setreading du_muelltermine GelberSack_dTag $SplitDt[0]");
}
};
if ($Kalendertext =~ /Reststoff/) {
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 ($dtRestmuell eq '' || ($eventDate < $dtRestmuell && $eventDate > $t))
{
$dtRestmuell = $eventDate;
my $dayDiff = floor(($dtRestmuell - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
fhem("setreading du_muelltermine Restmuell $dayDiff");
fhem("setreading du_muelltermine Restmuell_Tag $wday");
fhem("setreading du_muelltermine Restmuell_dTag $SplitDt[0]");
}
};
if ($Kalendertext =~ /Biotonne/) {
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 ($dtBiomuell eq '' || ($eventDate < $dtBiomuell && $eventDate > $t))
{
$dtBiomuell = $eventDate;
my $dayDiff = floor(($dtBiomuell - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
fhem("setreading du_muelltermine Biotonne $dayDiff");
fhem("setreading du_muelltermine Biotonne_Tag $wday");
fhem("setreading du_muelltermine Biotonne_dTag $SplitDt[0]");
};
};
}
}
1;
habe da eine ander variante der Wochentags berechnung drin. screen ist auch im anhang.
Hallo zusammen,
hier noch mal auf die Schnelle meine Variante...
Als erstes lasse ich mir auch nur die Wochentage der Abholung in das dummy du_muelltermine schreiben, die maximal 7 Tage in der Zukunft liegen:
99_myUtils, Beispiel Papier
my $wd = (localtime $dtPapier)[6];
$Wochentag = $wd;
my $WoTag = sprintf("%s", $Wochentage[$Wochentag]);
if ($dayDiff >= 0 && $dayDiff <= 7) { fhem("setreading du_muelltermine Papiertonne_Tag $WoTag"); }
else { fhem("deletereading du_muelltermine Papiertonne_Tag"); }
Um die besagte Fehlermeldung im log zu den Wochentagen zu vermeiden habe ich
1. in der 99_myUtils noch das hier ergänzt:
sub
muellvalueFormat ($$)
{
my ($READING,$VALUE) = @_;
if ($READING =~ /Tag/) {
return "%s"; }
elsif ($VALUE <= 7) {
return "%.0f"; }
else {
return undef; }
}
und
2. das Attribut valueFormat in der readingsGroup folgendermaßen angepasst:
{ muellvalueFormat ($READING,$VALUE);; }
Damit habe ich dann die Abfuhren der nächsten 7 Tage mit Wochentag (s. a. screenshots)...
@BlackStone: Deine Variante sieht auch interessant aus...werde ich mir wohl auch mal nachbauen... ;)
So, ich hoffe, ich hab nix vergessen...
Gruß
Andreas
*****
EDIT: im ersten code aus der 99_myUtils eine else-Bedingung zum Löschen des "Tagesreadings" hinzugefügt...sonst bleiben die Wochentage nach Ablauf der Termine stehen...
Hallo Vize,
Könnest Du mal Deine gesamte 99_myUtils posten ?
Danke !
kvo1
Zitat von: Vize am 16 August 2015, 13:15:39
Hallo zusammen,
hier noch mal auf die Schnelle meine Variante...
Als erstes lasse ich mir auch nur die Wochentage der Abholung in das dummy du_muelltermine schreiben, die maximal 7 Tage in der Zukunft liegen:
99_myUtils, Beispiel Papier
[......]
if ($dayDiff >= 0 && $dayDiff <= 7) { fhem("setreading du_muelltermine Papiertonne_Tag $WoTag"); }
[...]
[....]
Gruß
Andreas
So ähnlich habe ich auch schon rum probiert, Lustigerweise wusste ich nicht das perl das && versteht. hab da nur mal hier und da in perl rumstubbert, und meist klappt das, bin eher auf php und c und vb unterwegs. ^^
edit:/
Jetzt habe ich es so wie es mir gefällt. ^^
in der fhem.cfg
define muellkalender Calendar ical file ./www/muellkalender.ics 86400
define no_muelltermine notify muellkalender:modeUpcoming.* { muelltermine("$EVENT") }
define du_muelltermine dummy
define muellabfuhr readingsGroup du_muelltermine:Restmuell,Biotonne,Papiertonne,GelberSack\
du_muelltermine:Restmuell_dTag,Biotonne_dTag,Papiertonne_dTag,GelberSack_dTag
attr muellabfuhr nonames 1
attr muellabfuhr style style='text-align:center'
attr muellabfuhr valueFormat { return $VALUE if ( $VALUE ne '88');; return undef;; }
attr muellabfuhr valueIcon { Biotonne => 'dustbin@green', GelberSack => 'dustbin@yellow', Papiertonne => 'dustbin@blue', Restmuell => 'dustbin@black'}
in der 99_myUtils.pm
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
use Time::Local;
sub
myUtils_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
sub
muelltermine ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my $t = time;
my $dtPapier = '';
my $dtGelberSack = '';
my $dtRestmuell = '';
my $dtBiomuell = '';
my @days = qw/So Mo Di Mi Do Fr Sa/;
foreach my $uid (@uids) {
my $Kalendertext = fhem("get muellkalender summary $uid");
if ($Kalendertext =~ /Blaue 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 ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
{
$dtPapier = $eventDate;
my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
my @date1 = split /\./,$SplitDt[0];
my $wday1 = "$wday" . " : " . "$date1[0]"."."."$date1[1]";
if ($dayDiff >= 0 && $dayDiff <= 7) {
fhem("setreading du_muelltermine Papiertonne $dayDiff");
fhem("setreading du_muelltermine Papiertonne_dTag $wday1");
}else{
fhem("setreading du_muelltermine Papiertonne 88");
fhem("setreading du_muelltermine Papiertonne_dTag 88");
}
}
};
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 ($dtGelberSack eq '' || ($eventDate < $dtGelberSack && $eventDate > $t))
{
$dtGelberSack = $eventDate;
my $dayDiff = floor(($dtGelberSack - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
my @date1 = split /\./,$SplitDt[0];
my $wday1 = "$wday" . " : " . "$date1[0]"."."."$date1[1]";
if ($dayDiff >= 0 && $dayDiff <= 7) {
fhem("setreading du_muelltermine GelberSack $dayDiff");
fhem("setreading du_muelltermine GelberSack_dTag $wday1");
}else{
fhem("setreading du_muelltermine GelberSack 88");
fhem("setreading du_muelltermine GelberSack_dTag 88");
}
}
};
if ($Kalendertext =~ /Reststoff/) {
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 ($dtRestmuell eq '' || ($eventDate < $dtRestmuell && $eventDate > $t))
{
$dtRestmuell = $eventDate;
my $dayDiff = floor(($dtRestmuell - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
my @date1 = split /\./,$SplitDt[0];
my $wday1 = "$wday" . " : " . "$date1[0]"."."."$date1[1]";
if ($dayDiff >= 0 && $dayDiff <= 7) {
fhem("setreading du_muelltermine Restmuell $dayDiff");
fhem("setreading du_muelltermine Restmuell_dTag $wday1");
}else{
fhem("setreading du_muelltermine Restmuell 88");
fhem("setreading du_muelltermine Restmuell_dTag 88");
}
}
};
if ($Kalendertext =~ /Biotonne/) {
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 ($dtBiomuell eq '' || ($eventDate < $dtBiomuell && $eventDate > $t))
{
$dtBiomuell = $eventDate;
my $dayDiff = floor(($dtBiomuell - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
my @date1 = split /\./,$SplitDt[0];
my $wday1 = "$wday" . " : " . "$date1[0]"."."."$date1[1]";
if ($dayDiff >= 0 && $dayDiff <= 7) {
fhem("setreading du_muelltermine Biotonne $dayDiff");
fhem("setreading du_muelltermine Biotonne_dTag $wday1");
}else{
fhem("setreading du_muelltermine Biotonne 88");
fhem("setreading du_muelltermine Biotonne_dTag 88");
}
};
};
}
}
1;
die 88 da drin ist nur ein helferlein. und es werden die nächsten 7 tage angezeigt.
Zitat von: kvo1 am 16 August 2015, 19:23:24
Könnest Du mal Deine gesamte 99_myUtils posten ?
Moin und bitteschön...
Gruß
Andreas
N'Abend,
möchte hier noch kurz meine angepasste Version zeigen, damit das Ganze nach meiner Vorstellung ausschaut...Danke nochmal an alle, die geholfen haben!!!
Folgender code nun in der 99_myUtils, um den Müllkalender auszuwerten und die kommenden Termine in das dummy du_muellabfuhr zu schreiben:
sub
KalenderDatum($$)
{
my ($KalenderName, $KalenderUid) = @_;
my $dt = fhem("get $KalenderName start $KalenderUid");
my @SplitDt = split(/ /,$dt);
my @SplitDate = split(/\./,$SplitDt[0]);
my $ret = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
return $ret;
}
sub
muellabfuhr ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my $t = time;
my $dtPapier = '';
my $dtGelberSack = '';
my $dtRestmuell = '';
my $dtBiomuell = '';
my $Wochentag = '';
my @Wochentage = qw(Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag);
foreach my $uid (@uids)
{
my $Kalendertext = fhem("get muellkalender summary $uid");
if ($Kalendertext =~ /Papiertonne/)
{
my $eventDate = KalenderDatum('muellkalender', $uid);
if ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
{
$dtPapier = $eventDate;
my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
my $wd = (localtime $dtPapier)[6];
$Wochentag = $wd;
my $WoTag = sprintf("%s", $Wochentage[$Wochentag]);
if ($dayDiff >= 0) { fhem("setreading du_muellabfuhr Papiertonne $dayDiff $WoTag"); }
}
};
if ($Kalendertext =~ /Gelber Sack/)
{
my $eventDate = KalenderDatum('muellkalender', $uid);
if ($dtGelberSack eq '' || ($eventDate < $dtGelberSack && $eventDate > $t))
{
$dtGelberSack = $eventDate;
my $dayDiff = floor(($dtGelberSack - $t) / 60 / 60 / 24 + 1);
my $wd = (localtime $dtGelberSack)[6];
$Wochentag = $wd;
my $WoTag = sprintf("%s", $Wochentage[$Wochentag]);
if ($dayDiff >= 0) { fhem("setreading du_muellabfuhr GelberSack $dayDiff $WoTag"); }
}
};
if ($Kalendertext =~ /Restabfall/)
{
my $eventDate = KalenderDatum('muellkalender', $uid);
if ($dtRestmuell eq '' || ($eventDate < $dtRestmuell && $eventDate > $t))
{
$dtRestmuell = $eventDate;
my $dayDiff = floor(($dtRestmuell - $t) / 60 / 60 / 24 + 1);
my $wd = (localtime $dtRestmuell)[6];
$Wochentag = $wd;
my $WoTag = sprintf("%s", $Wochentage[$Wochentag]);
if ($dayDiff >= 0) { fhem("setreading du_muellabfuhr Restmuell $dayDiff $WoTag"); }
}
};
if ($Kalendertext =~ /Biotonne/)
{
my $eventDate = KalenderDatum('muellkalender', $uid);
if ($dtBiomuell eq '' || ($eventDate < $dtBiomuell && $eventDate > $t))
{
$dtBiomuell = $eventDate;
my $dayDiff = floor(($dtBiomuell - $t) / 60 / 60 / 24 + 1);
my $wd = (localtime $dtBiomuell)[6];
$Wochentag = $wd;
my $WoTag = sprintf("%s", $Wochentage[$Wochentag]);
if ($dayDiff >= 0) { fhem("setreading du_muellabfuhr Biotonne $dayDiff $WoTag"); }
}
};
}
}
DEF des notifies no_muellabfuhr:
muellkalender:modeUpcoming.* { muellabfuhr("$EVENT") }
Das dummy-Device heißt du_muellabfuhr.
Und die readingsGroup rg_muellabfuhr mit folgenden Einstellungen:
DEF
du_muellabfuhr:.*
Attribute:
valueFormat
-> damit werden nur readings angezeigt, die einstellige Ziffern <= 7 besitzen, ergo nur die Termine der nächsten Woche
{ return $VALUE if ($VALUE =~ /\b[0-7]\b/); return undef; }
valueIcon
-> damit die entsprechenden Tonnensymbole gezeigt werden
{ Biotonne => 'dustbin@green', GelberSack => 'bag@yellow', Papiertonne => 'dustbin@blue', Restmuell => 'dustbin@grey' }
valuePrefix
-> damit (nur) der Wochentag vor dem Tonnensymbol steht
{ " ".(split / /, ReadingsVal ($DEVICE,$READING,0))[1]." " }
Dann sieht das alles wie im Anhang aus...
Vielleicht kan's ja jemand gebrauchen oder als Inspirationshilfe benutzen ;)
Gruß
Andreas
Edit sagt: Zwei Sachen noch vergessen...
In der readingsGroup noch nonames und notime auf 1 setzen...
Moin BlackStone/Vize,
Danke für Eure Hilfe!
ich glaube mein Problem ist der Aufbau meiner ics-Datei und somit die richtige Selektion der Daten
innerhalb der SUB ...
Hier mal ein Auszug.....aus der Datei
BEGIN:VEVENT
UID:20150714T000011CEST-0793B2l4hR@www.bsr.de
DTSTAMP:20150713T220010Z
CATEGORIES:BSR Abholung
DESCRIPTION:Abholung Hausmüll
DTSTART;VALUE=DATE:20150819
LOCATION:Hauptst. 110\,
SUMMARY:Abholung Hausmüll
END:VEVENT
Das ist (derzeit) noch recht einfach , gibt nur eine "Müllart" .
Habt Ihr ne Idee oder kann mir jemand (zum Nachsehen) seine ics Datei senden
... ich bin wild entschlossen.... muss doch irgendwie gehen.
danke
kvo1
Moin BlackStone/Vize,
:-[ Kaum macht man es richtig , schon geht es ;)
habe das Beispiel von BlackStone genommen und meine "Müllbeschreibung" hinterlegt
if ($Kalendertext =~ /Abholung Hausmüll/)
und schon gibt es eine Tonne und das Datum "Mi : 19.08"
Bin schwer begeistert, jetzt mal Feintunning !
kvo1
so ist es mir auch am anfang gegangen, es wollte nix anzeigen. bis ich in der ics mit notepad++ herum gestöbert habe.
nur die richtigen stellen raussuchen und schon fluppt es, und scheinbar hat jeder landkreis da seine eigene suppe gekocht.
bei uns steht tatsächlich für fürs altpapier der begriff "Blaue Tonne drin". auf der arbeit, bei uns, ca 30 km von hier steht Papier drin. so geht es immer weiter. Restmüll statt Schwarze Tonne. das lustigste war statt Grüne Tonne bei uns , etwas Gartenmüll oder Biogut.da kann man schon mal kirre werden.
also man muss da schon zwangsweise immer anpassen, wie die dinger in der ics drin stehen.
edit:/
jedoch hat vize auch die namens abfrage drin. ;)
if ($Kalendertext =~ /Gelber Sack/)
steht bei mir seit anfang jan. als Gelbe Tonne ;D
Hallo BlackStone/Vize,
leider habe ich mich wohl zu früh gefreut, habe noch folgendes Problem.
Ich habe das nach dem Beispiel von BlackStone eingerichtet und hatte Anfangs nur in der 99_myUtils.pm
if ($Kalendertext =~ /Blaue Tonne/)
gegen
if ($Kalendertext =~ /Abholung Hausmüll/)
Dann dachte ich, das die Änderung besser bei
if ($Kalendertext =~ /Abholung Hausmüll/)
paßt
also gegen
if ($Kalendertext =~ /Abholung Hausmüll/)
ersetzt und habe das oben wieder zurück gedreht
Jetzt bekommen ich aber beiden Mülltonnen angezeigt für den gleichen Tag, die blaue Tonne und
die Restmülltone (bei mir rot) :'(
Es gibt auch 2 Readings (vielleicht lösche ich das erste per Hand einfach mal) ?
Hat jemand eine Idee ?
danke
kvo1
Edit:
mir ist noch aufgefallen, daß das dummy du_muelltermine bei "STATE" keine sinnvollen Werte enthält , nur ???
Hallo
deletereading du_muelltermine Papiertonne_dTag
deletereading du_muelltermine Papiertonne
und schon sind die beiden readings weg ;)
Hallo kvo1,
ja, die (nicht mehr gebrauchten) readings muss man einmalig im dummy löschen...die werden ja auch durch die sub in der 99_myUtils quasi "per Hand" geschrieben.
Falls du irgendwas im STATE im dummy brauchst, kannst du das über stateFormat anpassen, ansonsten stehen da halt die drei ???. Das dummy hat ja in diesem Falle auch nicht wirklich einen STATE.
Frage meinerseits:
Klappt alles bei dir, ohne dass du ein DTEND für deine Termine in der ics-Datei hast (sehe in deinem Auszug nur das DTSTART)?
Gruß
Andreas
ZitatFrage meinerseits:
Klappt alles bei dir, ohne dass du ein DTEND für deine Termine in der ics-Datei hast (sehe in deinem Auszug nur das DTSTART)?
Gruß
Andreas
Hallo Vize,
ja bisher habe ich keine Probleme mit dem fehlenden DTEND !
habe mal per Hand in meine ics-Datei noch einen Termin für den "GelberSack" reingebastelt (22.8) , wird
auch angezeigt. ;)
Jetzt würde ich das mal so laufen lassen (morgen ist Termin für Restmüll) und schauen wie es dann aussieht!
gruss
kvo1
Genau, schau dann mal bitte, ob die abgelaufenen Termine dann aus der redingsGroup verschwinden...
Dein "Hausmülltermin" müsste ja dann ab dem 20.08. nicht mehr angezeigt werden.
Gruß
Andreas
bei mir war es die grüne tonne, die ist, nu ordnungsgemäß weg, und nur noch die gelbe in der list. läuft bei mir also wie geplant. ;D
@BlackStone
Kannst du mal bitte einen kompletten Termin aus deiner ics-Datei posten, also alles, was zwischen BEGIN:VEVENT und END:VEVENT steht?
Gruß
Andreas
ich hänge dir mal nen url zur quelle dran. ;)
da ich die ics nicht, verändert habe, nur geladen und auf die beere geschubst.
http://www.landkreis-aurich.de/abfuhrplan20150.html (http://www.landkreis-aurich.de/abfuhrplan20150.html)
dort auf Brookmerland und dann Kirchweg
(von Am Sandkasten bis Kienholzstraße)
BEGIN:VEVENT
UID:20150818T122259CEST-926702RDrl@landkreis-aurich.de
DTSTAMP:20150818T102259Z
CATEGORIES:Abfuhrtermine
DESCRIPTION:Bitte stellen Sie Ihre Abfälle bis 6.30 Uhr an die Straße.\n
\nAchten Sie darauf\, dass Ihre Bio-\, Rest- und Altpapiertonne auf der fÊ ݲ die Leerung festgelegten Straßenseite stehen\, und zwar mit der Deckel
öffnung zur Straße\, maximal zwei Meter vom Fahrbahnrand entfernt
DTSTART;VALUE=DATE:20150821
LOCATION:Brookmerland / 2015 für Brookmerland\, Kirchweg
SUMMARY:Abfuhr: Gelbe Tonne
URL:http://www.landkreis-aurich.de
END:VEVENT
und das ist die gelbe Tonne aus den screens.
da gibt es auch kein DTEND nur
DTSTART;VALUE=DATE:20150826
@Vize, hast Du damit den Probleme ?
kvo1
ich habe mal was aus einem anderen thread geklaut. ;) dort war auch kein DTEND drin. -> http://forum.fhem.de/index.php/topic,26209.0.html
#!/usr/bin/awk -f
{
print $0;
if (index($0, "DTSTART") > 0)
{
sub(/DTSTART/, "DTEND", $0)
print $0;
}
}
Dieses kleine awk-Script dupliziert die DTSTART Zeile und ersetzt DTSTART mit DTEND. (Abspeichern, chmod +x, ./convert OriginalDatei.ics > Abfuhrkalender2014.ics)
edit; wobei das mit dem DTEND eigendlich egal sein müsste, denn der Split läuft ja dennnoch durch, denn split ist ja egal wie viele zeilen drin sind.
@kvo1
Nee, keine Probleme...in meinem Kalender sieht die Zeitdefinition nur etwas anders aus:
BEGIN:VEVENT
UID:7
SUMMARY:Restabfall
DTSTART;TZID=Europe/Berlin:20150819T060000
DTEND;TZID=Europe/Berlin:20150819T100000
END:VEVENT
Da steht also auch ne Uhrzeit drin.
Bei dir und BlackStone sind es ja wohl "ganztägige" Termine...vielleicht braucht es deswegen kein DTEND.
Meine Kalenderauswertung bzw. das korrekte Einlesen der ical-Datei klappt ohne DTEND nicht.
@BlackStone
Das script kannte ich schon...
Gruß
Andreas
stimmt, bei mir steht :
DTSTART;VALUE=DATE:20150821
wohingegen du :
DTSTART;TZID=Europe/Berlin:20150819T060000
stehen hast.
also T060000 was ja als 6 uhr morgens zu sehen ist. dazu sogar noch eine Zeitzonenangabe. ^^
So ist es.
Wird denn dann bei dir z.B. der Termin für den 21.08. auch noch den ganzen Tag am 21.08. (also bis 23:59) in der readingsGroup angezeigt, wenn du den Kalender mal händisch nach der Abfuhr updatest?
Gruß
Andreas
ich brauchte nicht groß per hand ran gehen, denn ich habe bei mir mit live daten getestet, heute zum 18.8.2015 war die Grüne Tonne dran, und die ist wie geplant am 17.8.2015 um 00:00 aus den readings gelöscht worden.
ist ganz praktisch gewesen, zum testen. naja, und heute morgen ist die tonne dann geleert worden (von den nachbarn die, meine war noch fast leer).
Zitat von: BlackStone am 18 August 2015, 13:22:22wie geplant am 17.8.2015 um 00:00 aus den readings gelöscht worden
Dann ist die aber nen Tag zu früh verschwunden, oder meintest du am 18.8. um 00:00 Uhr? ;)
Gruß
Andreas
upps :o ; ja meinte ich, 17.8.2015 23:59 war der eintrag noch da und 18.8.2015 00:00 (bzw. 17.8 um 24 uhr) war er weg.
BlackStone, kannst du nochmal sagen, ob du was an der Berechnung für $dayDiff in deiner 99_myUtils angepasst hast?
Wenn ich in meinem Kalender Termine nur mit z.B.
DTSTART;VALUE=DATE:20150825
anlege, bekomme ich ein falsches reading ins dummy geschrieben (s. Anhang).
Die Werte passen bei mir erst, wenn ich auch ein DTEND angebe...
Gruß
Andreas
Die berechnung ist exact so wie bei dir.
meine wie ich es aktuell drin habe, und die ganze zeit hatte.
$dtPapier = $eventDate;
my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
und das ist deine
$dtPapier = $eventDate;
my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
also muss kann es sein das beim split sich die indexe verschieben?
Zitat von: BlackStone am 18 August 2015, 19:27:35
also muss kann es sein das beim split sich die indexe verschieben?
Kannst du das mal für einen Nichtprogrammierer erläutern/übersetzen? :-[ ;)
Gruß
Andreas
wenn du einen string splittest. achtun pseudocode.
a$="Fu Ma Na Chu";
b$=split(a," ")
wird in der variable b$ ein Array erzeugt.
dieses schaut dann z.b. so aus.
b$
(
[0] => Fu
[1] => Ma
[2] => Na
[3] => Chu
)
um nun auf die einzelnen Felder zuzugreifen nutzt du den Index.
um auf "Fu" zuzugreifen nutzt du b$[0] um auf "Chu" eben b$[3].
jetzt schiebst du wieder etwas zusätzlich in den string.
a$="Fu Ma N Na Chu";
b$=split(a," ")
der Rest Code bleibt aber gleich, und nun willst du wieder auf "Chu" zugreifen, und es kommt Kompost zustande, denn du greifst ja mit b$[3] zu, weil es immer so war. nur ist es jetzt so das sich der Index verschoben hat. also nun b$[4] ist.
evtl, hast du bei dir genau diesen effekt.
OK, ich schau mir das morgen mal genauer an...
Was erhältst du denn eigentlich als Ausgabe, wenn du ein
get muellkalender start <uid>
auf eine deiner uids absetzt?
Auf das Ergebnis wird danach ja "gesplittet"...
Gruß
Andreas
hm, ich sehe da kein split.
ist von der nächsten Papierabholung.
get muellkalender start 20150815T115914CEST97332uvNl8landkreisaurichde0
da kommt
02.09.2015 00:00:00
tante edit hat gebissen. stimmt ja, der split ist hinterher, so das ein array mit datum und mit uhrzeit entsteht.
Hallo Zusammen,
wollte nur kurz Erfolg vermelden, meine Restmülltonne (Mi 19.8) ist weg, nur die gelbe Tonne ist noch da.
Nächste Abholung wäre in 14 Tagen, will nicht so lange Warten, werde mal paar Termin reinbasteln... :)
kvo1
PS:
Irgendwie wäre es doch nett , am Vorabend nochmal einen speziellen hinweiston o.ä. zu erhalten, aber
da gibt es ja genug Beispiel zum lernen ;)
brauchst keine Termine reinbasteln.
if ($dayDiff >= 0 && $dayDiff <= 7) {
die 7 gibt die tagesanzahl an, also einfach raufsetzen. ;)
Hallo BlackStone,
zu meinem komischen Termin aus post Nr. 37 habe ich zumindest den Zusammenhang herausgefunden.
Das Entsorgungsdatum wäre übrigens im Jahr 2061 ;)
Um meine Kalenderdatei schmal zu halten habe ich die Termine, da sie ja im 2- bzw. 4-wöchentlichen Rhythmus - wenn keine Feiertage dazwischen kommen - über das ganze Jahr stattfinden, so angelegt:
DTSTART;VALUE=DATE:20150826
DTEND;VALUE=DATE:20150826
RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=WE
UID:1
SUMMARY:Biotonne
END:VEVENT
Somit brauche ich das für jede weitere Abfallart nur einmalig wiederholen.
Sobald ich das RRULE rausnehme, reicht ein DTSTART, aber dann müsste ich jedes Datum für jeden Termin einzeln anlegen. Mit RRULE - was die Datei sehr übersichtlich macht - brauche ich auch ein DTEND.
Warum, kann vielleicht jemand anderes erklären...ich hab es noch nicht erforscht...
Gruß
Andreas
Nun das mit DTEND und RRULE ist schon logisch. ^^
Die Rule muss ja einen StartPunkt haben um den Nächsten Termin festzulegen. das geht nur wenn bekannt ist wann der Letzte Termin zu ende war/ist.
Jedoch 2061, hm da wird die Tonne doch nur noch Gebeamt. ;D
Zitat von: kvo1 am 19 August 2015, 00:52:52
Hallo Zusammen,
wollte nur kurz Erfolg vermelden, meine Restmülltonne (Mi 19.8) ist weg, nur die gelbe Tonne ist noch da.
Nächste Abholung wäre in 14 Tagen, will nicht so lange Warten, werde mal paar Termin reinbasteln... :)
kvo1
PS:
Irgendwie wäre es doch nett , am Vorabend nochmal einen speziellen hinweiston o.ä. zu erhalten, aber
da gibt es ja genug Beispiel zum lernen ;)
Hallo Zusammen,
da habe ich wohl zu früh gefreut :'(
Leider ist mein per Hand eingetragener Termin (22.08) immer noch da !
BEGIN:VEVENT
UID:20150714T000011CEST-0802UvVabc@www.bsr.de
DTSTAMP:20150713T220010Z
CATEGORIES:BSR Abholung
DESCRIPTION:Gelbe Tonne
DTSTART;VALUE=DATE:20150822
LOCATION:Hauptstr. 110\,
SUMMARY:Gelbe Tonne
END:VEVENT
Vielleicht liegt das doch am fehlenden
DTEND ???
Kvo1
Moin,
hmm, bei BlackStone klappt es ja, so wie er schreibt...
Wie gesagt, ich benutzte in meiner Kalenderdatei DTSTART und DTEND mit Uhrzeit und damit funktioniert es.
Häng doch mal die DEF deines dummies, die DEF der readingsGroup und deren Atrribute und die 99_myUtils hier an.
Gruß
Andreas
Ja bei mir klappt es, wie es soll.
ich warte nur noch für den letzten Test, ob es demnächst angezeigt wird. nächste Woche ist wieder eine Abholung, wenn alles so läuft wie bisher müsste Mittwoch die PapierTonne zur Abholung auftauchen.
edit:/ wie gut das man lesen kann. *gg* vorher kommt die biotonne nochmal. die müsste also morgen drin sein.
Zitat von: Vize am 24 August 2015, 08:40:43
Moin,
hmm, bei BlackStone klappt es ja, so wie er schreibt...
Wie gesagt, ich benutzte in meiner Kalenderdatei DTSTART und DTEND mit Uhrzeit und damit funktioniert es.
Häng doch mal die DEF deines dummies, die DEF der readingsGroup und deren Atrribute und die 99_myUtils hier an.
Gruß
Andreas
Hallo Andreas,
hier bitte die gesamte DEF...
define muellkalender Calendar ical file /opt/fhem/BSR_Abfuhrkalender.ics 21600
attr muellkalender group Müll
attr muellkalender icon message_garbage@blue
attr muellkalender room Kalender
define no_muelltermine notify muellkalender:modeUpcoming.* { muelltermine("$EVENT") }
attr no_muelltermine group Müll
attr no_muelltermine room Kalender
define du_muelltermine dummy
attr du_muelltermine group Müll
attr du_muelltermine room Kalender
define muellabfuhr readingsGroup du_muelltermine:Restmuell,Biotonne,Papiertonne,GelberSack \ du_muelltermine:Restmuell_dTag,Biotonne_dTag,Papiertonne_dTag,GelberSack_dTag
attr muellabfuhr group Müll
attr muellabfuhr noheading 1
attr muellabfuhr nonames 1
attr muellabfuhr room Kalender
attr muellabfuhr style style='text-align:center'
attr muellabfuhr valueFormat { return $VALUE if ( $VALUE ne '88');; return undef;; }
attr muellabfuhr valueIcon { Biotonne => 'dustbin@green', GelberSack => 'dustbin@yellow', Papiertonne => 'dustbin@blue', Restmuell => 'message_garbage@orange'}
und die SUB aus der 99_myUtils
sub
muelltermine ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
my $t = time;
my $dtPapier = '';
my $dtGelberSack = '';
my $dtRestmuell = '';
my $dtBiomuell = '';
my @days = qw/So Mo Di Mi Do Fr Sa/;
foreach my $uid (@uids) {
my $Kalendertext = fhem("get muellkalender summary $uid");
if ($Kalendertext =~ /Blaue 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 ($dtPapier eq '' || ($eventDate < $dtPapier && $eventDate > $t))
{
$dtPapier = $eventDate;
my $dayDiff = floor(($dtPapier - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
my @date1 = split /\./,$SplitDt[0];
my $wday1 = "$wday" . " : " . "$date1[0]"."."."$date1[1]";
if ($dayDiff >= 0 && $dayDiff <= 7) {
fhem("setreading du_muelltermine Papiertonne $dayDiff");
fhem("setreading du_muelltermine Papiertonne_dTag $wday1");
}else{
fhem("setreading du_muelltermine Papiertonne 88");
fhem("setreading du_muelltermine Papiertonne_dTag 88");
}
}
};
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 ($dtGelberSack eq '' || ($eventDate < $dtGelberSack && $eventDate > $t))
{
$dtGelberSack = $eventDate;
my $dayDiff = floor(($dtGelberSack - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
my @date1 = split /\./,$SplitDt[0];
my $wday1 = "$wday" . " : " . "$date1[0]"."."."$date1[1]";
if ($dayDiff >= 0 && $dayDiff <= 7) {
fhem("setreading du_muelltermine GelberSack $dayDiff");
fhem("setreading du_muelltermine GelberSack_dTag $wday1");
}else{
fhem("setreading du_muelltermine GelberSack 88");
fhem("setreading du_muelltermine GelberSack_dTag 88");
}
}
};
if ($Kalendertext =~ /Abholung Hausmü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 ($dtRestmuell eq '' || ($eventDate < $dtRestmuell && $eventDate > $t))
{
$dtRestmuell = $eventDate;
my $dayDiff = floor(($dtRestmuell - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
my @date1 = split /\./,$SplitDt[0];
my $wday1 = "$wday" . " : " . "$date1[0]"."."."$date1[1]";
if ($dayDiff >= 0 && $dayDiff <= 7) {
fhem("setreading du_muelltermine Restmuell $dayDiff");
fhem("setreading du_muelltermine Restmuell_dTag $wday1");
}else{
fhem("setreading du_muelltermine Restmuell 88");
fhem("setreading du_muelltermine Restmuell_dTag 88");
}
}
};
if ($Kalendertext =~ /Biotonne/) {
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 ($dtBiomuell eq '' || ($eventDate < $dtBiomuell && $eventDate > $t))
{
$dtBiomuell = $eventDate;
my $dayDiff = floor(($dtBiomuell - $t) / 60 / 60 / 24 + 1);
my $date = $SplitDt[0];
my @date = split /\./,$date;
my $wday = $days[(localtime(timelocal(0,0,0,$date[0],$date[1]-1,$date[2]-1900)))[6]];
my @date1 = split /\./,$SplitDt[0];
my $wday1 = "$wday" . " : " . "$date1[0]"."."."$date1[1]";
if ($dayDiff >= 0 && $dayDiff <= 7) {
fhem("setreading du_muelltermine Biotonne $dayDiff");
fhem("setreading du_muelltermine Biotonne_dTag $wday1");
}else{
fhem("setreading du_muelltermine Biotonne 88");
fhem("setreading du_muelltermine Biotonne_dTag 88");
}
};
};
}
}
danke
kvo1
Moin,
auf den ersten Blick seh ich beim Überfliegen keine Fehler in deinen Angaben.
Vielleicht schleppst du noch ein "altes" reading aus dem dummy mit? Welche readings stehen denn noch in deinem dummy?
Könntest ja mal den dummy komplett löschen und nochmal neu anlegen und befüllen. Dann mal schauen, ob der verstrichene Termin immer noch da ist...
Ansonsten hat BlackStone vielleicht noch n Tipp...du verwendest ja seine Version...
Gruß
Andreas
soweit sehe ich da jetzt auch kein fehler.
was ich mir jedoch forstellen könnte, wäre die ics datei. da ja ein termin per hand eingetragen wurde.
was ist wenn da jetzt die alte linux/windows freundschaft zu schlägt. meine den berühmtem zeilenumbruch in der datei auf windows cr/lf und mei linux nur lf.
was ja auch dafür sorgt das Textdateien von linux unter windows nur einzeilig angezeigt werden ohne zeilenumbrüche.
so, habe es nochmal mit Lunix geändert ! (vi) und einen "gelben Termin" auf morgen gesetzt !
Mal sehen wir es dann morgen früh ausschaut !
auf morgen nützt dir nix, wenn die abholung morgen ist müsste der termin ja heute schon auftauchen. nach einem fhem neustart sollte er da sein.
Zitat von: BlackStone am 25 August 2015, 16:04:17
auf morgen nützt dir nix, wenn die abholung morgen ist müsste der termin ja heute schon auftauchen. nach einem fhem neustart sollte er da sein.
Ja der Termin ist ja auch da.
Im Kalender eingetragen 26.08.2015 , fhem neustart, Termin ist heute da und sollte morgen dann weg sein !
Zitat von: kvo1 am 25 August 2015, 17:17:01
Ja der Termin ist ja auch da.
Im Kalender eingetragen 26.08.2015 , fhem neustart, Termin ist heute da und sollte morgen dann weg sein !
Hallo BlackStone/ Vize,
nachdem ich hier nochmal per Hand 2 Termine (GelberSack und Papiertonne) in die ics-Datei eingetragen hatte mußte ich leider feststellen,das diese Reading im Dummy du_muelltermine nicht löscht bzw. auf 88 gesetzt werden. Parallel gab es einen echten Eintrag für Restmüll (Termin 2.9.15) und diese war dann heute morgen auch verschwunden (Readings auf 88).
Vermutlich liegt das wohl an den handischen Einträgen ? obwohl ich da keinen Unterschied feststelle ! :'(