ioBrokerioBroker Tutorials

Abfallkalender in ioBroker integrieren

In diesem Artikel zeige ich Dir, wie Du den Abfallkalender in ioBroker integrieren kannst.

Für meine neue Visualisierung benötige ich die Termine der Abfallabholung getrennt nach Art der Abholung (Restmüll, Biomüll, Flach und Rund). In einem anderen Artikel habe ich bereits gezeigt, wie Du ein Kalender über den Adapter „ical“ integrieren kannst. Ich werde in diesem Artikel nicht mehr auf die Installation des Adapters eingehen, da ich die Installation und Konfiguration bereits im anderen Artikel beschrieben habe.

Die Termine der Abfallabholung erhält man in der Regel von den entsprechenden Entsorgungsbetrieben. Bei uns stehen die Termine als ics-Datei zur Verfügung, welche ich einfach und schnell in einen Kalender importieren kann. Im ersten Schritt habe ich also die Termine als ics-Datei heruntergeladen und in einen neuen Google Kalender importiert.

Bevor wir mit der eigentlichen Verarbeitung des Kalenders beginnen können, legen wir uns im ersten Schritt nun eigene Datenpunkte für die Termine der Abholungen an.

Den Google Kalender habe ich dann im nächsten Schritt in den Adapter „ical“ eingefügt.

Wenn wir nach dem Speichern des Adapters nun in die Objekte wechseln, sehen wir unter dem Adapter „ical.0“ die entsprechenden Termine im HTML-Format sowie als JavaScript Objekte (table). Wir können jetzt also die einzelnen Objekte genauer untersuchen und die gewünschten Informationen (Datum und Art der Abholung) ermitteln.

Im nächsten Schritt können wir nun ein Skript erstellen, mit dem wir den Datenpunkt ical.0.data.table via Skript analysieren. Dazu habe ich die Funktion UpdateAbfallTermine erstellt, welche den Inhalt des Datenpunktes liest und dann mit einer Schleife durchläuft. Die Termin sind absteigend vom heutigen Tag an sortiert. Daher können wir einfach immer das Auffinden eines Termins (z.B. Restmüll) erkennen und uns dann das Datum auslesen und im Datenpunkt speichern. Die Funktion wird über die on(…)-Subscription automatisch bei einer Änderung des Datenpunktes aufgerufen. Da der Kalender Jede 0 und 30 Minute jede Stunde aktualisiert wird, haben wir so immer die aktuellen Termine im Kalender.

Script 1
Mit diesem Script werden die Daten für die nächsten Leerungen im Format „DD.MM.YYYY“ angezeigt.

on({id: "ical.0.data.table", change: "ne"}, function (obj) { UpdateAbfallTermine(); });

function formatTwoDigits(n) {
return n < 10 ? '0' + n : n;
}

function UpdateAbfallTermine() {
    var TerminFlach = "";
    var TerminRund = "";
    var TerminBio = "";
    var TerminRest = "";
    var Termine = getState("ical.0.data.table").val;

    try { 
        var jsonObject = JSON.parse(Termine);
        
        for(var i = 0; i < jsonObject.length; i++) {
            var Termin = jsonObject[i];
            var TerminObject = new Date(Termin._date);

            var yyyy = TerminObject.getFullYear();
            var dd = TerminObject.getDate();
            var mm = TerminObject.getMonth()+1;
            dd = formatTwoDigits(dd);
            mm = formatTwoDigits(mm);
            var TimeStampString = dd+"."+mm+"."+yyyy;

            if ( Termin.event == "Restmüll" && TerminRest == "" ) {
                TerminRest = TimeStampString;
                }

                if ( Termin.event == "Biomüll" && TerminBio == "" ) {
                TerminBio = TimeStampString;
                }

                if ( Termin.event == "Flach" && TerminFlach == "" ) {
                TerminFlach = TimeStampString;
                }

                if ( Termin.event == "Rund" && TerminRund == "" ) {
                TerminRund = TimeStampString;
                }
        }
    } catch (e) {
        return;
    }

    setState('0_userdata.0.Visualisierung.Abfalltermine.Rest', TerminRest);
    setState('0_userdata.0.Visualisierung.Abfalltermine.Bio', TerminBio);
    setState('0_userdata.0.Visualisierung.Abfalltermine.Flach', TerminFlach);
    setState('0_userdata.0.Visualisierung.Abfalltermine.Rund', TerminRund);
}

UpdateAbfallTermine();

Script 2
Mit diesem Script werden die Daten für die nächsten Leerungen im Format „Heute, Morgen, In 5 Tagen“ angezeigt.

on({id: "ical.0.data.table", change: "ne"}, function (obj) { UpdateAbfallTermine(); });

function formatTwoDigits(n) {
return n < 10 ? '0' + n : n;
}

