SmartHome mit FHEM – Umsetzung meines Abfallkalenders

Wie versprochen, werde ich demnächst immer wieder mal meine FHEM-Lösungen im Detail vorstellen. Lösungen für das Thema „Abfallkalender“ werden immer wieder angefragt, so dass ich meine FHEM-Reihe damit beginnen möchte. Wie in meinen vorherigen Artikeln beschrieben, ist die Basis meines FHEM ein Raspberry Pi2 und ich schalte neben ein paar Fritz!Dect Steckdosen in erster Linie Homematic Geräte.

Als Oberfläche für mein Android Tablet, welches im Flur an der Wand hängt, nutze ich die relativ neue Lösung FHEM Tablet UI (FTUI) aus der Community. Meiner Ansicht nach aktuell die beste und am einfachsten umzusetzende Oberfläche für die Haussteuerung mit FHEM.

Auf dem Startscreen meiner FHEM Oberfläche, habe ich einige Infos, die neben den wichtigsten Schaltoptionen angezeigt werden. Hier ist auch meine Umsetzung des Abfallkalenders zu finden. Ich habe mich dazu entschieden, alle unsere Mülltonnen sowie die Anzahl Tage bis zur Abfuhr anzuzeigen. Was man im Screenshot leider nicht erkennt, sind die drehenden Icons der Mülltonne, die am Abend noch raus gestellt werden muss.

Haussteuerung mit FHEM und FTUI Oberfläche

Haussteuerung mit FHEM und FTUI Oberfläche

Nachdem wir bereits in letzter Zeit übersehen hatten, dass die Termine – auf Grund von Feiertagen – nach Vorne verschoben wurden, habe ich nun auch noch eine Sprachausgabe über meine Sonos Geräte eingebaut. Sobald Abends nach 22:00 Uhr der Fernseher ausgeschaltet wird, erkennt FHEM dies als Schlafmodus und führt entsprechende Schaltvorgänge aus. Hierzu gehört dann auch noch eine Warnmeldung, dass Mülltonnen raus zu stellen sind. Ein Blick auf die drehenden Icons zeigt dann, welche Mülltonne am nächsten Tag abgeholt wird.

Nachfolgend beschreibe ich meine Umsetzung nun Schritt für Schritt.

Basis des Abfallkalenders ist ein Google Kalender

Innerhalb Google habe ich mir einen eigenen Kalender „Abfall“ eingerichtet. Ich denke, dass ich hier nicht näher ausführen muss, wie das funktioniert. Unser Abfuhrunternehmen bietet einen Kalender, den man als iCalender Datei herunter laden und dann bei Google importieren kann.

Abfallkalender beschaffen

Hierzu geht man im Google Kalender in die Einstellungen und wählt dort die Funktion „importieren“ aus. Nun kann man in einem Dialog die Datei auswählen und angeben, in welchen Kalender der Import durchgeführt werden soll.

Kalende Import

Nun muss dieser Kalender noch im FHEM bekannt gemacht werden. Dies geschieht mit dem Modul „Calendar„. Bei der Definition wird eine URL benötigt, die man sich wieder bei Google besorgen kann. Für den Kalender „Abfall“ ruft man die Einstellungsseite auf und dann findet man im unteren Bereich die Einträge „Kalenderadresse“ und „Privatadresse“. Da der Kalender in der Regel nicht öffentlich verfügbar gemacht wird, muss also die „Privatadresse“ genutzt werden. Mit einem Klick auf den ical-Button kann man sich den Link anzeigen lassen und für die Verwendung in FHEM kopieren.

Google Kalender URL

Der FHEM Befehl für die Definition des Kalenders sieht dann so aus:

define Abfall Calendar ical url https://www.google.com/calendar/ical/veuhdbcagdpbs234fnfes11d9g%40group.calendar.google.com/private-f0412f72xxxxxxxxxxxxxxx87a226/basic.ics 21600

Mit dem Intervall 21600 wird der Kalender nun alle 6 Stunden aktualisiert.

Abfall Kalender auswerten

Im nächsten Schritt muss nun ein notify in FHEM definiert werden, damit aktuelle Termine erkannt werden. Innerhalb meines notify-Befehls rufe ich eine Funktion zur Auswertung der Kalenderinformationen auf.

[UPDATE 09.02.16]Auf Grund des geänderten Calendar-Moduls funktioniert der bisherige Code leider nicht mehr richtig. Sowohl das notifify wie auch die Funktion Abfalltermine habe ich daher geändert, so dass nun hoffentlich wieder alles läuft.

Voraussetzung für die Anpassungen ist, dass man beim Calendar die vergangenen Termine „versteckt“. Dies geschieht mit folgender Einstellung:

attr Abfall hideOlderThan 2d

Damit werden nur Termine berücksichtigt, die maximal 2 Tage zurück liegen. Der notify prüft nun auf jede Änderung (triggered) und die Funktion Abfalltermine benötigt keine Parameter.
[UPDATE ENDE] [UPDATE 17.04.16]Das Attribut hideOlderThan sollte möglichst auf einen sehr kurzen Zeitraum gesetzt werden. Ich verwende im Mpment 10 Sekunden. Also „attr Abfall hideOlderThan 10“.[UPDATE ENDE]

define notAbfalltermine notify Abfall:triggered { Abfalltermine() }

Der oben definierte notify reagiert auf alle Ereignisse eines Kalenders (siehe Referenz von Calendar).

Die Funktion „Abfalltermine“ wird in der Datei „99_myUtils.pm“ definiert und sieht wie folgt aus. Als Basis habe ich eine Funktion einer Beschreibung aus der Community genutzt.

[UPDATE]Ich hatte die Funktion „KalenderDatum“ in der ursprünglichen Beschreibung vergessen. Nun ist die Funktion im folgenden Codebeispiel zu finden.[ENDE UPDATE] [UPDATE 08.02.16]Seit gestern gibt es ein modifiziertes Kalendermodul. Daher sollten ein paar Anpassungen im Code vorgenommen werden. Bei den get-Aufrufen für den Kalender bekommt man bei Serienterminen nun möglicherweise mehrere Termine für eine einzelne uid zurück geliefert. Damit das nicht passiert sollten die entsprechenden Aufrufe in „get $Kalendername uid=$KanderUid 1 angepasst werden. Im Code habe ich die Änderungen entsprechend eingebaut.[UPDATE] [UPDATE 09.02.16]Geändert wurde die Funktion Abfalltermine. Gleichzeitig habe ich versucht, die Funktion ein wenig zu generalisieren, wodurch sie auch deutlich kleiner geworden ist. Man muß nun nur noch die beiden Arrays Tonnen und Suchtexte an die eigenen Bedürfnisse anpassen und natürlich den Dummy „MuellterminDummy“ nutzen.[UPDATE ENDE]

[UPDATE 11.02.16]Zunächst einmal muß ich mich für die vielen Updates entschuldigen, aber die Änderung des Calendar Moduls und meine bescheidenen PErl-Kenntnisse ärgern mich gerade ein wenig ;-). Nachdem mein Abfallkalender heute Minuswerte und keine Icons angezeigt hat, musste ich mir das Ganze nochmal ansehen und die nachfolgenden Funktionen komplett anpassen. Die Einstellung im Kalender, damit ältere Termine als 2 Tage nicht angezeigt werden ist natürlich Quatsch gewesen. Am Folgetag nach der Abholung erscheint der Termin immer noch bei „modeEnd“ und wird auch bei „find“ gefunden (ob das wohl richtig ist?). Versucht man dann aber das Startdatum zu ermitteln bekommt man keine Werte zurück geliefert. Also habe ich nun die Funktionen so angepasst, dass nach dem Termin mit dem nächsten Datum gesucht wird. Ich hoffe, dass damit nun alle Probleme, die durch das neue Calendar-Modul entstanden sind behoben sind. Am besten ihr kopiert euch die beiden Funktionen „KalenderDatum“ und „Abfalltermine“ in eure myUtils.[UPDATE]

[UPDATE 14.02.16]Da es im Moment bei einigen Konstellationen immer noch ein paar Probleme gibt, habe ich nochmal eine optimierte Version meiner Funktionen unten in den Kommentaren dokumentiert. Bei der neuen Funktion sollten immer die nächsten Termine gefunden werden, egal in welcher Reihenfolge die Termine durch das Calendar-Modul geliefert werden. Vielleicht könnt ihr die Funktionen nochmals testen, bevor ich sie hier im Text anpassen.[UPDATE ENDE]

[UPDATE 16.04.16]Nachdem meine letzten Änderungen bei mir aktuell ohne Probleme laufen, habe ich nachfolgend die beiden Funktionen nochmals angepasst. Es wird nun auch am Abholtag eine „0“ angezeigt.[UPDATE]

#
# Hilfsfunktion für Kalenderauswertungen
#

sub
KalenderDatum($$)
{
   my ($KalenderName, $KalenderUid) = @_;
   my $dt = fhem("get $KalenderName start uid=$KalenderUid 1");
   my $ret = time - (2*86400);  #falls kein Datum ermittelt wird Rückgabewert auf "vorgestern" -> also vergangener Termin;

   if ($dt and $dt ne "")
   {
      my @SplitDt = split(/ /,$dt);
      my @SplitDate = split(/\./,$SplitDt[0]);
      $ret = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
   }

   return $ret;
}


#
# Abfall Kalender auswerten / Google Kalender: "Abfall"
#

sub
Abfalltermine()
{
   my $t  = time;
   my @Tonnen = ("GrueneTonne", "GelbeTonne", "Restmuell", "BioTonne");
   my @SuchTexte = (".*Papier.*", ".*Wertstoff.*", ".*Restmüll.*", ".*Bio.*");
   my $uid;
   my $dayDiff;
 
   for(my $i=0; $i<4; $i++)
   {
      $dayDiff = -1; #BUG behoben
      my @uids = split(/;/,fhem("get Abfall find $SuchTexte[$i]"));
      
      # den nächsten Termine finden
      foreach $uid (@uids)
      {
         my $eventDate = KalenderDatum('Abfall', $uid);
         my $dayDiffNeu = floor(($eventDate - $t) / 60 / 60 / 24 + 1);
         if ($dayDiffNeu >= 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1)) #BUG behoben
         {
            $dayDiff = $dayDiffNeu;
         }
      }
      
      fhem("setreading MuellterminDummy $Tonnen[$i] $dayDiff");
   }
}

In jedem Kalendereintrag wird nun überprüft, welcher Mülleimer eingetragen ist und dann die Anzahl Tage bis zur nächsten Abfuhr ermittelt. Den entsprechenden Wert habe ich in einem Dummy gespeichert.

define MuellterminDummy dummy

Darstellung im FHEM Tablet UI

Mit den bisherigen Definition wird nun regelmäßig festgestellt, wann eine Mülltonne geleert wird und nun muss diese Infos nur noch sinnvoll dargestellt werden. Der entsprechende Code für das Tablet UI, der in meinem Fall in der index.html definiert wurde sieht wie folgt aus:

<li data-row="4" data-col="2" data-sizex="3" data-sizey="1">
<header><div data-type="label" class="large">Abfall</div></header>
	<div	data-type="symbol"
		data-device="MuellterminDummy"
		data-get="BioTonne"
		data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
		data-on-colors='["SaddleBrown","SaddleBrown"]'
		data-get-on='["0","2"]'
		data-background-icon="fa-circle"
		class="bigger inline" >
	</div>
	<div 	data-type="symbol"
		data-device="MuellterminDummy"
		data-get="GelbeTonne"
		data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
		data-on-colors='["yellow","yellow"]'
		data-get-on='["0","2"]'
		data-background-icon="fa-circle"
		class="bigger inline" >
	</div>
	<div 	data-type="symbol"
		data-device="MuellterminDummy"
		data-get="GrueneTonne"
		data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
		data-on-colors='["green","green"]'
		data-get-on='["0","2"]'
		data-background-icon="fa-circle"
		class="bigger inline" >
	</div>
	<div 	data-type="symbol"
		data-device="MuellterminDummy"
		data-get="Restmuell"
		data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
		data-on-colors='["black","black"]'
		data-get-on='["0","2"]'
		data-background-icon="fa-circle"
		class="bigger inline" >
	</div>
</li>

Zur Darstellung habe ich das FTUI Symbol-Widget verwendet. Als Device nutze ich den definierten Dummy „MuellterminDummy“ aus dem dann die Readings für die jeweiligen Mülleimer zur Ermittlung Abfuhrzeiten (Anzahl Tage) gelesen werden. Die Tage werden dann mittels der Klasse „warn“ im Symbol angezeigt und mit den Array-Definitionen bei data-icons, data-on-colors und data-get-on sorge ich dafür, dass das Symbol sich einen Tag vor der Abfuhr dreht (Klasse „fa-spin“).

Zusätzliche Hinweise einbauen

Je nach eigener FHEM-Umgebung kann man sich nun noch weitere Hinweise einbauen, um an die Abfalltermine erinnert zu werden. Wie eingangs erläutert nutze ich eine „Schlaffunktion“ aus der heraus ich auch noch eine Sprachausgabe auf meinen Sonos Geräten starte. In der Funktion für die Schlafsteuerung rufe ich die Funktion „SprachansageAbfall“ auf, die wie folgt aussieht.


sub SprachansageAbfall()
{

if(ReadingsVal("MuellterminDummy", "BioTonne", "2") <= 1 or
ReadingsVal("MuellterminDummy", "GelbeTonne", "2") <= 1 or
ReadingsVal("MuellterminDummy", "GrueneTonne", "2") <= 1 or
ReadingsVal("MuellterminDummy", "Restmuell", "2") <= 1)
{
fhem("set Sonos_Kueche,Sonos_Bad Speak 50 de Achtung Achtung Die Mülltonnen müssen raus gestellt werden");
};

}

Bei der Sprachausgabe habe ich mich darauf beschränkt, nur allgemein das Herausstellen der Mülltonne nicht zu vergessen. Man könnte nun noch genau ausgeben, welche Mülltonne raus  zu stellen ist. Aber ein kurzer Blick auf die drehenden Icons der Tablet-Oberfläche im Flur, bei dem ggf. auch noch die Weckzeit eingestellt wird, sollte ausreichend sein ;-).

Ich hoffe, dass die interessierten FHEM User mit dieser Beschreibung etwas anfangen können und freue mich natürlich auch auf Verbesserungsvorschläge oder weitere Fragen.