function UpdateAbfallTermine() {
    var TerminFlach = "";
    var TerminRund = "";
    var TerminBio = "";
    var TerminRest = "";
    var Termine = getState("ical.0.data.table").val;

    try { 
        var jsonObject = JSON.parse(Termine);
        
        for(var i = 0; i < jsonObject.length; i++) {
            var Termin = jsonObject[i];
            var TimeStampString = Termin.date;

            if ( Termin.event == "Restmüll" && TerminRest == "" ) {
                TerminRest = TimeStampString;
                }

                if ( Termin.event == "Biomüll" && TerminBio == "" ) {
                TerminBio = TimeStampString;
                }

                if ( Termin.event == "Flach" && TerminFlach == "" ) {
                TerminFlach = TimeStampString;
                }

                if ( Termin.event == "Rund" && TerminRund == "" ) {
                TerminRund = TimeStampString;
                }
        }
    } catch (e) {
        return;
    }

    setState('0_userdata.0.Visualisierung.Abfalltermine.Rest', TerminRest);
    setState('0_userdata.0.Visualisierung.Abfalltermine.Bio', TerminBio);
    setState('0_userdata.0.Visualisierung.Abfalltermine.Flach', TerminFlach);
    setState('0_userdata.0.Visualisierung.Abfalltermine.Rund', TerminRund);
}

UpdateAbfallTermine();

Im nächsten Speichern wir das Skript und aktivieren wir es. Dadurch werden jetzt die Datenpunkte entsprechend gefüllt. Die Abfalltermine können wir nun einfach auf unserer Visualisierung darstellen.

Ich hoffe euch gefällt dieser Artikel. Über Kommentare unterhalb des Artikels oder per E-Mail freue ich mich wie immer 🙂

Matthias Korte

Hauptberuflich Software-Entwickler und seit einigen Jahren Smart-Home Fan. Angefangen hat alles mit einem RaspberryMatic und einer schaltbaren Steckdose. Mittlerweile habe ich einige Steckdosen, Sensoren, und Thermostate sowie ioBroker zur Visualisierung im Einsatz.