176 comments

  1. Coole Sache dein Abfallkalender!
    Habe schon länger nach so einer edlen Lösung gesucht.

    Ist es auch möglich die letzten sieben Tage nicht als Zahl sondern als zweistelliger Wochentag anzuzeigen? Also MO DI MI usw.?

    Danke

  2. Danke. Die aktuelle Umsetzung der Klasse „warn“ erlaubt meines Wissens nur die Darstellung von Ziffern bzw. einen „!“ für sonstige Werte. Bei uns reicht das auch aus, da alle Abfuhrtermine in der Regel immer am Dienstag sind.

  3. Sehr schöne Erweiterung der Tablet UI!
    Bei der 1:1-Umsetzung hatte ich aber leider etwas Schwierigkeiten.
    Ich denke, Du hast die Subroutine „KalenderDatum“ bei Dir noch in der 99_myUtils.pm stehen.
    Ich habe zumindest eine Fehlermeldung bekommen, dass die Funktion nicht bekannt ist und habe sie durch die einzelnen Perl-Funktionen ersetzt, wie sie hier in dieser Diskussion im Forum verwendet worden sind: http://forum.fhem.de/index.php/topic,24646.75.html

    Vielleicht kannst Du der Vollständigkeit halber Deine Subroutine KalenderDatum hier noch ergänzen. Sie macht die Funktion auf alle Fälle übersichtlicher.

  4. Sieht klasse aus der Abfall Kalender. Habe mich auch gleich an´s nachbauen gemacht aber es klappt noch nicht. Zuerst hatte ich das Problem keine Tonnen zu sehen da Vorher und Hintergrund dieselbe Farbe hatten. Das scheint mit „data-get-on“ zusammen zu hängen. Lasse ich das temporär weg erscheinen die Tonnen. Ich schätze das data-get-on nix liefert liegt daran das meine Kalendereinträge anders aussehen? Ich habe ganz simpel für morgen z.B. mal Werkstofftonne in´s Subject geschrieben und als ganztägiges Ereignis deklariert, keine Alarme o.ä. Wie sollte denn der Kalendereintrag aussehen? Da ich kein perl/html Experte bin – gibt´s eine Möglichkeit zu Debuggen? Vielleicht liegt´s auch an der 99_myUtils.pm?

  5. schätze es liegt an deiner „KalenderDatum“ Funktion oben die du irgendwo anders deklariert hast…

  6. Hallo und Danke für dieses tolle Beispiel.
    Ich beschäftige mich ebenfalls mit FHEM und der neuen UI.
    Nun wollte ich deinen Code verwenden, aber er fimdet die Perlfunktion „KalenderDatum“
    leider nicht. Kannst du diese hier auch noch zur Verfügung stellen?

    Vielen Dank

  7. Hallo Jürgen,

    erstmal vielen Dank für deinen tollen Blog. Er hilft mir immer mal wieder weiter und schafft auch neue Anregungen.

    Nun habe ich auch den Abfallkalender angelegt und möchte diesen nun in FHEM einbinden.
    Ich habe mir dein Codeschnipsel für das Auslesen der Kalendereinträge in meine Utils eingefügt.
    Jedoch bekomme ich eine Fehlermeldung, dass die Routine „KalenderDatum“ nicht existiert. Ist das eine Standardroutine oder muss ich diese noch selbst schreiben. Falls eigen, kannst du diese zur Verfügung stellen?

    Vielen Dank
    Roger

  8. Toller Artikel, es fehlt aber die Routine KalenderDatum(). Kannst Du die noch ergänzen?

  9. Hi Jürgen,

    den Müllkalender find ich klasse! Hab das auch soweit bei Google und FHME eingerichtet aber leider funktioniert es nicht. FHEM liest zwar den Kalender ein aber in den Muelltermine Dummy werden keine Werte übertragen.

    Kann es sein das das Sub ein Problem mit Terminen am gleichen Tag hat? Gibt es in dem Sub noch was zu beachten, wenn man das „personalisiert“? Ich hab eigentlich nur „$Kalendertext =~ /Wertstofftonne/“ an den Name der jew. Kalendereinträge angepasst.

    Im Log erscheint folgendes:
    get Abfall summary ABCDEFGgooglecom : Gelber Sack
    nf_Abfalltermine return value: Undefined subroutine &main::KalenderDatum called at ./FHEM/99_myUtils.pm line 94.

    Vielen Dank für einen heißen Tip!!

    Viele Grüße

    Markus

  10. Hallo,
    Habe versucht es umzustzen erhalte aber diesen Fehler.
    notAbfalltermine return value: Undefined subroutine &main::KalenderDatum called at ./FHEM/99_myUtils.pm
    Habe gesucht konnte die Subrutine nirgendwo finden.

    Danke Alfons

  11. Hi Jürgen,

    erst mal Danke das Du hier Deine Ideen teilst.

    Wollte gerade Deinen Abfallkalender bei mir implementieren und hab alles 1:1 umgesetzt. Leider bekomme ich diese Fehlermeldung
    2015.07.18 18:37:01 3: get Abfall summary XXXXXXXXXXXXXXXXX0googlecom : Biotonne
    2015.07.18 18:37:01 3: notAbfalltermine return value: Undefined subroutine &main::KalenderDatum called at ./FHEM/99_myUtils.pm line 73.

    Hab ich was vergessen? Muss KalenderDatum noch irgendwo eingetragen werden?

    Gruß Frank

  12. Eine tolle Idee, dieser Abfallkalender. Auch deine Beschreibung zur Erstellung mit Google Plus. Ich arbeite auch in meiner Agentur damit – das ist einfach praktisch.
    Für meinen privaten Gebrauch werde ich den Kalender ausprobieren!

  13. Hallo,

    versuche nun schon länger das obige umzusetzen.. scheitere aber leider.
    Offensichtlich wird der Dummy nicht gesetzt.
    Im Moment bekomme ich im log die Fehlermeldung:
    notAbfalltermine return value: Undefined subroutine &main::KalenderDatum….

    Hoffe Du kannst mir helfen.

    Grüße

  14. Sorry, im Code hatte ich die Funktion „KalenderDatum“ vergessen. Baue ich sofort mal ein, damit es dann auch wirklich funktioniert.

  15. Sorry Funktion vergessen. Ist nun im Text eingebaut.

  16. Mit Verspätung ist aber nun enthalten. Danke für den Hinweis.

  17. Hallo,

    Danke für das Update, jetzt funktioniert es perfekt !!

  18. Habe mich nun auch mal versucht meinen Kalender einzubringen.
    Jedoch bekomme ich im Log file diesen Eintrag:
    2015.08.02 09:17:05 3: get Abfall summary 20hk5fllskuuhl6lgbceo0dk44googlecom : Biotonne
    2015.08.02 09:17:05 3: get Abfall start 20hk5fllskuuhl6lgbceo0dk44googlecom : 08.10.2015 00:00:00
    2015.08.02 09:17:05 3: notAbfalltermine return value: Undefined subroutine &main::timelocal called at ./FHEM/99_myUtils.pm line 34.
    Die Zeile in der my99utils sollte diese sein:
    my $ret = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);

    Wenn ich den Termin vom 8.10.2015 lösche im Kalender erscheint die Fehlermeldung mit einem anderen Eintrag an einem anderen Tag.

    Ev nen Hinweis oder Löseung was ich falsch mache?

    LG

  19. Hallo,
    das Ganze funktionierte erst, nachdem ich
    use Time::Local ;
    in die 99_myUtils.pm eingefügt hatte. Davor hatte ich im Log Einträge wie

    notifyAbfalltermine return value: Undefined subroutine &main::timelocal called at ./FHEM/99_myUtils.pm line 181.

    Danke & Gruß,
    Stefan

  20. Hallo Jürgen,
    Ein echt tolle Erweiterung für Tablet-UI. Als ich dein Blog gelesen habe, habe ich mich gleich zum nachbasteln hingesetzt, bei mir klapt es jedoch noch nicht ganz, es scheint das die Funktion Abfalltermine nicht durchgeführt oder ausgelöst wird. Der Wert im MuellterminDummy wird nicht gesetzt. Ich bekomme weder Fehlermeldungen nocht resultate. Könntest du mir ein Tip geben wie ich das debuggen kann?

    danke & Gruß R.

  21. Da es mir grad viel Ärger gemacht hat:
    Falls der Dummy nicht beschrieben wird kann es daran liegen, dass
    “ use Time::Local; “ im Header von myutil fehlt

    Super Ding! Dankeschön für die Idee:)

  22. Hallo,
    eine sehr schöne und ausführliche Anleitung.
    Leider funktioniert bei mir der Notify-Block nicht, es wird nichts ausgelöst.
    Der direkte Funktionsaufruf von {Abfalltermine(„14429993151muellmaxde“)} hat auch keinen Einfluss.
    Woran könnte das liegen?

    Gruß Karstem

  23. Tolle Idee. Vielen Dank fürs Teilen!

    Leider werden bei mir keine Werte in „MuellterminDummy“ geschrieben. Der Test per Handeingabe „setreading MuellterminDummy Restmuell 1“ funktioniert aber und wird auch im UI richtig umgesetzt. Lediglich die Auswertung des Google-Kalenders mittels der Funktionen scheint noch nicht richtig zu funktionieren.

    Stehe an diesem Punkt schon seit mehreren Tagen auf dem Schlauch. Vielleicht hast Du hier einen Gedanken für mich, bei dem ich ansetzen kann?

    Vielen Dank!

  24. Super, deine Oberfläche.
    Bin zwar noch ein FHEM-Neuling aber einige Sensoren und den Abfallkalender (mit lokalem iCal Kalender) habe ich bereits erfolgreich umgesetzt. Was mich jetzt noch brennend interessiert: Wie hast du den Geburtstags- und Terminkalender hinbekommen. Ich kann mir zwar die Eintragungen per Kommandos anzeigen lassen, aber wie klappt die Anzeige in der Oberfläche? Könntest du vielleicht einen Auszug deiner FHEM.cfg anzeigen? Verwendest du eine Sub in der Utils-Datei. Wenn du dein KnowHow teilen würdest, wäre das sehr hilfreich.
    Viele Grüße
    Lothar

  25. Nachdem ich jetzt vielleicht wieder ein wenig mehr Zeit habe, werde ich nach und nach die Umsetzung meiner FHEM Funktionen darstellen.

  26. Hi,

    wie hast du denn diesen tollen Kalender „Termine Jürgen“ gebaut?
    Ich suche nach soetwas schon seit längerem, finde aber nichts.

    Grüße

  27. Am besten ich nutze die Frage für den nächsten Blog-Artikel und hoffe, dass es nicht zu eilig ist;-). Da ich jetzt wieder aus dem Urlaub zurück bin, sollte es aber bis zum nächsten Wochenende funktionieren.

  28. Nein hat keine Eile,

    habs heute Mittag selbst geschafft 😉
    Aber ich denke anderen wird das helfen.

    Grüße

  29. Cool, hätte zwei fragen dazu.
    Wie hast du das mit dem Wetter (Pollenflug) hinbekommen und wie bekommt man eine Grafik eingebunden (bei dir der QR-Code)?

  30. Die Pollenfunktion habe ich über das FHEM Modul HTTPMOD realisiert. Also eine Internetseite gesucht, die man mit regulären Ausdrücken ganz gut auswerten kann. Ich nutze donnerwetter.de und hierbei zum Beispiel den regulären Ausdruck (?s)Erle.*?poll([\d])

    Eine umfangreichere Erläuterung habe ich mal in meine ToDo-Liste für die Blogbeiträge aufgenommen 😉

    Den QR-Code habe ich in der Tablet Oberfläche mittels dem data-type „image“ eingebunden. Also in etwa wie folgt:
    data-type="image" data-url="./images/gastqr.PNG" data-size="100%" class="cell"

  31. Hallo Jürgen,
    ich finde deine Web_Ui echt gut. Gerade den Aufbau und die Gesatlltung.
    Woher bekommst du deine Icons ? Insbesondere das Routersymbol?
    Könntest du vielleicht den Programmcode deiner Index.html veröffentlichen? Das würde mir sehr bei meinem Projekt helfen.

    Viele Grüße Thorben

  32. Bei den Icons nutze ich eigentlich in erster Linie die Icons, die von der Tablet UI Umgebung angeboten werden. Bei dem Routersymbol habe ich das Icon „oa-it_router“ verwendet.

    Für die Bereitstellung meiner Tablet UI Codes sowie der FHEM Config-Datei habe ich gerade einen github Account eingerichtet. Das ist wahrscheinlich einfacher, als wenn ich jeder Anfrage einzeln antworten muss. Aktuell bin ich noch dabei den Code zu prüfen und „private“ Infos, wie Zugangsschlüssel u.ä. zu entfernen.

  33. Hallo Jürgen,

    erstmal danke für deine tollen FHEM Artikel. Ich nutze erst seit kurzem FHEM und dein Blog hat mir schon sehr weitergeholfen! 🙂

    Thorben hat ja schon gefragt … ich finde in einer aktuellen FHEM installation mit Tablet UI kein symbol oa-it_router … ich habe hier nur it_router ?!?!

    Wo ist es hin 😀 ?

    Gruss,
    Karl

  34. Für die „oa-“ Icons muß nachfolgender Eintrag im Header der TabletUI Einträge vorhanden sein, dann sollte das Icon auch gefunden werden:

    <link rel="stylesheet" href="/fhem/tablet/lib/openautomation.css" />

    Und in dem entsprechenden lib-Verzeichnis sollte die css-Datei natürlich auch vorhanden sein 😉

  35. Hi Jürgen, klasse Abfallkalender-Idee für FHEM! Habe das übernommen, aber im Tablet UI kommen nur 4 graue Kreise, aber keine Mülltonnenabbildungen. Wo kann ich nach dem Fehler suchen? Viele Grüße

  36. Da ich hier die Font Awesome Icons genutzt habe, gehe ich mal davon aus, dass bei dir kein Fehler in den entsprechenden Include Anweisungen vorhanden ist. Wahrscheinlich stimmt irgend etwas in der Widget Definition nicht. Ich tippe mal auf Probleme mit Hochkommas bzw. Anführungszeichen. Vielleicht kannst du mal deine Widget Definition zeigen.

  37. Hi Jürgen, hier die Widget Definition:

    Abfall

  38. Sorry, jetzt richtig:


    Abfall

  39. Wie kann ich denn Code richtig einfügen, damit er angezeigt wird?

  40. Versuche mal den Code zwischen folgende Codierung zu setzen „code“ in eckigen Klammen zur Einleitung und „/code“ in eckigen Klammern. Also [ code ] [ /code ] ohne die Leerzeichen.

  41. Ok, danke! Hier ein neuer Versuch mit

     und 

    :

    <li data-row="2" data-col="4" data-sizex="4" data-sizey="1">
            <header><div data-type="label" class="large">Abfall</div></header>
            <div data-type="symbol"
                 data-device="MuellterminDummy"
                 data-get="BioTonne"
                 data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
                 data-on-colors='["SaddleBrown","SaddleBrown"]'
                 data-get-on='["0","2"]'
                 data-background-icon="fa-circle"
                 class="bigger inline" >
            </div>
            <div data-type="symbol"
                 data-device="MuellterminDummy"
                 data-get="GelbeTonne"
                 data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
                 data-on-colors='["yellow","yellow"]'
                 data-get-on='["0","2"]'
                 data-background-icon="fa-circle"
                 class="bigger inline" >
            </div>
            <div data-type="symbol"
                 data-device="MuellterminDummy"
                 data-get="BlaueTonne"
                 data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
                 data-on-colors='["green","green"]'
                 data-get-on='["0","2"]'
                 data-background-icon="fa-circle"
                 class="bigger inline" >
            </div>
            <div data-type="symbol"
                 data-device="MuellterminDummy"
                 data-get="Restmuell"
                 data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
                 data-on-colors='["black","black"]'
                 data-get-on='["0","2"]'
                 data-background-icon="fa-circle"
                 class="bigger inline" >
            </div>
          </li>
  42. Hallo Peter, die Definition sieht erst einmal gut aus. Damit alles funktioniert solltest du nun in FHEM einen Dummy „MuellterinDummy“ definiert haben. Dieser Dummy sollte als Readings die Einträge „BioTonne“, „GelbeTonne“ usw. haben (evtl. irgendwann mal save vergessen?). Schau nochmal, ob es evtl. an der Groß-/Kleinschreibung liegt.

  43. Hi Jürgen, der Dummy „MuellterminDummy“ ist in FHEM, allerdings bekommt er bei „STATE“ nur „???“. Die Readings des Dummies haben die Einträge:
    setreading MuellterminDummy BlaueTonne $dayDiff
    setreading MuellterminDummy GelbeTonne $dayDiff
    setreading MuellterminDummy Restmuell $dayDiff
    setreading MuellterminDummy BioTonne $dayDiff
    Insofern sollte ich doch eigentlich alles richtig benannt haben, oder? Ich finde einfach den Fehler nicht…

    Hast Du noch ne Idee?

    Viele Grüße, Peter

  44. Peter, ich hoffe nicht, dass wirklich die oben angegebenen Texte in den Readings auftauchen. Dann scheint nämlich in der Funktion für die Ermittlung der Abfalltermine irgendwas schief gelaufen zu sein. Eventuell irgendwelche Kopierfehler.

    Die Readings von dem MuellterminDummy sollten „BlaueTonne“, „GelbeTonne“ usw. heißen. Als Wert müsste dann die Anzahl der Tage bis zur nächsten Abfuhr erscheinen. Im STATE sind die ??? in Ordnung, da kein Statuswert verändert wurde. Vergleich nochmal deine Funktion mit der im Text. Eine kleine Änderung gibt es hier auf Grund des neuen Kalendermoduls aber das sollte eigentlich keine großen Auswirkungen haben.

  45. Hallo Jürgen, ich habe vor ca. 3 Wochen erfolgreich deinen Abfallkalender in der Tablet UI umgesetzt. Für Deine Anleitung herzlichen Dank.

    Nun zum Problem: Ich habe ein Update bei FHEM gemacht, bei dem auf der völlig neu programmierte Calender installiert wurde [Version vom 06.02.2016]. Irgendetwas hat sich anscheinend nun geändert.
    Änderungen im Kalender werden nicht mehr gelesen und die Push Nachricht gestern Abend blieb auch aus.

    Könntest Du Dir das evt. mal ansehen und ggf. ein Update Deines Tutorials posten.

    Vielen lieben Dank vorab.

    Lieben Gruß, Uwe

  46. Ich kämpfe aktuell mit dem gleichen Problem und habe mittlerweile eine erste Idee, wie ich das Thema mit dem neuen Calendar-Modul lösen könnte. Vielleicht finde ich heute Abend noch Zeit, meine Ideen in konkrete Funktionen zu packen ;-).

  47. So, ich habe eben mal die Funktion „Abfalltermine“ im Text geändert. Weiterhin sollte noch das notify wie beschrieben angepasst werden und die Änderungen, die ich gestern beschrieben habe, bitte auch berücksichtigen (Funktion: Kalenderdatum).

    Ich hoffe damit funktioniert wieder alles, wie gewohnt.

  48. Hallo zusammen,
    ich habe die Neuerungen vom 09.02.2016 übernommen und bekomme folgende Fehlermeldungen:

    2016.02.10 09:04:53 1: PERL WARNING: Subroutine myUtils_Initialize redefined at ./FHEM/99_myUtils.pm line 15.
    2016.02.10 09:04:53 1: PERL WARNING: Subroutine KalenderDatum redefined at ./FHEM/99_myUtils.pm line 27.
    2016.02.10 09:04:53 1: PERL WARNING: Subroutine Abfalltermine redefined at ./FHEM/99_myUtils.pm line 44.
    2016.02.10 09:04:53 1: PERL WARNING: Scalar value @SuchTexte[…] better written as $SuchTexte[…] at ./FHEM/99_myUtils.pm line 51.
    2016.02.10 09:04:53 1: PERL WARNING: Scalar value @uids[0] better written as $uids[0] at ./FHEM/99_myUtils.pm line 52.
    2016.02.10 09:04:53 1: PERL WARNING: Scalar value @Tonnen[…] better written as $Tonnen[…] at ./FHEM/99_myUtils.pm line 54.
    2016.02.10 09:04:53 1: PERL WARNING: Subroutine Abfalltermine redefined at ./FHEM/99_myUtils.pm line 64.
    2016.02.10 09:05:02 1: PERL WARNING: Use of uninitialized value $Kalendertext in pattern match (m//) at ./FHEM/99_myUtils.pm line 88.
    2016.02.10 09:05:02 1: PERL WARNING: Use of uninitialized value $Kalendertext in pattern match (m//) at ./FHEM/99_myUtils.pm line 98.
    2016.02.10 09:05:02 1: PERL WARNING: Use of uninitialized value $Kalendertext in pattern match (m//) at ./FHEM/99_myUtils.pm line 108.

    Ich bekomme auch keine Readings im Dummy :/

    Hat jemand eine Idee woran das liegen kann? / gleiche Probleme wie ich?

  49. Da scheint wohl bei der Übernahme des Codes etwas schief gelaufen zu sein. Die Variable „Kalendertext“ gibt es in der neuen Funktion gar nicht mehr. Bei den anderen Warnungen ist es wohl richtig besser $Array[0] als @Array[0] zu verwenden, sollte aber eigentlich keine Probleme bereiten. Bei der Funktion habe ich aber vergessen, den Übergabeparameter zu entfernen. Der wird jetzt nicht mehr benötigt (passe ich gleich an).

  50. Okay, habe alles soweit übernommen. Meine Readings in „Abfall“ sehen so aus:
    14550922001muellmaxde;14550922002muellmaxde;14550922003muellmaxde;14550922004muellmaxde
    Kann es vielleicht daran liegen, dass keine Readings beim Dummy gesetzt werden?

  51. Hallo zusammen,
    es klappt nun bei mir!

    Zum Kommentar von Stefan:
    use Time::Local ; fehlte in der myUtils!
    Dann FHEM einmal updaten und schon klappt es wunderbar!
    Vielen Dank! Schönes Script!

  52. Bei mir geht leider gar nichts mehr…

    Der Calendar scheint schon nicht richtig zu laufen. Wenn ich „get Abfall find BioTonne“ manuell eingebe kommt nur eine ellenlanger kryptischer Buchstabensalat als Antwort – wobei es den Eintrag BioTonne bei mir Kalender natürlich gibt – kann das mal jemand gegenchecken, ob ich zumindest auf der richtigen Fährte bin ?
    Bei mir kommen keine Readings und dementsprechend werden von der myUtils auch keine Readings in den dummy reingeschrieben.

  53. Bei dem Befehl „find“ solltest du alle IDs für die gefundenen Termine bekommen, die mittels Semikolon voneinander getrennt sind. Kopierst du dir eine ID und führst den Befehl „get Abfall text uid=“ aus, dann solltest due Datum und Text des Termins erhalten.

    Wenn es eine Terminserie ist, dann sollte der Befehl alle Termine der Serie anzeigen.

    Was mir jetzt gerade beim Schreiben einfällt ist die Frage, was Perl BEfehl „split“ macht, wenn nur ein Ausdruck vorhanden ist und der String eigentlich nicht aufgeteit wird. Ich hoffe doch, dass dann einfach der vorhandene String zurück gegeben wird und nicht etwa ein leerer Text. Leider bin ich nicht wirklich ein Perl Profi. Das müsste ich mal testen um diesen Fehler auszuschließen.

    Ach ja, ein aktuelles Update mit „shutdown restart“ von FHEM hast du ja wahrscheinlich ausgeführt 😉

  54. Beim READING modeEnd habe ich folgendes stehen:
    7kdk6qh9hjd6172ramg9h3tl3cgooglecom;jbu8bnln7v9ekcn2npfjor9cmggooglecom;csm8k8ae88i08g3fk3s6s4gam8googlecom;0fr01ne4lr3fu7vvrvfug2uovogooglecom;96rtpld2ro21r3adhp2ldnqad4googlecom;naegkdk4hu05cs4du8b174bko0googlecom;aebgtbacm9ph2l7ki16qo75i4cgooglecom;q5a5t3pai2l706g0ulo5q71u50googlecom;jciaulf3spugkslgqd650pd01ogooglecom;u3qstts4nc120tl74jo0l90ifggooglecom;jkpcbteqttrqcp3on4ivpb2md0googlecom;n6l9q334hp1dj7q3s09u9vkmnogooglecom;nj8sf8miu1vrrlj8qd5bo942pkgooglecom;mivs6d16qoaqta8ftcchc4r2ucgooglecom;5i0jgem2imvf032cu6vvm5i0p4googlecom;bc361lr24fgikh7g7q2t68d66ogooglecom;qrldbtghvcpahu8gnss1t1fkrsgooglecom;i040g9q6039mqv1830a9qkn04sgooglecom;2drctlamotnnhf9dq4jq1opug8googlecom

    Suche ich nun mit find nach z.B. GelbeTonne so werden durch die Semikolons geteilte Fragmente davon angezeigt. Dass heisst für mich das der Fehler schon vorher beim Calendar liegen sollte…

    PS: Update incl shutdown restart habe ich selbstverständlich schon mehrmals durchgeführt.

  55. ModeEnd sind alle vergangenen Termine aus deinem Kalender. Die sollten eigentlich uninteressant sein. Außerdem sollten diese eigentlich mittels Attribut „hideOlderThan“ ausgeschaltet werden. Ich habe z.B. „attr Abfall hideOlderThan 2d“ eingestellt, so dass nur noch Termine geliefert werden, die nicht älter als 2 Tage sind.

    Hast du mal versucht mit „Log3 undef, 3, “ in der Funktion Abfalltermine die einzelnen Variablen ins Logfile zu schreiben. Die Funktion kann man ja einfach mit {Abfalltermine()} aus der FHEM Kommandozeile aufrufen.

  56. Habe jetzt bereits den Rechner aus. Ich habe eben probeweise noch folgendes gemacht:
    Neuen Kalender Test angelegt. hideOlderThan 2d gesetzt – wie auch beim produktiv Kalender. 1 Termin eingetragen. Und es erscheint bei modeUpcoming ein so ein kryptischer Eintrag.
    Ich sehe gerade: beim Produktiv Kalender ist ebenfalls modeUpcoming mit mehreren Einträgen vorhanden.

    Sind diese komischen Einträge denn richtig? Stehen meine Kalendereinträge nicht in Klarschrift ? Wie wird denn daraus dann das Reading im Dummy erzeugt? Habe ich einen Denkfehler? Danke für eine Aufklärung.

  57. Diese Kryptischen Werte sind richtig. Das sind nur die IDs für die Termine. Mit find werden diese IDs geliefert und in meiner Funktion nutze ich dann die erste ID, um das Startdatum zu ermitteln. Dann wird die Differenz zwischen heute und dem Startdatum berechnet.

  58. so.. bin jetzt 1,5 Schritte weiter…

    a) bei den notify hast Du stehen „triggerd“ – es müsste aber heissen „triggered“ !
    Das notify wird nun bei mir ausgeführt.
    b) wenn ich „{Abfalltermine()} “ in die Komandozeile eingebe kommt die Fehlermedlung „Month ‚-1‘ out of range 0..11 at ./FHEM/99_myUtils.pm line 26“ .
    Zeile 26 ist bei mir die Zeile in der Du timelocal gebrauchst – es macht bei mir keinen Unterschied ob ich am Anfang der5 myUtils ein „use Time::Local;“ setze oder nicht.

    Evt. kannst Du damit etwas anfangen?

    Gruß Uwe

  59. So, ich habe jetzt die beiden Funktionen „KalenderDatum“ und „Abfalltermine“ angepasst. Die neue Calendar Funktion verstehe ich noch nicht so ganz und hoffe nun, dass damit die richtigen Termine gefunden werden. „hideOlderThan“ wird dann eigentlich nicht mehr benötigt.

    Danke an Uwe für den Hinweis zum Schreibfehler bei „triggered“. Das Problem mit dem „Time::Local“ kann ich noch nicht nachvollziehen, da ich in meiner Umgebung (raspberry) hierzu auch keine Angaben in der myutils gemacht habe. Vielleicht muß irgendeine Library installiert sein?

  60. Hi Jürgen,
    wir kommen der Sache näher…

    In Zeile 50 ist die letzte „}“ zuviel.
    Dank Deiner Änderung werden bei mir jetzt endlich im Dummy die Readings erzeugt.

    Mein letztes Problem ist rein kosmetischer Natur:
    In meinem Kalender steht z.B. „GelbeTonne“,“BioTonne“, etc.
    Die Suchtexte kommen sowohl mit den Großbuchstaben in der Wortmitte als auch mit einem Leerzeichen „Gelbe Tonne“ nicht parat.
    Auch scheint der Suchstring .* nicht richtig zu funktionieren wennn ich nur nach Bio suche und ich Biotonne eingegeben habe.

    Evt. findest Du dafür auch noch eine Lösung !?

    Bis hierher schon einmal herzlichen Dank für Deinen Einsatz und Deine Mühe.

    Lieben Gruß
    Uwe

  61. UPDATE: Ich habe mir jetzt bei den Kalendereinträgen mit einem „_“ als Trenner beholfen – sieht für mich gut aus und funktioniert.

  62. Danke für den Hinweis mit der Klammer. Bei den Suchtexten habe ich gerade nochmal in der FHEM Oberfläche direkt im Kalenderdevice ein wenig herum probiert. Die regulären Ausdrücke „.*“ können anscheinend entfallen. Wenn man nach „Wertstoff“ sucht, sollte auch „Wertstofftonne“ gefunden werden. Groß- und Kleinschreibung muß man allerdings beachten. Wenn du also den Begriff „GelbeTonne“ finden willst, dann kannst du entweder nach „Gelbe“ suchen oder mußt exakt „GelbeTonne“ als Suchstring eingeben. Falls man sich nicht sicher ist könnte man auch nach „[Gg]elbe[Tt]onne] suchen. Dann werden alle Varianten gefunden. Mit Leerzeichen gibt es anscheinen echt Probleme. Wenn man nach „Gelbe Tonne“ suchen will dann geht das nur mit „Gelbe.*Tonne“ bzw. „[Gg]elbe.*[Tt]onne“.

  63. Hier eine für mich funktionierende Konfiguration (Bio kommt bei mir nicht in die Tonne 😉 ). Wichtig ist, dass man das hideOlderThan-Attribut nicht verwendet, diese Einträge werden trotzdem gelesen, aber als Ergebnis ist die Leerung dann heute. Dies kann man auch im Programm abfangen, genauso könnte man dass ganze sicher auch noch aufräumen, aber bei mir funzt es jetzt mal:

    sub
    Abfalltermine()
    {
    my @t=localtime();
    my $year = ($t[5]+1900);
    my $heute = timelocal(0,0,1,$t[3],$t[4],$year);

    my @Tonnen = („GrueneTonneFlach“, „GrueneTonneRund“, „Restmuell“);
    my @SuchTexte = („.*flach.*“, „.*rund.*“, „Restmuell.*“);
    my $uid;
    my $eventDate;
    my $prevdayDiff=365;
    my $count=1;

    for(my $i=0; $i $heute) {
    my $dayDiff = floor(($eventDate – $heute) / 60 / 60 / 24 + 1);
    if ($dayDiff < $prevdayDiff) {
    $prevdayDiff = $dayDiff;
    }
    }

    }
    fhem("setreading MuellterminDummy $Tonnen[$i] $prevdayDiff");
    $prevdayDiff=365;
    }
    }

  64. Vielen Dank für das Codebeispiel. Ich fürchte nur, dass hier noch etwas fehlt. Die Suche im Kalender mit „find“ ist nicht im Code und auch die Ermittlung des Startdatums fehlt. evenDate wird ja nirgends gefüllt und müsste daher eine Warnung erzeugen. Eventuell ist beim Kopieren etwas schief gelaufen. Am besten fügt man den Code mittel eingeklammert durch [ code ] hier den Code einfügen [ \code ] ein (allerdings ohne Leerzeichen).

  65. Hallo Jürgen,

    vielen Dank für das Teilen deiner Ideen, wirklich gelungene Umsetzung. Ich habe es auch gestern bei mir in ähnlicher Form umgesetzt, allerdings bin ich nun auf ein kleines Problem gestoßen. Papier, Gelber Sack und Restabfall funktionieren einwandfrei, bei der Biotonne nimmt er allerdings nicht das richtige Datum. Statt des 26.02 berechnet er die Diff zum 26.03 (im Kalender eingetragen sind 26.02, 11.03, 26.03, 08.04 usw.). Hast du eine Idee, woran das liegen könnte? Kenne mich mit PERL leider kaum aus 🙁

    Viele Dank und viele Grüße,
    Basti

  66. ist wohl echt beim kopieren verloren gegangen:

    sub
    Abfalltermine()
    {
    my $time = time;
    my @t=localtime();
    my $year = ($t[5]+1900);
    my $heute = timelocal(0,0,1,$t[3],$t[4],$year);
    my @Tonnen= („GrueneTonneFlach“, „GrueneTonneRund“, „Restmuell“);
    my @SuchTexte= („.flach.“, „.rund.“, „Restmuell.*“);
    my $uid;
    my $eventDate;
    my $prevdayDiff=365;

    for(my $i=0; $i<3; $i++)
    {
    my @uids= split(/;/,fhem("get Abfall find $SuchTexte[$i]"));

    foreach $uid (@uids)
    {
    $eventDate = KalenderDatum('Abfall', $uid);
    if ($eventDate > $heute) {
    my $dayDiff = floor(($eventDate – $heute) / 60 / 60 / 24 + 1);
    if ($dayDiff < $prevdayDiff) { $prevdayDiff = $dayDiff; } } } fhem("setreading MuellterminDummy $Tonnen[$i] $prevdayDiff"); $prevdayDiff=365; } } [\code]

  67. Danke für deine Anpassung. Ich hätte das alleine nicht Geschaft.

  68. Um dem Problem ein wenig näher zu kommen solltest du mal folgende Anweisungen direkt im FHEM Device deines Abfallkalenders ausprobieren:

    get find „Bio“

    Damit sollten 1 oder mehrere IDs in einem Popup erscheinen. Die erste ID kopieren und dann

    get text ausführen.

    Hier sollte dann hoffentlich dein erstes Datum erscheinen. Die Frage wäre weiterhin, ob du deine Termine als Serie eingegeben hast und ob der 26.2. evtl. ein Termin außerhalb der Serie ist. Denn anscheinend wird einmal der Müll am Freitag und einmal am Samstag abgeholt. Es könnte sein, dass die erste ID die Serie zurück liefert und die zweite ID den „Sondertermin“ 26.2. Wenn das der Fall ist, funktioniert meine Funktion tatsächlich noch nicht richtig und ich müsste mir mal überlegen, wie man diese Spezialfälle – die im Jahr immer wieder mal auftauchen – lösen kann.

    Am besten wäre ein einzelner Serientermin mit entsprechenden Ausnahmen. Die neue Calendar-Funktion soll angeblich damit umgehen können. Ich hatte mit solchen Serienterminen zum Jahreswechsel ziemliche Probleme und den Kalender bei mir von Hand angepasst. Mit der neuen Calendar Funktion und der vom Betreiber bereitgestellten Serientermine habe ich es aber auch noch nicht wieder getestet.

  69. Danke Jürgen.

    Du hast Recht mit deiner Vermutung: Ich bekomme 4 IDs.
    Die erste ID liefert den Termin, der nicht in die Reihe passt (26.03).
    Die zweite ID liefert die Serie vor dem außerplanmäßigen Termin.
    Die dritte ID liefert die Serie nach dem außerplanmäßigen Termin.
    Die vierte ID liefert AUCH die Serie vor dem außerplanmäßigen Termin.

  70. Wie befürchtet und ziemlich blöd. Also müsste der Code dahin gehend geändert werden, dass man aus allen IDs das nächst liegende Datum heraus sucht. Warum du allerdings 4 verschiedene Termine hast, kann ich nicht ganz nachvollziehen. Ich schau mal, ob mir auf die Schnelle etwas einfällt.

  71. Das ging jetzt schneller, als gedacht. Ich konnte die Funktion jetzt nicht wirklich testen. Aber versuch mal folgende Funktion:

    sub
    Abfalltermine()
    {
       my $t  = time;
       my @Tonnen = ("GrueneTonne", "GelbeTonne", "Restmuell", "BioTonne");
       my @SuchTexte = (".*Papier.*", ".*Wertstoff.*", ".*Restmüll.*", ".*Bio.*");
       my $uid;
       my $eventDate = "";
     
       for(my $i=0; $i<4; $i++)
       {
          my @uids = split(/;/,fhem("get Abfall find $SuchTexte[$i]"));
          
          #den nächsten Termin aus allen uids finden
          foreach $uid (@uids)
          {
             my $nextDate = KalenderDatum('Abfall', $uid);
             if ($eventDate eq "" || ($eventDate > $nextDate && $nextDate > $t))
             {
                $eventDate = $nextDate;
             }
          }
    
          my $dayDiff = floor(($eventDate - $t) / 60 / 60 / 24 + 1);
          fhem("setreading MuellterminDummy $Tonnen[$i] $dayDiff");
       }
    }
    
  72. Danke für Dein Bemühen. Funktioniert leider nicht, nun bekomme ich für alle 4 den gleichen und sogar negativen Wert „-16843“.

  73. Sorry, das kommt davon, wenn man Code nicht testet. Ich habe gerade gesehen, dass ich in dem „if“ statt einem Vergleich eine Zuweisung programmiert habe. Ich habe es jetzt mal in den Vergleich „eq“ geändert. Also aus dem $eventDate = „“ ein $eventDate eq machen. Ich hoffe, dass nicht noch mehr bugs enthalten sind.

  74. Nachdem mich das neue Kalendermodul ein wenig in den Wahnsinn treibt und Fehler, die ich bei mir suche manchmal wohl auch im Calendar-Modul liegen habe ich nochmals einen neuen Code geschrieben. Das Calendar Modul hat mit dem heutigen Update anscheinend auch noch ein paar Bugs eliminiert.

    Der folgende Code sollte nun eigentlich immer funktionieren. Egal in welcher Reihenfolge die Kalendertermine ermittelt werden. Also auch wenn erst ein Serientermin gefunden wird und dann ein Sondertermin, der vor dem ersten Serientermin liegt. Es wird jetzt immer der „wirklich“ nächste Termin gefunden.

    Es wäre super, wenn ihr den Code nochmals testen könnt (insbesondere Basti) bevor ich ihn oben im Artikel anpasse.

    [UPDATE 16.02.16]Bugs behoben- Siehe Kommentar „BUG behoben“ im Code[UPDATE]

    #
    # Hilfsfunktion für Kalenderauswertungen
    #
    
    sub
    KalenderDatum($$)
    {
       my ($KalenderName, $KalenderUid) = @_;
       my $dt = fhem("get $KalenderName start uid=$KalenderUid 1");
       my $ret = time - 86400;  #falls kein Datum ermittelt wird Rückgabewert auf "gestern" -> also vergangener Termin
    
       if ($dt and $dt ne "")
       {
          my @SplitDt = split(/ /,$dt);
          my @SplitDate = split(/\./,$SplitDt[0]);
          $ret = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
       }
    
       return $ret;
    }
    
    
    #
    # Abfall Kalender auswerten / Google Kalender: "Abfall"
    #
    
    sub
    Abfalltermine()
    {
       my $t  = time;
       my @Tonnen = ("GrueneTonne", "GelbeTonne", "Restmuell", "BioTonne");
       my @SuchTexte = (".*Papier.*", ".*Wertstoff.*", ".*Restmüll.*", ".*Bio.*");
       my $uid;
       my $dayDiff;
     
       for(my $i=0; $i<4; $i++)
       {
          $dayDiff = -1; #BUG behoben
          my @uids = split(/;/,fhem("get Abfall find $SuchTexte[$i]"));
          
          #den nächsten Termin aus allen uids finden
          foreach $uid (@uids)
          {
             my $eventDate = KalenderDatum('Abfall', $uid);
             my $dayDiffNeu = floor(($eventDate - $t) / 60 / 60 / 24 + 1);
             if ($dayDiffNeu > 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1))  #BUG behoben
             {
                $dayDiff = $dayDiffNeu;
             }
          }
    
          fhem("setreading MuellterminDummy $Tonnen[$i] $dayDiff");
       }
    }
    
    
  75. Hi Jürgen. Beide Überarbeitungen funktionieren für meinen Fall leider nicht, kann aber auch an mir liegen, aber ich erkläre mal…
    Habe mir die Funktionen nun ein wenig näher angesehen. Das bisherige Vorgehen, wenn ich es richtig verstanden habe, nimmt aus den IDs jeweils den ersten Eintrag („… start … 1“). Bei mir sieht der Inhalt der dritten ID (auch heute noch) so aus: (12.02.16, 26.02.16, …). Dort liest der Code nur den 12.02 und t als aktueller Zeitstempel filtert den Eintrag bzw. die ID dann raus, obwohl der korrekte Eintrag an zweiter Stelle stand. Ist es korrekt, dass der 12.02 bei mir noch ankommt? Wäre der Eintrag nicht vorhanden, würde der 26.02 auch gefunden werden!
    Ich habe für mich den Code jetzt so angepasst, dass nicht nur der erste Eintrag sondern alle Einträge in den IDs durchlaufen werden und dann der jeweils nächste Termin herausgesucht wird und nun funktioniert es. Weiß aber nicht, wie sicher das Vorgehen bei anderen Kalender-Konfigurationen ist?

    Grüße, Basti

  76. Zur Info. Habe noch einen Bug gefunden.

  77. Hallo Jürgen,
    ersteinmal vielen Dank das Du Dir die Mühe machst und das „Projekt“ hier weiter aktualisierst. Ich habe Deine Funktionen mal übernommen. Allerdings gibt es bei mir folgendes Problem: Der letzte Suchtext (in meiner Konstellation .*Bio.*) wird nicht gefunden. Anstatt den Differenzwert des .*Bio.* Termins wird als Ergebnis in den MuellterminDummy das Ergebnis aus der vorherigen Suchfunktion (bei mir .*Restaball.*) in den MuellterminDummy (Bioabfall) geschrieben. Habe dann mal den Suchbegriff .*Bio.* durch .*garnichts.* ersetzt. Auch dann wurde der Wert aus der .*Restabfall.* Suche in den MuellterminDummy (Bioabfall) geschrieben

    Wenn ich allerdings die Begriffe der Arrays (*Restmüll.*“, „.*Bio.*) in der Funktion vertausche, also erst wird nach .*Bio.* gesucht und dann nach *Restabfall.*, dann funktioniert es soweit ich das sehe bis dato. Vielleicht hilft es Dir ja weiter!
    Grüße Detlef

  78. Damit meine letzte Funktion hier in den Kommentaren funktioniert, muß man auf jeden Fall im Kalender „HiderOlderThan“ auf z.B. 60 setzen. Damit werden alle vergangenen Termine auch innerhalb einer Serie, die älter als 60 Sekunden sind nicht mehr angezeigt. Damit sollte auch das Durchlaufen der Termine innerhalb einer Serie nicht notwendig sein.

    @Detlef: Dein Problem kann ich leider noch nicht nachvollziehen. Ich gehe aber davon aus, dass der Fehler durch eine andere Konstellation entstanden ist und nicht an der Reihenfolge der Suchtexte liegt.

  79. Hallo Jürgen,

    auch meinerseits vielen Dank für die Mühe.
    Ich verfolge seit Tagen die Neuerungen. Allerdings kommt bei mir immer folgende Fehlermeldung

    notAbfalltermine return value: Undefined subroutine &main::timelocal called at ./FHEM/99_myUtils.pm line 81.

    Dabei handelt es sich um diese Zeile in myUtils:
    $ret = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);

    In der Fhem.cfg habe ich folgendes erfasst:
    define Abfall Calendar ical url https://calendar.google.com/xxx/basic.ics 21600
    attr Abfall hideOlderThan 2d
    attr Abfall room Informationen

    define notAbfalltermine notify Abfall:triggered { Abfalltermine() }

    define MuellterminDummy dummy
    attr MuellterminDummy room Informationen

    Ich komme da nicht weiter – dachte immer, dass es evtl. an den aktuellen Problemen liegt – zweifle aber langsam daran 😉

    Gruß
    Alex

  80. Wohl wahr, so macht alles einen Sinn. Kann man statt des Aktualisierungsintervalls auch eine Zeit definieren, wie bspw. Aktualisierung des Kalenders um 0 Uhr?

  81. Bei der Kalenderdefinition kann man nur ein Intervall angeben. Ich glaube, dass dieses Intervall sich immer nach dem letzten durchgeführten Update auf dem Kalender berechnet. Wenn man also das Intervall auf einen Tag stellt und man den Kalender einmal um 00:00 Uhr von Hand updated, dann könnte es funktionieren ;-). Ist natürlich nicht wirklich die beste Lösung. Mittels at Modul könntest du aber immer ein update zur gewünschten Zeit durchführen.

  82. Das Problem mit timelocal wurde hier – glaube ich – auch schon mal erwähnt. Ich kann das leider nicht nachvollziehen, da es in meiner Umgebung ohne zusätzliche Angaben funktioniert.

    Versuche mal in myutils99 am Anfang folgende Zeile einzufügen:

    use Time::Local;

  83. Hallo Jürgen,

    das hat funktioniert – Super Tipp!
    Ganz herzlichen Dank.

    Gruß
    Alex

  84. Hallo Jürgen

    meine Perlkenntnisse sind leider sehr beschränkt aber wenn ich deinen Code richtig lese. dann erwartest du, dass die Termine in chronologischer Reihenfolge in dem Kalender stehen (in dem @uids). Das ist bei mir leider nicht so. Kannst du mir nen Code Schnippel vorschlagen? $eventdate > $t && min($eventdate-$t)

    Gruß Ulf

  85. Hallo Jürgen

    entschuldige – aber wer lesen kann ist klar im Vorteil.

    Ich ziehe meine Frage zurück. Der letze Code hier in den Comments hat es ja schon drin.

    Die my $eventDate; Deklaration war dir aber abhanden gekommen.

    Bei mir funktionierts !

    Danke für die Gute Idee.

    Gruß Ulf

    Danke.

  86. Hallo unter Fhem läuft alles richtig, doch die Anzeige unter table-ui ist nur beim firefox richtig. Habe es auch mit verschiedenen Browser auf dem Hnady probiert und auch hie,r geht es nur beim firefox. Leider bin ich hier auch kein html, java Fachmann, um zu sagen woran das wieder liegt.
    Danke!

  87. Hallo,

    vielen Dank für die Anleitung, die Umsetzung hat prima funktioniert.

  88. Hallo Jürgen,

    ich habe deine „gefixte“ Version der 99myUtils.pm übernommen und auch die FHEM-cfg.

    Leider füllt sich mein Dummy nicht mit Daten.

    Wenn ich in FHEM den Befehl get Abfall full all anstoße bekomme ich alle Termine meines Google-Kalenders angezeigt. Das Notify macht auch seine Aktualisierungen.

    Wieso bekommt das Dummy die Termine nicht mit ??

    Gruß

  89. Ohne deinen genauen Code zu kennen, kann ich leider nicht feststellen, wo das Problem liegen könnte. Da der Code bei anderen Usern funktioniert, gehe ich mal von einen möglichen Kopierfehler oder ähnliches aus.

  90. Auf Anhieb habe ich leider keine Idee, wie dein Problem behoben werden könnte. Ich nutze meist Chrome und da funktioniert alles einwandfrei. Sind die Browser auf dem neuesten Stand? Und was wird denn angezeigt – gar nichts oder irgend etwas anderes?

  91. Hallo,

    vielen Dank für dieses Beispiel!
    nachdem ich jetzt ewig hin und her probiert habe, denke ich, dass ich einen Fehler gefunden habe. In meinem Abfallkalender gibt es dummer Weise folgende UIDs:

    12345 (Restmüll)
    123451 (Gelber Sack)
    123455 (was auch immer)
    123454

    Wenn ich mit
    fhem(„get $KalenderName start uid=$KalenderUid 1“)
    die UID 12345 suche, werden alle oben angegebenen UIDs zurück gegeben. Der nächste Termin muss dabei nicht unbedingt UID=12345 sein. Dadurch gibt bei mir diese Routine falsche Termine zurück. War nicht einfach, das festzustellen, da nicht alle falsch sind 😉
    Ist das ein bug oder ein feature? Mit welches regex kann ich die UID-Abfrage auf die Anzahl der Stellen der UID, nach der ich suche, begrenzen (in dem Fall 5 Stellen)?
    Was ich nicht verstehe: Warum werden die einzelnen Kategorien bei mir vermischt? Bin leider kein Programmier-Experte…

    Gruß Michael

  92. Hallo Jürgen,

    auch ich versuche mich gerade an der Implementierung. Irgendwie schein ich aber die Variablen falsch zu setzen (vermute ich zumindest).

    Im device Abfall finde ich folgendes:

    modeEnd 20160301GraueTonnegdabfallkalender;20160301GelbeTonnegdabfallkalender
    	
    modeEnded
    
    modeStart
    	
    modeStarted
    	
    modeUpcoming 20161125BrauneTonnegdabfallkalender;20160510GelbeTonnegdabfallkalender;
    
    

    in der 99_myUtils.pm habe ich die ‚Suche‘ wie folgt angepasst:

    
    my $t  = time;
       my @Tonnen = ("BlaueTonne", "GelbeTonne", "GraueTonne", "BrauneTonne");
       my @SuchTexte = (".*BlaueTonne.*", ".*GelbeTonne.*", ".*GraueTonne.*", ".*BrauneTonne.*");
       my $uid;
       my $eventDate;
    
    

    Den Rest habe ich per paste & copy übernommen.

    mit “ get Abfall full all“ werden mir alle künftigen Termine angezeigt.

    Das notify und den dummy kann ich ja nicht auslesen, oder? Ein get wird von fhem abgelehnt.

    In der index.html habe ich (exemplarisch) folgendes stehen:

    
        <div data-type="symbol"
            data-device="MuellterminDummy"
            data-get="BrauneTonne"
            data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
            data-on-colors='["SaddleBrown","SaddleBrown"]'
            data-get-on='["0","2"]'
            data-background-icon="fa-circle"
            class="bigger inline" >
        </div>
    
    

    Angezeigt wird mir aber nur ein circle und darin die Zahl “ -16862 „.

    Hast du evtl. eine Idee was da falsch ist? Ich kopier dir auch gerne noch Daten hoch und hol dir einen Kaffee 🙂

    Schon mal danke !!!!

    Gruß, Hendrik

  93. Hallo Jürgen

    Ich hätte einen Fehler gefunden der nicht sicher berücksichtig das es mehrere unterschiedliche uid’s für die gleiche Tonne gibt also mit gleichem Namen.

    Termin 1: alle 14 Tage, Name Bio
    Termin 2: im Sommer auch an den anderen Wochen alle 14 Tage, Name Bio

    Hatte zur folge das der spätere Termin den nächsten überschrieben hat somit
    währe die Bio Tonne erst in 96 Tagen fällig und nicht in 7 Tagen.

    Ich hätte dazu sogar einen fix gemacht.

    Kann ich dir das zukommen lassen?

    Markus

  94. Ich nehme an, dass du nicht den Google Kalender nutzt, sondern eine eigene Kalenderdatei angelegt hast. Die IDs kenne ich in dieser Form nicht. Der oben genannte Aufruf erwartet eigentlich eine konkrete KalenderID und liefert bezogen auf diese ID den nächsten Start-Termin zurück. Daher kann es eigentlich nicht sein, dass alle deine UIDs zurück geliefert werden. Sorry, aber ich kann noch nicht ganz nachvollziehen, wie deine Umgebung funktioniert und wo das Problem liegen könnte.

  95. Nutzt du den Google Kalender? Was mich irritiert, ist die Anzeige der Datumsangaben bei ModeUpcoming und ModeEnd. Hier würde ich normalerweise die IDs für die entsprechenden Termine erwarten.

    Ach so, hast du den letzten Code der Funktionen hier aus den Kommentaren genommen?

  96. Hallo Markus, gerne kannst du mir den Code per Mail zusenden. Allerdings sollte mein Code das schon entsprechend berücksichtigen (jedenfalls die letzte Anpassung, die ich hier zunächst in den Kommentaren hinterlegt habe). Ich habe auch solche „Mehrfach UIDs“ für die Bio-Tonne und bei mir funktioniert die Ermittlung des nächsten Termins.

  97. Hallo Jürgen

    Hier meine Version von Abfalltermine mit 2 änderungen vielleicht
    interessiert es dich.

    sub
    Abfalltermine()
    {
    my $t = time;
    my @Tonnen = („Bio“,“Restmüll“);
    my @SuchTexte = („.*Bio.*“, „.*Restmüll.*“);
    my $uid;
    my $eventDate;
    my $uidevent;

    # scalar gibt die anzahl der Elemente im Array zurück
    # ändert man die anzahl der SuchTexte braucht man hier nichts ändern.
    for(my $i=0; $i < scalar(@SuchTexte); $i++)
    {
    my @uids = split(/;/,fhem("get Abfall find $SuchTexte[$i]"));
    my @uidevent;
    # beendete Termine überspringen
    foreach $uid (@uids)
    {
    $eventDate = KalenderDatum('Abfall', $uid);
    push @uidevent,$eventDate;
    }
    $eventDate = min @uidevent; # min benötigt "use List::Util qw(min max);"
    # gibt den kleinsten Zeitwert zurück bei mehreren
    # Events mit gleichem Namen aber unterschiedlicher uid.
    my $dayDiff = floor(($eventDate – $t) / 60 / 60 / 24 + 1);

    fhem("setreading MuellterminDummy $Tonnen[$i] $dayDiff");
    }
    }

    Markus

  98. Hallo Jürgen,

    ich habe mir die ICS Dateien mal angeschaut:

    Auszug aus dem Kalender meines Entsorgungsunternehmens (ICS-Datei)

    [Code]
    BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//gd/Abfallkalender//DE
    NAME:Abfallkalender 2016
    METHOD:PUBLISH
    BEGIN:VEVENT
    UID:20160303BlaueTonne-gd-abfallkalender
    DTSTART;VALUE=DATE:20160303
    DTEND;VALUE=DATE:20160304
    DTSTAMP:20160301T080000Z
    COLOR:65:105:225
    SUMMARY:
    Blaue Tonne
    DESCRIPTION:
    Die Blaue Tonne wird an diesem Tag abgeholt.
    END:VEVENT
    [/Code]

    Auszug aus dem Kalender (ICS-Datei) bei Google

    [Code]
    BEGIN:VCALENDAR
    PRODID:-//Google Inc//Google Calendar 70.9054//EN
    VERSION:2.0
    CALSCALE:GREGORIAN
    METHOD:PUBLISH
    X-WR-CALNAME:Abfuhr
    X-WR-TIMEZONE:Europe/Berlin
    X-WR-CALDESC:
    BEGIN:VEVENT
    DTSTART;VALUE=DATE:20160304
    DTEND;VALUE=DATE:20160305
    DTSTAMP:20160303T085007Z
    UID:20160304BrauneTonne-gd-abfallkalender
    CREATED:20160301T080000Z
    DESCRIPTION:Die Braune Tonne wird an diesem Tag abgeholt.
    LAST-MODIFIED:20160303T084746Z
    LOCATION:
    SEQUENCE:0
    STATUS:CONFIRMED
    SUMMARY:Braune Tonne
    TRANSP:OPAQUE
    END:VEVENT
    [/Code]

    Die UID wird von google anscheinend übernommen.

    In dem notify notAbfalltermine bekomme ich (mit list) folgende Ausgaben:

    Internals: 
       DEF        ical url https://calendar.google.com/calendar/ical/XXXXXXXXXXXXXXXXXXXXXXXXXXXXgroup.calendar.google.com/private-50dceb5f7967177c4dbfeadf0b1d547c/basic.ics 21600 
       NAME       Abfall 
       NR         67 
       NTFY_ORDER 50-Abfall 
       STATE      triggered 
       TYPE       Calendar 
       Readings: 
         2016-03-03 09:48:34   lastUpdate      2016-03-03 09:48:33 
         2016-03-03 09:00:19   modeAlarm 
         2016-03-03 09:48:26   modeAlarmOrStart 20160303BlaueTonnegdabfallkalender 
         2016-03-03 09:00:19   modeAlarmed 
         2016-03-03 09:00:19   modeChanged 
         2016-03-03 09:48:34   modeEnd         20160301GraueTonnegdabfallkalender;20160301GelbeTonnegdabfallkalender 
         2016-03-03 09:00:19   modeEnded 
         2016-03-03 09:48:26   modeStart       20160303BlaueTonnegdabfallkalender 
         2016-03-03 09:00:19   modeStarted 
         2016-03-03 09:48:34   modeUpcoming    20160304BrauneTonnegdabfallkalender;20160902BrauneTonnegdabfallkalender;20160705GraueTonnegdabfallkalender;usw .... Auflistung aller Termine ...
         2016-03-03 09:48:34   nextUpdate      2016-03-03 15:48:33 
         2016-03-03 09:48:34   nextWakeup      2016-03-03 15:48:33 
         2016-03-03 09:48:34   state           triggered 
    Attributes: 
       hideOlderThan 2d 
    

    Hier auch noch mal die 99_myUtils.pm, nur zur Sicherheit, das ich nichts falsch kopiert bzw. übersehen habe.

    ## Hilfsfunktion für Kalenderauswertungen
     
    sub
    KalenderDatum($$)
    {
       my ($KalenderName, $KalenderUid) = @_;
       my $dt = fhem("get $KalenderName start uid=$KalenderUid 1");
       my $ret = time - 86400;  #falls kein Datum ermittelt wird Rückgabewert auf "gestern" -> also vergangener Termin
     
       if ($dt and $dt ne "")
       {
          my @SplitDt = split(/ /,$dt);
          my @SplitDate = split(/\./,$SplitDt[0]);
          $ret = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
       }
     
       return $ret;
    }
    
    ## Abfall Kalender auswerten / Google Kalender: "Abfall"
     
    sub
    Abfalltermine()
    {
       my $t  = time;
       my @Tonnen = ("GraueTonne", "GelbeTonne", "BrauneTonne", "BlaueTonne");
       my @SuchTexte = (".GraueTonne.*", ".*GelbeTonne.*", ".*BrauneTonne.*", ".*BlaueTonne.*");
       my $uid;
       my $dayDiff;
      
       for(my $i=0; $i<4; $i++)
       {
          $dayDiff = -1; #BUG behoben
          my @uids = split(/;/,fhem("get Abfall find $SuchTexte[$i]"));
           
          #den nächsten Termin aus allen uids finden
          foreach $uid (@uids)
          {
             my $eventDate = KalenderDatum('Abfall', $uid);
             my $dayDiffNeu = floor(($eventDate - $t) / 60 / 60 / 24 + 1);
             if ($dayDiffNeu > 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1))  #BUG behoben
             {
                $dayDiff = $dayDiffNeu;
             }
          }
     
          fhem("setreading MuellterminDummy $Tonnen[$i] $dayDiff");
       }
    }
    
    

    Angezeigt werden mir im UI vier circle und jeweils -1.

    Ich kapier einfach nicht mehr was da falsch sein soll.
    Nebenbei, kann man den dummy Wert eigentlich irgendwie auslesen? Dann könnte man mal schauen, was da überhaupt geschrieben wird.

    Ich hoffe du hast eine Idee, würde das zuuuu gerne umsetzen.

    DANKE !

    Gruß, Hendrik

  99. ach ja, noch was vergessen. Ich teste das alles auf einem separaten jungfräulichen System mit einer Standardinstallation.

    Sind evtl. noch irgendwelche Pakete zu installieren neben der Standardinstallation? Tablet-UI ist klar 😉

    Gruß
    Hendrik

  100. Auf Anhieb ist mir jetzt erstmal kein Fehler aufgefallen. Am besten baust du mal ein paar Log-Aufrufe ein und rufst die Funktion über FHEM von Hand auf. Hierzu einfach {Abfalltermine()} in die Kommandozeile eingeben und dann im Logfile nachschauen.

    Ein Punkt ist mir dann aber doch noch aufgefallen. Beim Kalender muss man – anders als ich das am Anfang auch gemacht habe – am besten alle Termine ausschalten, die älter sind als ein paar Sekunden. Also statt „HideOlderThan 2d“ z.B. „HideOlderThan 10“. Denn ansonsten werden 2 Tage lang noch die vergangenen Termine gefunden und dadurch können dann die negativen Werte entstehen.

    Und nun noch ein Beispiel für den Einsatz der Log-Aufrufe in der Funktion:

    sub
    Abfalltermine()
    {
       my $t  = time;
       my @Tonnen = ("GrueneTonne", "GelbeTonne", "Restmuell", "BioTonne");
       my @SuchTexte = (".*Papier.*", ".*Wertstoff.*", ".*Restmüll.*", ".*Bio.*");
       my $uid;
       my $dayDiff;
     
       for(my $i=0; $i<4; $i++)
       {
          $dayDiff = -1; #BUG behoben
          my @uids = split(/;/,fhem("get Abfall find $SuchTexte[$i]"));
          
          #den nächsten Termin aus allen uids finden
          foreach $uid (@uids)
          {
    
    Log3 undef, 3, "Abfalltermine UID:".$uid;
    
             my $eventDate = KalenderDatum('Abfall', $uid);
             my $dayDiffNeu = floor(($eventDate - $t) / 60 / 60 / 24 + 1);
    
    Log3 undef, 3, "Abfalltermine eventDate:".$eventDate." dayDiffNeu:".$dayDiffNeu;
    
             if ($dayDiffNeu > 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1))  #BUG behoben
             {
                $dayDiff = $dayDiffNeu;
             }
          }
    
    Log3 undef, 3, "Abfalltermine setreading:".$Tonnen[$i].":".$dayDiff;
    
          fhem("setreading MuellterminDummy $Tonnen[$i] $dayDiff");
       }
    }
    
  101. Vielen Dank Markus für die Optimierungen des Codes. So lerne ich auch nochmal ein paar mehr Perl-Features 😉

  102. Hallo Jürgen,

    ich habe es immer noch nicht hinbekommen.

    Das macht aber nichts, denn es gibt inzwischen wohl auch ein ‚offizielles‘ Modul für Abfall.

    Siehe hier: http://forum.fhem.de/index.php/topic,48237.0.html

    Das macht die Sache nun ganz easy:

    define MuellKalender Calendar ical url https://calendar.google.com/calendar/ical/xxxxxxxxxxxxxxxxxxxxgvlp5o%40group.calendar.google.com/private-50dceb5f7967177c4dbfeadf0b1d547c/basic.ics 21600
    
    define myAbfall ABFALL MuellKalender 86400
    

    Schon sind die readings gefüllt. Trotzdem danke für deine bisherige Arbeit !

    Gruß
    Hendrik

  103. Hallo und Vielen Dank dafür!
    ich möchte auch etwas beitragen, mein Fehler war das der Kalender nicht heruntergeladen werden konnte!
    versucht mal „ipkg install wget-ssl“ – dannach hats bei mir sofort geklappt.

    Gruß
    Josef

  104. PS: ich habe den gleichen Fehler wie schon genannt:
    wenn ich „{Abfalltermine()} “ in die Komandozeile eingebe kommt die Fehlermedlung
    Month ‚-1‘ out of range 0..11 at /usr/local/FHEM/share/fhem/FHEM/99_myUtils.pm line 33
    Die Zeile 33 ist bei mir die Zeile in der Du timelocal gebrauchst – es macht bei mir keinen Unterschied ob ich am Anfang der myUtils ein „use Time::Local;“ setze oder nicht.

    Hat vielleicht jemand eine Lösung dafür? sonst funzt meine Benachrichtigung nicht, DANKE!

    Josef

  105. Hallo Jürgen,

    vielen Dank für den Kalender. Alles funktioniert bestens, allerdings wird beim Abfalltag die Tonne mit -1 angezeigt und dreht sich nicht mehr. Woran liegt es, bzw. was habe nicht beachtet? Danke für die Rückmeldung.

    Gruß
    Sergej

  106. Hallo.
    Bei mir werden die Dummy Werte mal mit 24 Tagen angezeigt oder auch gerne kurze Zeit später mit über 244 Tage. Beide Daten sind falsch.

    Die Tonnen werden bereits im T-UI angezeigt. Jedoch mal mit Tagen (irgendwelche Zahlen) oder mit einem Ausrufezeichen.

    Eine Idee? Gerne auch vie Teamviewer 🙂

    Anpassung nur an dieser 99er Datei:
    sub
    Abfalltermine()
    {
    my $t = time;
    my @Tonnen = („GrueneTonne“, „GelbeTonne“, „Restmuell“, „BioTonne“);
    my @SuchTexte = („.*Papier.*“, „.*Gelbe.*“, „.*Restmüll.*“, „.*Bio.*“);
    my $uid;
    my $eventDate;

  107. Okay. Läuft. Habe die verschiedensten Beispiele aus den Kommentaren genommen.

    
    use Time::Local;
    
    #
    # Hilfsfunktion für Kalenderauswertungen
    #
     
    #
    # Hilfsfunktion für Kalenderauswertungen
    #
     
    sub
    KalenderDatum($$)
    {
       my ($KalenderName, $KalenderUid) = @_;
       my $dt = fhem("get $KalenderName start uid=$KalenderUid 1");
       my $ret = time - 86400;  #falls kein Datum ermittelt wird Rückgabewert auf "gestern" -> also vergangener Termin
     
       if ($dt and $dt ne "")
       {
          my @SplitDt = split(/ /,$dt);
          my @SplitDate = split(/\./,$SplitDt[0]);
          $ret = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
       }
     
       return $ret;
    }
    
    sub
    Abfalltermine()
    {
       my $t  = time;
       my @Tonnen = ("GrueneTonne", "GelbeTonne", "Restmuell", "BioTonne");
       my @SuchTexte = (".*Papier.*", ".*Gelb.*", ".*Restmüll.*", ".*Bio.*");
       my $uid;
       my $dayDiff;
      
       for(my $i=0; $i<4; $i++)
       {
          $dayDiff = -1; #BUG behoben
          my @uids = split(/;/,fhem("get Abfall find $SuchTexte[$i]"));
           
          #den nächsten Termin aus allen uids finden
          foreach $uid (@uids)
          {
     
    Log3 undef, 3, "Abfalltermine UID:".$uid;
     
             my $eventDate = KalenderDatum('Abfall', $uid);
             my $dayDiffNeu = floor(($eventDate - $t) / 60 / 60 / 24 + 1);
     
    Log3 undef, 3, "Abfalltermine eventDate:".$eventDate." dayDiffNeu:".$dayDiffNeu;
     
             if ($dayDiffNeu > 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1))  #BUG behoben
             {
                $dayDiff = $dayDiffNeu;
             }
          }
     
    Log3 undef, 3, "Abfalltermine setreading:".$Tonnen[$i].":".$dayDiff;
     
          fhem("setreading MuellterminDummy $Tonnen[$i] $dayDiff");
       }
    }
    
  108. Da ich bei mir neulich alles neu aufsetzen musste, habe ich auch noch ein paar Probleme mit der Funktion festgestellt. Eventuell liegt es daran, dass bei dem Kalender das Attribut „hideLongerThan“ nicht gesetzt ist. Einfach mal auf „10“ setzen. Damit sollten alle Termine, die älter als 10 Sekunden sind, nicht mehr angezeigt werden.

  109. Auf Anhieb kann ich nicht sagen, woran das liegt. Ich muß die Funktionen aber auch nochmal prüfen, da ich neulich ein paar seltsame Zustände hatte.

  110. Stefan Manteuffel

    Hallo Jürgen,

    danke für die gute Anleitung. Leider habe ich ein Problem und komme dem nicht auf die Schliche 🙂

    Von unserem Abfallentsorger kann man sich eine ics Datei laden und diese in Google Importieren.
    Wenn ich diese aber nun abrufe, erhalte ich folgende uid 20151228T125650CET4301XoBgXxwwwbsrde.
    Die kann aber von der KalenderDatum Routine nicht verarbeitet werden.
    Somit wird immer :
    Abfalltermine eventDate:1458742868.36747
    dayDiffNeu:1
    Abfalltermine setreading:Restmuell:1
    zurückgegeben.

  111. Die UID sollte für die Kalenderroutine eigentlich kein Problem darstellen. Ich würde das Problem eher an einer anderen Stelle vermuten, kann dies aber ohne weitere Infos nicht nachvollziehen. Da ich nun wieder aus dem Urlaub zurück bin muß ich mir den Code auch nochmal ansehen und ggf. vorhandene Bugs entfernen. Neulich hatte ich auch noch ein paar seltsame Zustände. Sobald ich weitere Erkenntnisse habe, gibt es natürlich ein entsprechendes Update.

  112. Ich glaube das ursprüngliche Skript von Jürgen hat leider das Problem, dass die Termine im Prinzip nach Datum sortiert sein müssen. Das Skript von Andree in den Kommentaren passt soweit.

    Da mit Andree’s Skript aber über alle Termine in der Zukunft iteriert wird, schlage ich vor das man dem Kalender auch sagt, dass alle Termine, die mehr als 60 Tage in der Zukunft liegen ignoriert werden (das sollte für Abfalltermine mehr als ausreichend sein :-)).

    attr Abfall hideLaterThan 60d

    Abschließend noch ein Punkt, hinter den ich nicht gekommen bin:
    $ret = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);

    Warum setzt ihr $SplitDate[1]-1? Also warum das „-1“?

  113. Hier noch eine kleine Ergänzung. Durch das Notify ist es natürlich so, dass die Termine nur dann aktualisiert werden, wenn auch der Kalender aktualisiert wird. Dies ist weiter oben so aufgebaut, dass dies alle 6 Stunden passiert. Da meine Abfallgesellschaft die Termine einmal zu Beginn des Jahres festlegt, habe ich die iCal Einbindung über ein fest abgelegtes File vorgenommen, bei dem die Aktualisierung keinen Sinn macht. Insofern lasse ich mir die Tage bis zur nächsten Leerung nun über ein at berechnen, also immer nachts um 2 Uhr.

    define AbfalltermineErneuern at *02:00:00 { Abfalltermine() }

  114. Das mit dem -1 ist mir auch neulich aufgefallen, ohne dass ich es verstanden habe. Einen Teil des Codes hatte mal von einem anderen Beispiel aus der Community übernommen. Aktuell bin ich damit beschäftigt, meine Funktion nochmal zu prüfen und evtl. vorhandene Fehler zu beheben.

  115. Ich hab auch mal weitergeforschte und meine 99_myUtils_Abfall.pm abgeändert, wie oben geschieben.
    my $ret = time – 86400;
    Es wurde wie auch unten im Log zu sehen kein Datum ermittelt ? Das nächste Datum findet er erst am 03.8.2016
    obwohl ein Termin am 31.3. eingeteragen ist.
    Mit dem neuen Modul ABFALL werden dann auch zwei Einträge am 31.3. angezeigt.

    Merkwürdig ist auch, das obwohl hideOlderThan auf 1d gesetzt ist. Alte Termine geholt werden.
    Hier mal das Log :

    2016.03.25 17:08:33 3: get Abfall find .*PapierTonne.* : toipsc88d79egrcgt9olf6msdkgooglecom
    2016.03.25 17:08:33 3: Abfalltermine UID:toipsc88d79egrcgt9olf6msdkgooglecom
    2016.03.25 17:08:33 3: get Abfall start uid=toipsc88d79egrcgt9olf6msdkgooglecom 1 : 05.04.2016 00:00:00
    2016.03.25 17:08:33 3: KalenderName dt=05.04.2016 00:00:00:05.04.2016 00:00:00
    2016.03.25 17:08:33 3: KalenderName ret1458835713.42416
    2016.03.25 17:08:33 3: Abfalltermine SplitDt[0]:05.04.2016
    2016.03.25 17:08:33 3: Abfalltermine SplitDt[1]:00:00:00
    2016.03.25 17:08:33 1: PERL WARNING: Use of uninitialized value $SplitDt[2] in concatenation (.) or string at ./FHEM/99_myUtils_Abfall.pm line 36.
    2016.03.25 17:08:33 3: Abfalltermine SplitDt[2]:
    2016.03.25 17:08:33 3: Abfalltermine eventDate:1459807200
    2016.03.25 17:08:33 3: dayDiffNeu:11
    2016.03.25 17:08:33 3: Abfalltermine setreading:BlaueTonne:11
    2016.03.25 17:08:33 3: get Abfall find .*GelbeTonne.* : baubqr91slp1igqnqv5tkbv9asgooglecom
    2016.03.25 17:08:33 3: Abfalltermine UID:baubqr91slp1igqnqv5tkbv9asgooglecom
    2016.03.25 17:08:33 3: get Abfall start uid=baubqr91slp1igqnqv5tkbv9asgooglecom 1 : 31.03.2016 00:00:00
    2016.03.25 17:08:33 3: KalenderName dt=31.03.2016 00:00:00:31.03.2016 00:00:00
    2016.03.25 17:08:33 3: KalenderName ret1458835713.45949
    2016.03.25 17:08:33 3: Abfalltermine SplitDt[0]:31.03.2016
    2016.03.25 17:08:33 3: Abfalltermine SplitDt[1]:00:00:00
    2016.03.25 17:08:33 3: Abfalltermine SplitDt[2]:
    2016.03.25 17:08:33 3: Abfalltermine eventDate:1459375200
    2016.03.25 17:08:33 3: dayDiffNeu:6
    2016.03.25 17:08:33 3: Abfalltermine setreading:GelbeTonne:6
    2016.03.25 17:08:33 3: get Abfall find .*Hausm.* : 20151228T125650CET4301XoBgXxwwwbsrde;20151228T130738CET44946HV9Twwwwbsrde;20151228T125650CET4007wnH9z9wwwbsrde;20151228T130913CET52982SfnNJwwwbsrde;20151228T125650CET4149Vpul69wwwbsrde;20160107T150126CET6687DvTAWewwwbsrde;20151228T125650CET4248i4MHU5wwwbsrde;20151228T130922CET5955jUDjdvwwwbsrde;20160107T150126CET656591XVU4wwwbsrde;20151228T125650CET41841oTL6Uwwwbsrde;20160107T150126CET6835ho4MTJwwwbsrde;20151228T125650CET4130uv4uojwwwbsrde;20160107T150126CET6704xJA1SDwwwbsrde;20151228T130913CET5271DD8Hrawwwbsrde;20160107T150126CET6652nVN8Mrwwwbsrde;20160107T150126CET6800JUDTw9wwwbsrde;20151228T125650CET3973geFhrVwwwbsrde;20151228T125650CET4111WvrAP0wwwbsrde;20160107T150126CET67655UaaVBwwwbsrde;8iklajpm94mb80r4qm1q15flj4googlecom;20151228T125650CET4203zuE7Wkwwwbsrde;20151228T125650CET4058hUrbGKwwwbsrde;20160107T150126CET6726pGFN57wwwbsrde;20151228T125650CET4265iv8N8nwwwbsrde;20151228T125650CET39169uOVB6wwwbsrde;20151228T125650CET3954FkARv8wwwbsrde;20151228T130738CET4455R5Ul8Dwwwbsrde;20151228T125650CET4093G1G4iawwwbsrde;20151228T125650CET4231tCoLf5wwwbsrde;20151228T125650CET4166JUgcUVwwwbsrde;20160107T150126CET6635xWxEDgwwwbsrde;20151228T125650CET4284Aua5Lmwwwbsrde;20151228T125650CET3934cVkhBJwwwbsrde;20160107T150126CET6852K6Nkiowwwbsrde;20160107T150126CET65824220pJwwwbsrde;20160107T150126CET6869zL31xNwwwbsrde;20151228T125650CET4075fIVZBHwwwbsrde;20151228T125650CET4041dLNDF5wwwbsrde;20160107T150126CET6617CbukxVwwwbsrde;20151228T130922CET5937Uo0DiSwwwbsrde;20160107T150126CET66001GE98kwwwbsrde;20160107T150126CET6749T1c2Cewwwbsrde;hl3t1okhmqeekskhvdod3ggf4cgooglecom;20160107T150126CET6548CPJuUlwwwbsrde;2983vrd4fga64m92dtga7gpg4cgooglecom;20151228T125650CET3990U7KJXowwwbsrde;20151228T125650CET4024Hi4Ooawwwbsrde;20160107T150126CET6669BGwnakwwwbsrde;20160107T150126CET67834djwcBwwwbsrde;20160107T150126CET6818vpuxNhwwwbsrde
    2016.03.25 17:08:33 3: Abfalltermine UID:20151228T125650CET4301XoBgXxwwwbsrde
    2016.03.25 17:08:33 1: PERL WARNING: Use of uninitialized value $dt in concatenation (.) or string at ./FHEM/99_myUtils_Abfall.pm line 26.
    2016.03.25 17:08:33 3: KalenderName dt=:
    2016.03.25 17:08:33 3: KalenderName ret1458835713.50093
    2016.03.25 17:08:33 3: Abfalltermine UID:20151228T130738CET44946HV9Twwwwbsrde
    2016.03.25 17:08:33 3: KalenderName dt=:
    2016.03.25 17:08:33 3: KalenderName ret1458835713.51113
    2016.03.25 17:08:33 3: Abfalltermine UID:20151228T125650CET4007wnH9z9wwwbsrde
    2016.03.25 17:08:33 3: KalenderName dt=:
    2016.03.25 17:08:33 3: KalenderName ret1458835713.52081
    2016.03.25 17:08:33 3: Abfalltermine UID:20151228T130913CET52982SfnNJwwwbsrde
    2016.03.25 17:08:33 3: KalenderName dt=:
    2016.03.25 17:08:33 3: KalenderName ret1458835713.53048
    2016.03.25 17:08:33 3: Abfalltermine UID:20151228T125650CET4149Vpul69wwwbsrde
    2016.03.25 17:08:33 3: KalenderName dt=:
    2016.03.25 17:08:33 3: KalenderName ret1458835713.54016
    2016.03.25 17:08:33 3: Abfalltermine UID:20160107T150126CET6687DvTAWewwwbsrde
    2016.03.25 17:08:33 3: get Abfall start uid=20160107T150126CET6687DvTAWewwwbsrde 1 : 03.08.2016 00:00:00
    2016.03.25 17:08:33 3: KalenderName dt=03.08.2016 00:00:00:03.08.2016 00:00:00
    2016.03.25 17:08:33 3: KalenderName ret1458835713.55091
    2016.03.25 17:08:33 3: Abfalltermine SplitDt[0]:03.08.2016
    2016.03.25 17:08:33 3: Abfalltermine SplitDt[1]:00:00:00
    2016.03.25 17:08:33 3: Abfalltermine SplitDt[2]:
    2016.03.25 17:08:33 3: Abfalltermine eventDate:1470175200
    2016.03.25 17:08:33 3: dayDiffNeu:131
    2016.03.25 17:08:33 3: Abfalltermine setreading:Restmuell:131

  116. Hat mir keine Ruhe gelassen 😉 und ich habe (für mich) eine Lösung gefunden.

    Es gibt ja das neue Abfall Modul. Diese anlegen :

    define myAbfall ABFALL Abfall 3600

    Nach reload des Kalenders sollten folgende Readings zu sehen sein:
    Abfall_GelbeTonne_datum
    31.03.16
    2016-03-25 20:22:23
    Abfall_GelbeTonne_tage
    6
    2016-03-25 20:22:23
    Abfall_GelbeTonne_text
    GelbeTonne
    2016-03-25 20:22:23
    Abfall_GelbeTonne_wochentag
    Donnerstag
    2016-03-25 20:22:23
    Abfall_Hausmuell_datum
    31.03.16
    2016-03-25 20:22:23
    Abfall_Hausmuell_tage
    6
    2016-03-25 20:22:23
    Abfall_Hausmuell_text
    Hausmüll
    2016-03-25 20:22:23
    Abfall_Hausmuell_wochentag
    Donnerstag
    2016-03-25 20:22:23
    Abfall_PapierTonne_datum
    05.04.16
    2016-03-25 20:22:23

    Jetzt muss nur noch der HTML teil Angepasst werden :

    Abfall1

    Das wars. Alles wird, bei mir, wie gewünscht angezeigt.

    Das notify, die dummys können und auch die Sub kann gelöscht werden.

    Ich hoffe ich es funktioniert auch für andere

    Stefan

  117. In meiner Beschreibung oben fehlt die Bio Tonne, die müsst Ihr ergänzen, wenn nötig.

    Falls man die Dummy’s zur Anzeige weiterverwenden möchte. z.B. zur Anzeige im Floorplan.
    Braucht man nur ein notify anlegen, das das Reading von myAbfall auswertet.

    define not_yellow notify myAbfall.Abfall_GelbeTonne_tage.* set GelbeTonneIn $EVTPART1

    Viel Spass

  118. Ich habe noch eine kleine Optimierung zu Andree’s Skript:

    Anstatt
    my $ret = time – 86400;
    my $ret = time – (86400*2);
    verwenden

    und anstatt
    if ($dayDiffNeu > 0 && ($dayDiffNeu = 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1))
    verwenden.

    Was bewirkt das?
    Es sorgt dafür, dass am Tag der Leerung eine "0" bei der entsprechenden Tonne angezeigt wird. Ohne diese Änderung wird am Tag der Leerung schon der nächste Leerungstermin angezeigt.

    Beispiel: Heute ist 26.03.
    Leerung Grüne Tonne: 26.03., 08.04.
    ohne die Änderung: Grüne Tonne 13 Tage
    mit Änderung: Grüne Tonne 0 Tage

    Ist vielleicht eine kleine Philosophiefrage, aber ich denke, dass man am Tag der Leerung noch die Chance hat die Tonne raus zu stellen. Deshalb sollte es imho so angezeigt werden.

  119. Peter Gottschalk

    Moin Moin und Frohe Ostern euch alle , ich habe nun den Abfallkalender hinbekommen und so verändert das er meinen Bedürfnissen entspricht . Das was ich noch nicht hin bekomme ist , wir haben keine Gelbe Tonne , sondern gelbe Säcke , ich würde gerne das Symbol ändern , finde aber nicht raus wo das Symbol herkommt und wie ich es ändern kann.

    Gruß Peter

  120. Freut mich, dass es funktioniert. Für ein Müllsack-Icon eignet sich wahrscheinlich das SVG Icon „fs-bag“, welches bei FHEM verfügbar ist. Hierzu muß in der index.html aber das entsprechende Include für die SVG Icons enthalten sein. Da ich gerade nicht an meine Konfiguration komme, kann ich das Include nicht direkt angeben. In meinen Beispiel-Dateien sollte es aber vorhanden sein.

  121. Hier noch die angepasste html Struktur, zur Anzeige

    Abfall

  122. Vielen Dank für deine guten Tipps und Hinweise Stefan. Beim Kopieren des Codes ist aber wohl ein Fehler passiert. Code-Beispiele solltest du am besten zwischen folgende Bezeichner setzen: [ code ] hier den Code einfügen [ /code ] (allerdings ohne die Leerzeichen bei den eckigen Klammern).

  123. Ich hatte mich schon gewundert, warum das immer gefiltert wird 🙂

     <header><div data-type="label" class="large">Abfall</div></header>
        <div     data-type="symbol"
            data-device="myAbfall"
            data-get="Abfall_GelbeTonne_tage"
            data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
            data-on-colors='["yellow","yellow"]'
            data-get-on='["0","2"]'
            data-background-icon="fa-circle"
            class="bigger inline" >
        </div>
            
        <div     data-type="symbol"
            data-device="myAbfall"
            data-get="Abfall_PapierTonne_tage"
            data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
            data-on-colors='["blue","blue"]'
            data-get-on='["0","2"]'
            data-background-icon="fa-circle"
            class="bigger inline" >
        </div>
    
        <div     data-type="symbol"
            data-device="myAbfall"
            data-get="Abfall_Hausmuell_tage"
            data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
            data-on-colors='["black","black"]'
            data-get-on='["0","2"]'
            data-background-icon="fa-circle"
            class="bigger inline" >
        </div>
     

    und wer möchte kann sich auch noch die Tage anzeigen lassen

            <div
            data-type="label"
            data-device="myAbfall"
            data-get="Abfall_GelbeTonne_wochentag"
            class="inline">
        </div>
            <div
            data-type="label"
            data-device="myAbfall"
            data-get="Abfall_PapierTonne_wochentag"
            class="inline">
        </div>
            <div
            data-type="label"
            data-device="myAbfall"
            data-get="Abfall_Hausmuell_wochentag"
            class=" inline">
        </div>
    
     

    Stefan

  124. Super Sache, gefällt mir sehr gut. Da wir ständig den Abfallkalender in Papierform suchen ist das genau was wir brauchen. Vielen Dank dafür, funktioniert prima.

    Ich habe allerdings einige Änderungen vorgenommen und es für unsere Bedürfnisse angepasst.
    Ich lasse mir zusätzlich noch den Wochentag und das Datum der Leerung anzeigen.
    Außerdem habe ich es noch einen Punkt „Grünbündel“ erweitert.
    [img]http://steinis.com/homematic/tablet_ui/abfallkalender.png[/img]

    Abfalltermine in 99_myUtils.pm:

    sub
    Abfalltermine()
    {
       my $t  = time;
       my @Tonnen = ("BlaueTonne", "GelbeTonne", "GraueTonne", "BrauneTonne", "Gruenbuendel");
       my @nextPickUp = ("BlaueTonne_nextPickUp", "GelbeTonne_nextPickUp", "GraueTonne_nextPickUp", "BrauneTonne_nextPickUp", "Gruenbuendel_nextPickUp");
       my @next_wtag = ("BlaueTonne_nextwtag", "GelbeTonne_nextwtag", "GraueTonne_nextwtag", "BrauneTonne_nextwtag", "Gruenbuendel_nextwtag");
       my @SuchTexte = (".*Blaue.*", ".*Gelb.*", ".*Grau.*", ".*Braun.*", ".*Gruen.*");
       my @wtag = ("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag");
       my $uid;
       my $dayDiff;
      
       for(my $i=0; $i<5; $i++)
       {
          $dayDiff = -1; #BUG behoben
          my @uids = split(/;/,fhem("get Abfall find $SuchTexte[$i]"));
           
          #den nächsten Termin aus allen uids finden
          foreach $uid (@uids)
          {
             my $eventDate = KalenderDatum('Abfall', $uid);
             my $dayDiffNeu = floor(($eventDate - $t) / 60 / 60 / 24 + 1);
             if ($dayDiffNeu > 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1))  #BUG behoben
             {
                $dayDiff = $dayDiffNeu;
             }
          }
     
        my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag) = localtime(time + ($dayDiff * 86400));
        my $mt = ($Monatstag < 10) ? "0".$Monatstag : $Monatstag;
        my $m = ($Monat < 10) ? "0".$Monat : $Monat;
        $Jahr += 1900;
        my $zeit =  $mt . "." . $m . "." . $Jahr;      
    
    
          fhem("setreading MuellterminDummy $Tonnen[$i] $dayDiff");
          fhem("setreading MuellterminDummy $next_wtag[$i] $wtag[$Wochentag]");
          fhem("setreading MuellterminDummy $nextPickUp[$i] $zeit");
       }
    }
    

    HTML Code für Tablet-UI

    <li data-row="3" data-col="1" data-sizex="3" data-sizey="1">
    <header><div data-type="label" class="medium">Abfallkalender</div></header>
    <center>	
    	<table border="0" cellpadding="2" cellspacing="3">
    	<tr><td align="center">
    	<div data-type="symbol"
    	        data-device="MuellterminDummy"
    	        data-get="BrauneTonne"
    	        data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
    	        data-on-colors='["saddlebrown","saddlebrown"]'
    	        data-get-on='["0","2"]'
    	        data-background-icon="fa-circle"
    	        class="big">
    	</div>
    	</td>
    	<td align="center">
    	<div     data-type="symbol"
            	data-device="MuellterminDummy"
    	        data-get="GelbeTonne"
    	        data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
    	        data-on-colors='["yellow","yellow"]'
    	        data-get-on='["0","2"]'
    	        data-background-icon="fa-circle"
    	        class="big " >
    	</div>
    	</td>
    	<td align="center">
    	<div     data-type="symbol"
    	        data-device="MuellterminDummy"
    	        data-get="BlaueTonne"
    	        data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
    	        data-on-colors='["blue","blue"]'
    	        data-get-on='["0","2"]'
    	        data-background-icon="fa-circle"
    	        class="big " >
    	</div>
    	</td>
    	<td align="center">
    	<div     data-type="symbol"
    	        data-device="MuellterminDummy"
    	        data-get="GraueTonne"
    	        data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
    	        data-on-colors='["black","black"]'
    	        data-get-on='["0","2"]'
    	        data-background-icon="fa-circle"
    	        class="big " >
    	</div>
    	</td>
    	<td align="center">
    	<div     data-type="symbol"
    	        data-device="MuellterminDummy"
    	        data-get="Gruenbuendel"
    	        data-icons='["fa-leaf warn fa-spin","fa-leaf warn"]'
    	        data-on-colors='["darkgreen","darkgreen"]'
    	        data-get-on='["0","2"]'
    	        data-background-icon="fa-circle"
    	        class="big " >
    	</div>
    <div style="padding:2px;background-color:#aa6900;color:darkgreen;font-size:11px;font-weight:bold;position:absolute;margin-top:-18px">Grünbündel</div>
    </td>	
    	</tr>
    	<tr>
    	<td align="center">
    	<div  style="font-size:85%; margin-top:-3px" data-type="label"
    	        data-device="MuellterminDummy"
    	        data-get="BrauneTonne_nextwtag"
    	        class="">
    	</div>
    	<div style="font-size:85%; margin-top:-3px" data-type="label"
    	        data-device="MuellterminDummy"
    	        data-get="BrauneTonne_nextPickUp"
    	        class="">
    	</div>
    	</td>
    	<td align="center">
    	<div  style="font-size:85%; margin-top:-3px" data-type="label"
    	        data-device="MuellterminDummy"
    	        data-get="GelbeTonne_nextwtag"
    	        class="">
    	</div>	<div style="font-size:85%; margin-top:-3px" data-type="label"
    	        data-device="MuellterminDummy"
    	        data-get="GelbeTonne_nextPickUp"
    	        class="">
    	</div>
    	</td>
    	<td align="center">
    	<div  style="font-size:85%; margin-top:-3px" data-type="label"
    	        data-device="MuellterminDummy"
    	        data-get="BlaueTonne_nextwtag"
    	        class="">
    	</div>	<div style="font-size:85%; margin-top:-3px" data-type="label"
    	        data-device="MuellterminDummy"
    	        data-get="BlaueTonne_nextPickUp"
    	        class="">
    	</div>
    	</td>
    	<td align="center">
    	<div  style="font-size:85%; margin-top:-3px" data-type="label"
    	        data-device="MuellterminDummy"
    	        data-get="GraueTonne_nextwtag"
    	        class="">
    	</div>	<div style="font-size:85%; margin-top:-3px" data-type="label"
    	        data-device="MuellterminDummy"
    	        data-get="GraueTonne_nextPickUp"
    	        class="">
    	</div>
    	</td>
    	<td align="center">
    	<div  style="font-size:85%; margin-top:-3px" data-type="label"
    	        data-device="MuellterminDummy"
    	        data-get="Gruenbuendel_nextwtag"
    	        class="">
    	</div>	<div style="font-size:85%; margin-top:-3px" data-type="label"
    	        data-device="MuellterminDummy"
    	        data-get="Gruenbuendel_nextPickUp"
    	        class="">
    	</div>
    	</td>
    	</tr>
    	</table>
    </center>
    </li>
    

    Sicherlich kann man das noch alles verfeinern aber so ist es für mich schon akzeptabel und funktioniert prima.

  125. Peter Gottschalk

    Hallo Markus

    ich versuche deine Änderungen bei mir zu übernehmen , weil mir das mit den Wochentagen sehr gut gefällt. Aber leider bekomme ich es nicht hin. Wenn ich deine Daten übernehme werden meine Readings nicht befüllt.

    Wenn ich mir die Logfile anschaue finde ich folgende Fehlermeldung:

    2016.04.11 17:42:14 3: get Abfall find .*Blaue.* : dlq9ve3v3km1ioraiglavmvjss_R20160404googlecom
    2016.04.11 17:42:14 3: notAbfalltermine return value: Undefined subroutine &main::KalenderDatum called at ./FHEM/99_myUtils.pm line 21.

    2016.04.11 17:48:13 3: get Abfall find .*Blaue.* : jbm09f8bbfcl0fr2cvis0ao18kgooglecom;dlq9ve3v3km1ioraiglavmvjss_R20160404googlecom
    2016.04.11 17:48:13 3: notAbfalltermine return value: Undefined subroutine &main::KalenderDatum called at ./FHEM/99_myUtils.pm line 21.

    In line 21 steht :

    my $eventDate = KalenderDatum(‚Abfall‘, $uid);

    Kannst du oder jemand anderes mir erklären was bei mir falsch ist?

    Gruß Peter

  126. Die Fehlermeldung deutet darauf hin, dass die Funktion „KalenderDatum“ in der 99_myUtils.pm nicht oder falsch definiert ist. Die Funktion, wie sie aufgerufen wird, wird jedenfalls nicht gefunden.

  127. Peter Gottschalk

    Hallo Jürgen

    Ich habe die 99_myUtils.pm von Markus komplett so übernommen.

  128. Hallo Peter,

    in der zweiten in deinem Log steht doch woran es liegt.

    Undefined subroutine &main::KalenderDatum

    Dir fehlt die Sub KalenderDatum aus der 99_myUtils.pm

    Einfügen aus dem Beispiel am Anfang der Seite, dann reload 99_myUtils.pm

    Stefan

  129. ja sorry, hatte nur die sub „Abfalltermine“ gepostet da ich auch nur diese geändert habe.
    die sub „KalenderDatum“ muß natürlich noch davor.

    mir ist aber aufgefallen das mit dem Monat etwas nicht stimmt, ich bin jetzt auch nicht so der Perl freak,
    ist eigendlich nur halbwissen und sonst alles was im Netz zu finden ist.
    Also der Monat wird irgendwie falsch berechnet, immer ein Monat zu wenig.
    Ich habe dann einfach vor
    my $month = ($Monat < 10) ? "0".$Monat : $Monat;
    noch
    $Monat += 1; geschrieben.

    jetzt wird der richtige Monat ausgegeben, aber obs so richtig Perl-mässig ist weiß ich nicht.

    PS. Wie kann man hier Bilder anhängen, oder geht das nicht ?

    n

  130. Hallo, ich würde auch gerne am Tag der Leerung noch eine „0“ angezeigt bekommen, so wie
    „Sven am 26. März 2016 at 10:06 geschrieben hat.“
    Zitat:
    „Ich habe noch eine kleine Optimierung zu Andree’s Skript:

    Anstatt
    my $ret = time – 86400;
    my $ret = time – (86400*2);
    verwenden

    und anstatt
    if ($dayDiffNeu > 0 && ($dayDiffNeu = 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1))
    verwenden."
    Zitat Ende

    Leider funktioniert das bei mir nicht da auch in der IF Abfrage eine Klamme-Zu fehlt, ich hab die Klammer-Zu schon überall hingepackt, es funktioniert leider nicht

  131. Peter Gottschalk

    Moin Moin

    erstmal Danke an alle die mir bei meinen letzten Problem weitergeholfen haben ( wie immer befinden sich 90% der Fehler vorm Rechner 🙂 ).
    Ich habe das mit dem Datum hinbekommen, aber wie es so ist hat man das eine gelöst möchte man schon wieder was verändern.
    Ich finde die Beschriftung zwischen den Symbolen und dem Datum gut. ( Grünbündel)
    Ich habe heraus gefunden das folgende Befehlszeile dafür ist :

    Strauchab.

    Füge ich einfach eine weiter Zeile ein , erscheint der Text natürlich unter dem Symbol Grünbündel. Ich habe durch ausprobieren nicht heraus gefunden welcher Befehl dafür ist den Text in die richtige Position zu bringen.

    Grüß Peter

  132. Was meinst du mit richtige Position ? Text links, rechts oder center ?

    direkt unter dem DIV des Symbols folgenden DIV-Container einfügen

    <div style="padding:2px;background-color:#aa6900;color:darkgreen;font-size:11px;font-weight:bold;position:absolute;margin-top:-18px">Grünbündel</div>
    

    Diesen DIV-Container mußt du anpassen, z.B. mit text-align:center; und/oder auch dem DIV eine feste Breite width:120px; und z.B. mit margin-left: -3px; (den Container 3 Pixel nach links verschieben) zuweisen, damit solltest Du den Text in die richtige Position bringen können.

    Viel Erfolg

    Gruß Markus

  133. Ich habe hier alles soweit nachvollziehen können und bekommen bei mir meine vier Tonnen angezeigt, allerdings alle mit Leerung morgen 17.4., mit einer 1 im roten Kreis. Die nächste Leerung im Google-Kalender ist allerdings erst am 19.4. Wo kann hier der Fehler liegen?

  134. Ich würde mal versuchen, mit ein paar Logdef Befehlen die Werte der Variablen beim Ausführen der Funktion ins Logfile zu schreiben. Dann kann man evtl. einen Hinweis finden. Darüber hinaus habe ich im Text die beiden Funktionen auf einen neuen Stand gebracht, die bei mir aktuell funktionieren.

  135. Hallo,

    ich habe mir auf Grundlage unseres Entsorgers eine aktuelle Kalenderdatei ausschließlich mit Serienterminen angelegt, da der Müll immer Mittwochs abgeholt wird. Dadurch bleibt die Datei schön schmal und übersichtlich.

    BEGIN:VCALENDAR
    VERSION:2.0
    PRODID:-//Sabre//Sabre VObject 3.1.2//EN
    CALSCALE:GREGORIAN
    BEGIN:VEVENT
    DTSTART;TZID=Europe/Berlin:20160615T060000
    DTEND;TZID=Europe/Berlin:20160615T100000
    RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=WE
    UID:1
    SUMMARY:Biotonne
    END:VEVENT
    BEGIN:VEVENT
    DTSTART;TZID=Europe/Berlin:20160622T060000
    DTEND;TZID=Europe/Berlin:20160622T100000
    RRULE:FREQ=WEEKLY;INTERVAL=4;BYDAY=WE
    UID:2
    SUMMARY:Gelbe Tonne
    END:VEVENT
    BEGIN:VEVENT
    DTSTART;TZID=Europe/Berlin:20160629T060000
    DTEND;TZID=Europe/Berlin:2010629T100000
    RRULE:FREQ=WEEKLY;INTERVAL=4;BYDAY=WE
    UID:3
    SUMMARY:Papiertonne
    END:VEVENT
    BEGIN:VEVENT
    DTSTART;TZID=Europe/Berlin:20160608T060000
    DTEND;TZID=Europe/Berlin:20160608T100000
    RRULE:FREQ=WEEKLY;INTERVAL=2;BYDAY=WE
    UID:4
    SUMMARY:Restabfall
    END:VEVENT
    END:VCALENDAR

    Wenn ich das so mit deinem script nutze, bleibt bei den „Tagesberechnungen“ – also dayDiff – nach dem Tag der Abholung immer eine -1 im dummy stehen. Nutze ich im Kalender das Attribut hideOlderThan, „wandert“ die -1 zum Termin, der von den vieren am weitesten in der Zukunft liegt!?! Dort, wo vorher die -1 stand, steht dann wieder die korrekte (zukünftige) Tagesdifferenz…

    Wenn ich eine Kalenderdatei mit Einzelterminen nutze, passt alles.

    Vor der Änderung des Calendar-Moduls funktionierte es auch mit der Serientermin-Datei einwandfrei.

    Hast du eine Erklärung dafür?

    Dank und Gruß
    Andreas

  136. Ich komme aktuell leider nicht so gut an meine Umgebung und kann mir meinen finale Berechnungscode leider nicht ansehen. Es scheint aber so, dass evtl. immer der erste Termin einer Serie ermittelt wird. Sobald ich an meinen Rechner komme versuche ich nochmal zu prüfen, wo das Probem liegt. Mit dem Calendar Modul stehe ich allerdings irgendwie auch immer auf Kriegsfuß.

  137. Hallo,

    ich habe es bei mir erfolgreich zum Laufen bekommen.
    Was ich jedoch beim besten Willen nicht verstehen will ist, warum die Tonne sich bei einem Tag vorher dreht.
    data-icons='[„fa-trash warn fa-spin“,“fa-trash warn“]‘
    data-on-colors='[„yellow“,“yellow“]‘
    data-get-on='[„0″,“2“]‘
    Daraus verstehe ich, dass sie bei 0 dreht und bei 2 normal aussieht inkl. Warn Anzeige.
    Und was ist dann mit den anderen Werten? > 2?!
    Es wäre nett, wenn das orange im Kreis auch erst bei Tag 1 und 0 da wäre. Ansonsten würde ein Dezenter Kreis im Hintergrund ausreichen.
    Vielen Dank nochmal für die tollen Tipps hier.
    Steffen

  138. Ich müsste auch nochmal in die Doku schauen aber die Angaben bei data-get-on definieren meines Wissens ein Intervall. Bei den Werten „0“ und „1“ müsste sich das Icon drehen. Alle Werte von 2 und >2 zeigen dann die Darstellung, die in den anderen Arrays an Position 2 sind. Ich habe es jetzt nicht getestet. Aber wenn man bei data-oncolors beim zweiten „yellow“ einen anderen Farbwert angibt, dann müsste das der Wert sein für alle Tage >= 2.

  139. Für mich ist es leider noch immer großer Bahnhof als Anfänger :-// Wollte mal nachhören ob es angedacht ist die Files auf Github aktualisiert werden und ob evtl noch ne „bereinigte“ Config mal hochgeladen wird. Die Oberfläche ist top, die Mülltonnenfunktion mega… nur schaffe ich es mit meinem Knowhow einfach nicht was auf die Beine zu stellen :-/

  140. Da ich aktuell nicht viel Zeit habe, mich mit meines FHEM zu beschäftigen, hat sich an meiner bereit gestellten Konfiguration bisher nicht viel geändert. Eine Umstellung auf github habe ich im Moment nicht vorgesehen. Das Google Drive Laufwerk funktioniert aus meiner Sicht auch ganz gut. Bezüglich einer Einführung zum Tablet UI hoffe ich, dass ich demnächst endlich mit einem ersten Teil starten kann.

  141. Hallo,

    der Abfallkalender läuft hervorragend. Danke dafür.
    Habe nachfolgende „Herausforderung“.

    Bei uns gibt es eine Bio-Zusatzleerung im Sommer. Diese Termine sind im Google Kalender entsprechend mit eigenen Werten eingetragen und werden auch korrekt angezeigt.
    Nun ist die Zusatzleerung seit letzte Woche beendet. Somit findet er im Kalender auch keinen neuen Termin. (Der Kalender 2017 existiert ja noch nicht).

    Wie kann ich das abfangen. Z.B. Wenn nächster Termin > 2 Monate dann zeige nicht den Wert (Resttage) sondern ein „x“ ?
    Danke für die Hilfe

  142. Wenn ich dich richtig verstehe, dann hast du für die Zusatzleerungen ein extra Symbol?! Eigentlich hätte ich erwartet, dass bei der Datumsermittlung der Wert -1 berechnet werden sollte, wenn kein Datum gefunden wurde. Dann sollte in dem entsprechenden Symbol ein !-Zeichen erscheinen. Grundsätzlich kann das Symbol mit der Definition entsprechender Arrays unterschiedlich angezeigt werden.

    Mein Array data-get-on [„0″,“2“] müsste dann z.B. in [„-1″,“0″,“2“] geändert werden. Bei den übrigen Arrays für Icon und Color müssten dann entsprechende Einträge ergänzt werden. Zum Beispiel bei Icon: data-icons='[„fa-trash“, „fa-trash warn fa-spin“,“fa-trash warn“]‘ wenn für -1 nur das Abfallsymbol angezeigt werden soll.

  143. Hallo Jürgen,

    wirklich klasse,
    ich habe es mit dem Modul ABFALL realisiert und für die Darstellung auf TabletUI Deine Darstellung genommen, ist wirklich super gemacht von Dir.

    Viele Deiner Elemente sind meine Vorlagen für meine Oberfläche.

    Z.B. den Anruf verpasst Monitor und Spritpreise.
    Die Spritpreise habe ich aufgebohrt, bei uns werden Diesel und E10 und der Zeitpunkt wann diese Änderdung an MTS-K gesendet wurde angezeigt.

    Vielen Dank
    Rüdiger

  144. Hallo,

    super Sache!

    Hatte leider das Problem, dass für einen Typen nicht das korrekte Datum angezeigt wurde. Ursache war die Zeile:

    my $dt = fhem(„get $KalenderName start uid=$KalenderUid 1“);

    Lt. Beschreibung in der Doku liefert uid= nach alle Termine, deren UIDs durch den regulären Ausdruck beschrieben werden.

    Regulärer Ausdruck? Das führte bei mir dazu, dass nicht nur der Termin 1234, sondern auch 12345 gefunden wurde. Die 1 sorgte dafür, dass es nur ein Ergebnis gab, aber leider das Falsche!

    Die Zeile habe ich jetzt durch folgende ersetzt:

    my $dt = fhem(„get $KalenderName start $KalenderUid 1“);

    Dadurch wird direkt nach der UID gesucht. Lt. Doku: Alle Termine mit der UID.

    Viele Grüße
    Christian

  145. Danke für den Hinweis. Ich schau mir das nochmal an und werde es dann im Text ggf. nochmals anpassen.

  146. Hallo und danke erstmal für die klasse Anleitung. Habe es bereits umsetzen können(zwar erst nach einigen Abenden als absoluter Anfänger) und habe dazu noch 2 Fragen.

    1. Wenn ich jetzt nur 3 oder 5 Mülltonnen habe, was müsste da geändert werden? Geht das einfach oder ist das komplexer?
    2. Ich würde gern per Telegram am Vorabend um 19 Uhr informiert werden das die Tonnen raus sollen. Kann das mit deinem „SprachansageAbfall“ abgeändert werden und brauch ich da noch ein notify?

    Danke
    Gruß Manuel

  147. Die Anzahl der Mülltonnen kann zunächst zentral in der Funktion „Abfalltermine“ angepasst werden. Hier müssen die Variablen „Tonnen“ und „Suchtexte“ entsprechend angepasst werden. In der Schleife muß dann noch die Anzahl der Durchläufe angepasst werden – also $i < "AnzahlTonnen-1". Für die Anzeige müssen dann die symbol-Widgets natürlich noch angepasst werden. Für eine Nachricht über Telegram kann im Prinzip die Funktion für die Sprachausgabe genutzt werden. Auch hier sind natürlich die ReadingsVal entsprechend der vorhandenen Mülleimer anzupassen und statt des Sonos-Aufruf müsste natürlich der Code für Telegram eingebaut werden. Nun stellt sich eigentlich nur noch die Frage, wann die NAchricht versendet werden soll. Wenn dies z.B. immer dann erfolgen soll, wenn ein Mülleimer am nächsten Tag rauszustellen ist, dann könnte man ein einfaches notify verwenden, welches auf Änderungen vom Dummy MuellterminDummy reagiert. [code]define notAbfallTelegram notify MuellterminDummy:.* {SprachansageAbfall()}[/code] Damit wird zwar bei jeder Änderung die Funktion aufgerufen, sollte aber eigentlich kein Problem darstellen. In der Funktion für die Sprachansage könnte man dann noch genauer abfragen, welche Tonne auf "1" steht und dann den entsprechenden Text anpassen. Die einfachste Variante wäre wohl, statt der Verwendung von "or" im "if" für jede Tonne ein if zu verwendenen und den Text versenden. Oder man speichert die Tonnenbezeichnung in den ifs in einer Variablen und setzt den Text dann zum Schluß zusammen. [code]sub SprachansageAbfall() { my $TonnenText = ""; if(ReadingsVal("MuellterminDummy", "BioTonne", "2") == 1) { $TonnenText = "BioTonne"; } if(ReadingsVal("MuellterminDummy", "GelbeTonne", "2") == 1) { $TonnenText = $TonnenText." GelbeTonne"; } if(ReadingsVal("MuellterminDummy", "GrueneTonne", "2") == 1) { $TonnenText = $TonnenText." GrüneTonne"; } if(ReadingsVal("MuellterminDummy", "Restmuell", "2") == 1) { $TonnenText = $TonnenText." BioTonne"; } fhem("set Sonos_Kueche,Sonos_Bad Speak 45 de Folgende Tonnen müssen rausgestellt werden $TonnenText"); } [/code]

  148. Klasse. Hat soweit erstmal geklappt mit der Tonnenanzahl. Jedoch mit der Telegram Nachricht klappt es noch nicht so recht. Habe den Code soweit auf mich angepasst. == 3 zum testen weil die Tonnen (blau und gelb) am Mittwoch raus müssen.

     sub TelegramAbfall() { my $TonnenText = "";
    if(ReadingsVal("MuellterminDummy", "BlaueTonne", "2") == 3) { $TonnenText = "Blaue und"; }
    if(ReadingsVal("MuellterminDummy", "GelbeTonne", "2") == 3) { $TonnenText = $TonnenText." Gelbe Tonne"; }
    if(ReadingsVal("MuellterminDummy", "Restmuell", "2") == 3) { $TonnenText = $TonnenText." Schwarze Tonne"; }
    fhem("set Telegram msg $TonnenText muss noch raus"); } 

    Das Problem liegt darin, wenn ich ein

     set Abfall update 

    mache, dann bekomme ich jeweils 3 Nachrichten mit dem selben Inhalt (Blaue und Gelbe Tonne muss noch raus). Wenn ich == 1 drin stehen habe bekomme ich auch 3 Nachrichten mit nur „muss noch raus“. Ich habe es jetzt noch nicht lange laufen, aber bekomme ich da bei jeder Änderung 3 Nachrichten? Leider bin ich noch nicht soweit, dass ich es selber verstehe, also brauche ich nochmal deine Hilfe. Also eine Nachricht um 19 Uhr am Vorabend würde reichen. Danke

  149. Da hatte ich mal wieder einen kleinen Bug in meiner Lösung eingebaut. Kommt davon, wenn man Code einfach nur so als Beispiel schreibt und diesen nicht testet ;-). Für die Sprachausgabe bzw. Telegram-Ausgabe muss natürlich auch noch ein if programmiert werden. Sonst wird der Text tatsächlich bei jeder Änderung des Dummies ausgegeben. Also:

    if ($TonnenText ne "") { fhem(set Sonos...); } 

    Zu deiner Abfrage für den „Mittwoch“ noch ein Hinweis. Die Abfrage in den ifs mit ==1 bedeutet, dass es noch ein Tag bis zur Abholung ist. Bei ==3 wären es also noch drei Tage bis zur Abholung. Daher sollte hier „1“ beibehalten werden. Dass die Tonnen an unterschiedlichen Tagen abgeholt werden, sollte eigentlich bereits über den Kalender gesteuert werden.

    Damit nur immer einmal eine Nachricht raus gesendet wird, ist es empfehlenswert bei dem Dummy ein „event-on-change-reading“ für alle Tonnen-Readings zu definieren. Sonst würde bei jeder Aktualisierung des Kalenders ein Ereignis für den Dummy erzeugt werden und man bekommt jedesmal eine Nachricht. Evtl. kann man das aber lassen und es als Erinnerung verstehen. Meist stellt man den Kalender auch so ein, dass er nicht so oft aktualisiert wird.

  150. Hallo,

    vielen Dank für den Abfallkalender!
    Ich habe den bei mir auch jetzt eingebaut, da unser Abfallbetrieb die Termine als downloadbare ics Datei zur Verfügung stellt, mußte ich keinen Googlekalender erstellen und konnte die Datei bei mir lokal ablegen.
    Ich mußte an der ein oder anderen Stelle zwar noch Hand anlegen, aber jetzt läuft es perfekt!

    Ganz großes Kino! 😀

  151. Servus. Ich nochmal. Leider läuft es noch nicht richtig. Bekomme immernoch 3 Nachrichten, aber diesmal unterschiedlich. Einmal steht „Blaue und muss noch raus“ und 2 mal steht „Blaue und Gelbe Tonne muss noch raus“. Habe ich vielleicht noch ein Fehler drin? Hier nochmal so wie ich es jetzt eingefügt habe.

     sub TelegramAbfall() { my $TonnenText = "";
    if(ReadingsVal("MuellterminDummy", "BlaueTonne", "2") == 1) { $TonnenText = "Blaue und"; }
    if(ReadingsVal("MuellterminDummy", "GelbeTonne", "2") == 1) { $TonnenText = $TonnenText." Gelbe Tonne"; }
    if(ReadingsVal("MuellterminDummy", "Restmuell", "2") == 1) { $TonnenText = $TonnenText." Schwarze Tonne"; }
    if ($TonnenText ne "") { fhem("set Telegram msg $TonnenText muss noch raus"); }} 

    Mit den Erinnerungen passt es zumindest. Habe den Intervall auf 12 Stunden, also morgens und abends Erinnerung. Wäre nett, wenn du nochmals drübersehen kannst. Danke

  152. Auf Anhieb kann ich eigentlich keinen Fehler bei der Funktion sehen. Ich bin zwar auch kein Perl-Profi aber der Code ist eigentlich so simpel, dass aus meiner Sicht kein Fehler enthalten sein sollte. Der Text wird immer dann geändert, wenn das entsprechende Reading den Wert 1 hat. Hmm, wenn ich jetzt nochmal genauer überlege, was passiert könnte das Problem beim zeitlichen Ablauf liegen. Die Readings im Dummy werden ja nicht zur gleichen Zeit geändert. Das heißt, wenn zwei Werte geändert wurden, könnte es vielleicht sein, dass die Funktion bei der ersten Änderung schon aufgerufen wird und noch weitere Aufrufe kurz danach folgen. In deinem Fall müsste dann bei Blaue und Gelbe Tonne eine 1 enthalten sein. Da du drei Readings (Tonnen) hast, wird die Funktion dreimal aufgerufen.

    Vieleicht funktionier folgende Erweiterung:

    my $TonnenText="";
    my $zaehler=ReadingsVal("MuellterminDummy","state","0");
    
    if($zaehler == 2)
    {
    hier den bisherige Code einfüge
    
    fhem("set MuellterminDummy 0");
    }
    else
    {
       $zaehler = $zaehler + 1;
       fhem("set MuellterminDummy $zaehler");
    }
    

    Damit das auch fuktioniert am besten einmal den Befehl „set MuellterminDummy 0“ setzen. Nun sollte die Auswertug der Mülltermine nur beim dritte Aufruf erfolgen. Ich hoffe, dass das nun wirklich die Lösung war.

  153. Hallo,
    mal mein Tipp:
    Nimm für jede Tonne einen eigenen Dummy also MuellBlauDummy, MuellGelbDummy und MuellRestDummy.

    Und TonnenText füllst Du nur beim letzten Reading, z.B. bei MuellRestDummy.

    Gruß
    Rüdiger

  154. Ok. Jetzt muss ich passen. Habe den Code dazwischen eingefügt und auch mal anders und wieder anders aber jedes mal bekomme ich beim speichern Fehler angezeigt. Habe es jetzt so

     sub TelegramAbfall() { my $TonnenText = "";
    my $zaehler=ReadingsVal("MuellterminDummy","state","0");
     
    if($zaehler == 2)
    {
    if(ReadingsVal("MuellterminDummy", "BlaueTonne", "2") == 1) { $TonnenText = "Blaue und"; }
    if(ReadingsVal("MuellterminDummy", "GelbeTonne", "2") == 1) { $TonnenText = $TonnenText." Gelbe Tonne"; }
    if(ReadingsVal("MuellterminDummy", "Restmuell", "2") == 1) { $TonnenText = $TonnenText." Schwarze Tonne"; }
    if ($TonnenText ne "") { fhem("set Telegram msg $TonnenText muss noch raus"); }}
    fhem("set MuellterminDummy 0");
    }
    else
    {
       $zaehler = $zaehler + 1;
       fhem("set MuellterminDummy $zaehler");
    } 

    was wahrscheinlich keinen Sinn ergeben wird, aber ich habe keinen Plan :-/

  155. Vielleicht mache ich es doch besser über die Erinnerungsfunktion des Google Kalenders selbst, so wirst du nicht ständig genervt 🙂

  156. In der Zeile mit „set Telegram“ scheint eine geschweifte Klammer zu viel enthalten zu sein. Fehler beim Speichern sind oft irgendwelche fehlerhaften Klammern. Daher könnte das Problem daher kommen. Ansonsten sieht der aktuelle Code so aus, wie ich es mir gedacht hatte.

  157. Hallo. Also der Tipp mit der geschweiften Klammer war wohl richtig. Habe sie gelöscht und am Ende nochmals eingefügt(Zeile 17 dann also) Habe dann wie du oben geschrieben hast „set MuellterminDummy 0“ gemacht. Jetzt steht bei STATE 1 anstatt vorher ???. Ist das richtig? Werde mal abwarten bis die nächsten Toonen dran sind und hoffentlich klappts dann. Vielen Dank schonmal

  158. Hallo und erst mal vielen Dank für diese Funktion.
    Hilft mir sehr, da ich mir bei fhem mit den ganzen readings und dummys noch sehr schwer tue…vom ftui mal ganz abgesehen :).
    Esläuft bei mir soweit, allerdings bekomme ich es nicht gebacken dass für die Mülltonne ‚Rest‘ das Mülltonnenicon angezegt wird.
    Die Anzeige der Tage funktionert, deshalb gehe ich davon aus dass die Daten richtig ausgelesen bzw hinterlegt sind.
    Aber ich sehe wohl den Wald vor lauter Bäumen nicht.

    <div data-type="label" class="fixedlabel">BIOTONNE</div>
               <div data-type="symbol"
               data-device="MuellterminDummy"
               data-get="BioTonne"
               data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
               data-on-colors='["SaddleBrown","SaddleBrown"]'
               data-get-on='["0","2"]'
               data-background-icon="fa-circle" class="bigger inline">
               </div>
               <div data-type="label" class="fixedlabel">GELBER SACK</div>
               <div data-type="symbol"
               data-device="MuellterminDummy"
               data-get="GelbeTonne"
               data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
               data-on-colors='["yellow","yellow"]'
               data-get-on='["0","2"]'
               data-background-icon="fa-circle" class="bigger inline">
               </div>
               <div data-type="label" class="fixedlabel">PAPIERMÜLL</div>
               <div data-type="symbol"
               data-device="MuellterminDummy"
               data-get="GrueneTonne"
               data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
               data-on-colors='["black","black"]'
               data-get-on='["0","2"]'
               data-background-icon="fa-circle" class="bigger inline">
               </div>
             <div data-type="label" class="fixedlabel">RESTMÜLL</div>
             <div data-type="symbol"
             data-device="MuellterminDummy"
             data-get="Rest"
             data-icons='["fa-trash warn fa-spin","fa-trash warn"]'
             data-on-colors='["blue","blue"]'
             data-get-on='["0","2"]'
             data-background-icon="fa-circle" class="bigger inline">
             </div>
    

    Erkennst du vielleicht meinen/einen Fehler?

  159. Ich kann bei dem kopierten Code auch keinen Fehler feststellen. Ich würde nochmal im ganzen Code prüfen, ob die Klammern (<>) alle passen und auch die divs in Ordnung sind. Ich vergesse bei mir auch gerne mal ein schließendes div und suche dann nach unerklärlichen Darstellungsfehlern.

  160. Ich antworte mir mal selbst 😀
    Es war wohl ein Problem mit der Benennung vom Restmüll.
    Vorher hiess es ‚Restmüll‘ dann hab ich es umbenannt in ‚Rest‘ um etwaigen Umlautproblemen aus dem Weg zu gehen.
    Nach ein paar Reloads und 2 Tagen ging es plötzlich.

  161. Hallo Matthias,

    als alter Informatiker geb ich Dir den Tipp niemals ein Umlaut als Bezeichner zu verwenden.
    Nur als Alias, da Problem habe ich aktuell auf einem Kundenrechner,
    dort ist die Codepage für russische Anlagen eingestellt und alles geht schief.

    Also, immer brav keine Umlaute für Variablenbezeichner verwenden….

    Viele Grüße
    Rüdiger

    PS: Die zwei Tage waren vielleicht nötig ob die notyfier richtig zu füllen.

  162. Hallo,

    anbei eine bei mir lauffähige 99_myUtils.pm

    package main;
    use strict;
    use warnings;
    use POSIX;
    use Time::Local;
    sub
    myUtils_Initialize($$)
    {
    my ($hash) = @_;
    }
    ##########################################################

    #
    # Hilfsfunktion für Kalenderauswertungen
    #

    sub
    KalenderDatum($$)
    {
    my ($KalenderName, $KalenderUid) = @_;
    my $dt = fhem(„get $KalenderName start uid=$KalenderUid 1“);
    my $ret = time – (2*86400); #falls kein Datum ermittelt wird Rückgabewert auf „vorgestern“ -> also vergangener Termin;

    if ($dt and $dt ne „“)
    {
    my @SplitDt = split(/ /,$dt);
    my @SplitDate = split(/\./,$SplitDt[0]);
    $ret = timelocal(0,0,0,$SplitDate[0],$SplitDate[1]-1,$SplitDate[2]);
    }

    return $ret;
    }

    #
    # Abfall Kalender auswerten / Google Kalender: „Abfall“
    #

    sub
    Abfalltermine()
    {
    my $t = time;
    my @Tonnen = („BlaueTonne“, „GelbeTonne“, „Restmuell“, „BioTonne“);
    my @SuchTexte = („.*Papier.*“, „.*Gelbe.*“, „.*Restmüll.*“, „.*Bio.*“);
    my $uid;
    my $dayDiff;

    for(my $i=0; $i= 0 && ($dayDiffNeu < $dayDiff || $dayDiff == -1)) #BUG behoben
    {
    $dayDiff = $dayDiffNeu;
    }
    }

    fhem("setreading MuellterminDummy $Tonnen[$i] $dayDiff");
    }
    }

    ####
    1;

    mfg
    its2bit

  163. Hallo,

    tolles und vor allem hilfreichen Modul!
    Bis vor kurzem lief es noch wunderbar bei dir. Doch nach einer (zwangs-) Neuinstallation von FHEM scheint das Notify den Kalender nicht mehr auszuwerten. Gab es in den letzten Tagen ein Update an dem Kalender-Modul, so dass dieser Code nicht mehr funktioniert?

    Viele Grüße,
    Michael

  164. In letzter Zeit hat es meines Wissens kein nennenswertes Update zum Kalender gegeben. Hast du denn auch schon die Termine für 2017 eingetragen? Ist mir nämlich zum Jahreswechsel passiert, dass ich mich gewundert habe, warum die Anzeige nicht mehr funktioniert. Ich importiere die Daten immer mit einer Datei vom örtlichen Entsorger und hatte das für 2017 noch nicht erledigt ;-).

  165. Hi, super Umsetzung, kann ich irgendwie einstellen das er mir nur immer 6 Tage im vorraus die Termine anzeigt?

  166. Mit data-get-on in Verbindung mit data-icons kannst du einstellen, wann was angezeigt werden soll. Aktuell steht in data-get-on „[0,2]“ Hierdurch wird bei den Werten 0 und 1 die erste Definition in data-icons angezeigt (also die mit fa-spin) und mit Werten von 2 und >2 die zweite Definition.

    Damit müsste deine Einstellung mit der Definition
    data-get-on=[„0″,“2″,“6“]
    und
    data-icons='[„fa-trash warn fa-spin“,“fa-trash warn“,“fa-trash“]‘
    umgesetzt werden können. Bei Werten von 6 und >6 wird dann nur die Tonne – ohne warn – angezeigt.

    Ich habe es zwar jetzt nicht getestet, sollte aber eigentlich funktionieren ;-).

  167. Hi,

    ich hab jetzt das ganze eingebaut:

    data-icons='[„fa-trash warn fa-spin“,“fa-trash warn“,“fa-trash“]‘
    data-on-colors='[„SaddleBrown“,“SaddleBrown“,“SaddleBrown“]‘
    data-get-on='[„0″,“2″,“6“]‘

    Ich glaub aber ich hab schon das Problem das bei dem 2 nichts passiert, was soll das warn genau machen? Ich habs mal auf 3 oder 4 gestellt (hab jetzt eine Tonne mit 3 Tagen) aber irgendwie ändert sich da schon nichts.

  168. Die Kennzeichnung „warn“ sorgt dafür, dass der rote Kreis mit der Anzahl Tage angezeigt wird. Solltest du bereits ein FTUI ab Version von einsetzen, dann setzte mal zusätzlich ein „data-warn“. Hier muß angegeben werden, wo der Wert für das Warn-Symbol her kommt. In unserem Fall sollte das das gleiche Device wie bei data-get sein. Ansonsten empfehle ich mal den Blick auf meine Beispielseiten. Die habe ich bereits bzgl. der neuen FTUI angepasst. Hier der Link zum Google Drive Verzeichnis.

  169. Hab jetzt alles mögliche ausprobiert, das warn hat bei mir keinerlei Funktion, ob ich es rein mache oder weg lassen, er zeigt mir immer den roten Kreis mit der Zahl drin an. Hab jetzt mal getestet. das er mir die fa-trash-o anzeigt wenn ich z.B mehr als 9 Tage habe, macht er alles nur das warn da tut sich garnichts. Die Tonne dreht sich auch wenn die Zahl der Tage demensprechend ist.

    Jemand noch nen Tipp?

  170. Hi,

    so jetzt vielleicht das letztemal das ich mich hier in diesem Thread melde.

    die data-warn=“BlaueTonne“ Zeile muss raus dann geht das mit den roten Kreis so wie ich mir das vorgestellt haben. Mit dem Code zeigt er über 6 Tage nur das Zeichen der Mülltonne, unter 5 – 2 dann mit roten Kreis und die Anzahl der Tage und bei 0 und 1 Tag dann mit roten Kreis und drehender Tonne.

    Gruß

  171. Im vorigem Posting wurde der Code gelöscht:

    data-type=“symbol“
    data-device=“MuellterminDummy“
    data-get=“BlaueTonne“
    data-icons='[„fa-trash-o warn fa-spin“,“fa-trash-o warn“,“fa-trash-o“]‘
    data-on-colors='[„blue“,“blue“,“blue“]‘
    data-get-on='[„0″,“2″,“6″]‘
    data-background-icon=“fa-circle“>

    Gruß

  172. Hallo,

    tolle Sache der Abfallkalender. Seit 2 Jahren werden hier jedoch Bugs kommentiert. Es wäre super, wenn jetzt einer noch mal ein funktionierendes Skript hier posten würde, sonst muss man ja alle Änderungen nachvollziehen. Oder läuft die Version vom 16.4.16 einwandfrei?

  173. Grundsätzlich versuche ich, evtl. Bugs, die in den Kommentaren erwähnt werden, im Beitrag anzupassen. Daher sollte eigentlich im Beitrag immer eine funktionierende Beschreibung vorhanden sein. Allerdings kann ich leider nicht alle Änderungen, die auf Grund der neuesten Versionen des FTUI ggf. notwendig werden, bei allen Beiträgen nachtragen. Hier hilft evtl. meine bereit gestellte Umgebung auf dem Google Drive Laufwerk. Aktuell basiert diese Umgebung auf der Version 2.5 des FTUI.

  174. Hallo Jürgen,
    auf einem blanken FHEM funktioniert der Aufruf der Funktion Abfalltermine leider nicht, es erscheint nur
    Month ‚-1‘ out of range 0..11 at ./FHEM/99_myUtils.pm line 47.

    use Time::Local ‚timelocal‘; habe ich in meiner 99_myUtils.pm hinzufügen müssen.

    Das dummy bleibt also auch immer leer 🙁

  175. Sollte eigentlich funktionieren. Ohne den Code zu sehen, kann ich leider nicht auf einen Fehler schließen. Versuche mal ein paar Log-Ausgaben einzubauen, mit denen du die diversen Variablen in der Funktion Abfalltermine ausgeben kannst.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Why ask?

Allnet Flat 728x090
x

Check Also

FHEM Tablet UI – Testumgebung als Schutz vor umfangreichen Updates

Aktuell bin ich dabei, meine Tablet UI Umgebung zu optimieren und die Dateien für eine ...

Durch die weitere Nutzung der Seite stimmen Sie der Verwendung von Cookies zu. Mehr Infos

Die Cookie-Einstellungen auf dieser Website sind auf "Cookies zulassen" eingestellt, um Ihnen das beste Surferlebnis zu ermöglichen. Wenn Sie diese Website ohne Änderung Ihrer Cookie-Einstellungen verwenden oder auf "Akzeptieren" klicken, erklären Sie sich damit einverstanden.

Schließen