19 Gedanken zu „Abfallkalender in ioBroker integrieren

  • Pingback: Visualisierung – Teil 4.2 – Implementierung – Übersicht – smarthome-tricks.de

  • Werner Paskamp

    Leider bekomme ich das nicht hin mit der Anlage von Datenpunkte.0; Visualisierung etc.
    Können sie mir eine genauere Anleitung zur Verfügung stellen?

    Vielen Dank

    Antwort
  • Sascha

    Guten Tag, ich habe jetzt Stunden den Fehler gesucht und finde ihn nicht.
    Wenn ich das Skript benutze funktioniert es einwandfrei. Mit Ausnahme von Übermorgen.
    Wenn ich im ICAL in der Instanz die Funktion „Ersetze Datum mit Worten“ deaktiviere wird das richtige Datum angezeigt für den Müll der übermorgen abgeholt werden soll.
    Wenn ich dann auf „Ersetze Datum mit Worten“ zurück gehe, steht kurz in dem Objekt (Datenpunkt) „Übermorgen“ wird dann aber sofort durch das Datum ersetzt. Noch schlimmer ist es wenn sich ein Termin von einem anderen Tag auf übermorgen verschiebt. Dann läuft das Skript durch und der urspüngliche Termin wird angezeigt und das verschieben auf übermorgen wird ignoriert. Mit „Heute“ und“Morgen“ funktioniert das alles einwandfrei. PS: Ich beschreibe keine Datenpunkte in der VIS sondern SysVariablen der CCU. Ich hab keine Idee mehr. Sie vielleicht?

    Antwort
  • Pingback: ioBroker Material UI – Eigene Datenpunkte darstellen – smarthome-tricks.de

  • Auf der Suche nach einer Lösung, bin ich auch über diesen Beitrag gestolpert. Ich habe das Ganze etwas einfacher gemacht und einen Adapter dafür programmiert, welcher mir die Daten errechnet und in Datenpunkte schreibt. Ist für Einsteiger sicher etwas einfacher.

    https://github.com/klein0r/ioBroker.trashschedule

    Antwort
  • Sascha

    Hallo Matthias Korte,
    ich nutze seit 2 Jahren dein Skript und es funktionierte immer super.
    Seit 2 Tagen funktioniert es nicht mehr, bzw. ich vermute das es eher am ICAL Adapter liegt. Denn was ich bisher rausgefunden habe ist, das in meiner Erinnerung und so wie auch oben bei Dir zu sehen der Datenpunkt ical data table immer mit [Object][Object] etc begonnen hat. Bei mir startet der Datenpunkt mit diesem Inhalt:
    [{„date“:“Heute „,“event“:“Papiertonne“,“_class“:“ical_Muellabfuhr ical_today“,“_date“:“2021-08-04T22:00:00.000Z“,“_end“:“2021-08-05T22:00:00.000Z“,“_IDID“:“992455@mymuell.de“,“_allDay“:true,“_private“:false,“_rule“:“ „,“location“:““,“_calName“:“Muellabfuhr“,“_calColor“:“#ffb66c“},{„date“:“In 6 Tagen „,“event“:“Wertstofftonne“,“_class“:“ical_Muellabfuhr ical_
    Ich kann aber nicht herausfinden warum er das tut und ob das tatsächlich der Fehler ist. Denn die Datenfelder die dein Skript befüllt bleiben leer. Das Skript selbst erzeugt keine Fehlermeldung.
    Danke vielmals vorab.

    Antwort
  • Sascha

    Hallo Matthias Korte,
    bei mir hat dein Skript plötzlich keine Werte mehr eingetragen.
    Was vermutlich an einer Änderung im Ical Adapter liegt.
    Ich bin auf Version 1.9.3 zurück gegangen nun geht es wieder.
    Kann man auf einfache Weise dein Skript so anpassen das es auch mit der aktuellen Version vom Ical Adapter funktioniert?
    (Ich würde ja den Adapter von Matthias Kleine nutzen, aber der adapter ignoriert so weit ich das gesehen habe die Funktion „Datum in Worten“ = Morgen, In 6 Tagen, etc.) Bei folgen alle weiteren Automatisierungen und Visualisierungen auf diese Werte, daher möchte ich die nicht extra abändern oder die Werte des Adapters von Matthias erst per Skript wieder umändern und weitere Datenpunkte anlegen.)
    Danke vorab für eine Antwort und viele Grüße!

    Antwort
    • Matthias Korte

      Hallo Sascha,

      ich kam leider noch nicht zum Antworten, aber Du hast das Problem ja quasi selber gefunden 😉
      Richtig, ich habe gelesen das hier im iCal Adapter eine Änderung der Datenpunkte erfolgte.
      Ich werde mir das Script und die Datenpunkte mal ansehen und dann das Script anpassen.

      Viele Grüße,
      Matthias

      Antwort
    • Matthias Korte

      Hallo Sascha,

      so, kann das Problem natürlich bei mir auch reproduzieren und habe es jetzt im Script berichtigt.
      Das Problem war, dass der iCal-Adapter jetzt ein anderes Format für die Daten verwendet. Mit dem neuen Script klappt das jetzt aber auch.
      Ich habe die Datenpunkte auch gleich auf die korrekten _UserData Datenpunkte umgestellt und den Artikel (Screenshots) angepasst.

      Viele Grüße,
      Matthias

      Antwort
  • Sascha

    Das ging schnell. Ich hba noch nen Fehler und finde ihn nicht.
    Dort wo die 4 Abfragen kommen: “ if ( Termin.event “
    sagt IOBROKER “ javascript.0 (713) script.js.common.Kalender.Kalender_Muell_in_CCU_SYSVAR2 compile failed: at script.js.common.Kalender.Kalender_Muell_in_CCU_SYSVAR2:28″

    Bei der jeweils schließ0enden Klammer ) sagte er „;“ expected.
    Bei dem Teil „Termin.event == „Restabfalltonne“ “ sagt er „The left-hand side of an arithmetic operation must be of type ‚any‘, ’number‘, ‚bigint‘ or an enum type.(2362)“

    ((((( Muss das „UpdateAbfallTermine(); “ am Ende des skripts wirklich da rein ?)))))
    Die Fehler kommen in beiden Fällen. mit oder ohne diesen Teil.

    Hier das Skript: (ich habe es kopirt und meine „Begriffe“ und Datenpunkte geändert.
    Danke 🙂

    on({id: „ical.0.data.table“, change: „ne“}, function (obj) { UpdateAbfallTermine(); });

    function formatTwoDigits(n) {
    return n < 10 ? '0' + n : n;
    }

    function UpdateAbfallTermine() {
    var TerminWertstoff = "";
    var TerminPapier = "";
    var TerminBio = "";
    var TerminRest = "";
    var Termine = getState("ical.0.data.table").val;

    try {
    var jsonObject = JSON.parse(Termine);

    for(var i = 0; i < jsonObject.length; i++) {
    var Termin = jsonObject[i];
    var TerminObject = new Date(Termin._date);

    var yyyy = TerminObject.getFullYear();
    var dd = TerminObject.getDate();
    var mm = TerminObject.getMonth()+1;
    dd = formatTwoDigits(dd);
    mm = formatTwoDigits(mm);
    var TimeStampString = dd+"."+mm+"."+yyyy;

    if ( Termin.event == "Restabfalltonne" && TerminRest == "" ) {
    TerminRest = TimeStampString;
    }

    if ( Termin.event == "Biotonne" && TerminBio == "" ) {
    TerminBio = TimeStampString;
    }

    if ( Termin.event == "Wertstofftonne" && TerminWertstoff == "" ) {
    TerminWertstoff = TimeStampString;
    }

    if ( Termin.event == "Papiertonne" && TerminPapier == "" ) {
    TerminPapier = TimeStampString;
    }
    }
    } catch (e) {
    return;
    }

    setState("hm-rega.0.15557"/*Kal_Muell_Papier_Blau*/, TerminPapier);
    setState("hm-rega.0.15558"/*Kal_Muell_Bio_Gruen*/, TerminBio);
    setState("hm-rega.0.15559"/*Kal_Muell_Wertstoff_Gelb*/, TerminWertstoff);
    setState("hm-rega.0.15560"/*Kal_Muell_Rest_Grau*/, TerminRest);
    }

    Antwort
  • Sascha

    ….. Nachtrag , ich schätze die “ &&“ einträge im Skript sind falsch. Die lauten doch einfach nur „&&“ oder?
    Wenn ja, läuft das Skript nun sauber durch. (Keine Fehlermeldung und keine unterstrichenen Fehlerhinweise)
    Jedoch befüllt das skript die Datenpunkte nicht.
    Da finde ich den Fehler aber nicht.

    on({id: „ical.0.data.table“, change: „ne“}, function (obj) { UpdateAbfallTermine(); });

    function formatTwoDigits(n) {
    return n < 10 ? '0' + n : n;
    }

    function UpdateAbfallTermine() {
    var TerminWertstoff = "";
    var TerminPapier = "";
    var TerminBio = "";
    var TerminRest = "";
    var Termine = getState("ical.0.data.table").val;

    try {
    var jsonObject = JSON.parse(Termine);

    for(var i = 0; i < jsonObject.length; i++) {
    var Termin = jsonObject[i];
    var TerminObject = new Date(Termin._date);

    var yyyy = TerminObject.getFullYear();
    var dd = TerminObject.getDate();
    var mm = TerminObject.getMonth()+1;
    dd = formatTwoDigits(dd);
    mm = formatTwoDigits(mm);
    var TimeStampString = dd+"."+mm+"."+yyyy;

    if ( Termin.event == "Restabfalltonne" && TerminRest == "" ) {
    TerminRest = TimeStampString;
    }

    if ( Termin.event == "Biotonne" && TerminBio == "" ) {
    TerminBio = TimeStampString;
    }

    if ( Termin.event == "Wertstofftonne" && TerminWertstoff == "" ) {
    TerminWertstoff = TimeStampString;
    }

    if ( Termin.event == "Papiertonne" && TerminPapier == "" ) {
    TerminPapier = TimeStampString;
    }
    }
    } catch (e) {
    return;
    }

    setState("hm-rega.0.15557"/*Kal_Muell_Papier_Blau*/, TerminPapier);
    setState("hm-rega.0.15558"/*Kal_Muell_Bio_Gruen*/, TerminBio);
    setState("hm-rega.0.15559"/*Kal_Muell_Wertstoff_Gelb*/, TerminWertstoff);
    setState("hm-rega.0.15560"/*Kal_Muell_Rest_Grau*/, TerminRest);
    }

    UpdateAbfallTermine();

    Antwort
  • Sasch

    Nachtrag 2. skript wie oben eingefügt funktioniert, aber jetzte ahbe ich nur noch das datum in den werten stehen und nicht mehr das Datum in Worten (Morgen, In 5 Tagen, etc)
    Geht das mit dem neuen Skript nicht mehr?

    Lieben Gruß!

    Sascha

    Antwort
    • Matthias Korte

      Hallo Saschae,

      doch, ich stelle dafür gleich noch ein zweites Script ein. Damit geht dann das Format „Heute, Morgen, in X Tagen“ auch wieder.

      LG Matthias

      Antwort
  • Sascha

    Bei mir klappt jetzt alles wieder. Danke Dir!
    Ich denke Du musst das &&amp noch ersetzen, wenn man das 1:1 kopiert funktioniert es nicht.
    VG Sascha

    Antwort
    • Matthias Korte

      Danke für den Hinweis, habe das Problem gerade behoben.

      LG Matthias

      Antwort
  • Sascha

    Hallo Matthias, ich hab mich zu früh gefreut.
    Die Aktualisierung der Datenpunkte klappt bei mir nicht. Das script läuft ohne Fehlermeldung durch, aber die Datenpunkt bleiben unverändert. Es hat nur der einmalige durchlauf am 07.08 funktioniert.Weißt Du woran es liegen könnte?
    Danke!

    Antwort
  • Thomas

    Hallo,

    bei mir ist es auch nur einmal durchgelaufen.
    Woran liegt das woh?

    mfg
    Thomas

    Antwort

Schreibe einen Kommentar zu Matthias Korte Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht.