Mülltonnen-Erinnerung - Abschied von "Waste Collection Schedule"

Hallo zusammen :slightly_smiling_face:

ich habe mir gerade eine Lösung für meine Mülltonnen-Erinnerung erstellt und verabschiede mich jetzt (wie auch @olli) von der Integration "Waste Collection Schedule) :slightly_smiling_face:

Meine Lösung ist anders als die vom @olli und zeigt mir die Daten genau wie vorher mit „Waste Collection Schedule“ an… nur noch etwas besser, da die „nächste Abholung“ jetzt auch noch die entsprechende Tonne anzeigt :slightly_smiling_face:

Ansicht auf dem Dashboard:

Unter der Karte „Nächste Abholung“ sind die Karten für jede Tonne angelegt und diese wird nur angezeigt, wenn die Tage > -1 und < 2 ist.

Die Umsetzung:

Vorbereitung:

  1. es muss ein lokaler Kalender wie von @olli hier beschrieben mit dem Namen „Abfuhrkalender“ erstellt werden

    • mit den Daten aus einem ICS-Kalender
    • mit einem leeren Kalender, in dem die Tonnen entsprechend händisch eingetragen werden
  2. es müssen für die einzelnen Tonnen jeweils ein Template-Sensor angelegt werden.

Die Template-Sensoren sind bei mir in einer eigenen erstellten Datei mit dem Namen „templates.yaml“ definiert. Diese Datei muss dafür noch in der „configuration.yaml“ wie folgt eingebunden werden:

template: !include templates.yaml

Der folgende Block wird in dieser Datei „templates.yaml“ hinzugefügt

###############################
### Müllabfuhrtermine - Anfang
###############################

###############################
### nächste Abholung
###############################

  - trigger:
      - platform: time_pattern
#        hours: "0"
#        minutes: "0"
        minutes: "/1"

    action:
      - service: calendar.get_events
        target:
          entity_id: calendar.abfuhrkalender
        data:
          duration:
            days: 31
        response_variable: kalender

    sensor:
      - name: "Müllabfuhr: Tage bis nächste Abholung"
        unique_id: mullabfuhr_tage_bis_naechste_abholung
        unit_of_measurement: "Tag(e) - "

        state: >
          {% set events = kalender['calendar.abfuhrkalender'].events %}
          {% if events | count > 0 %}
            {{ ((as_datetime(events[0].start).date() - now().date()).days) }}
          {% else %}
            unknown
          {% endif %}

        attributes:
          typ: >
            {% set events = kalender['calendar.abfuhrkalender'].events %}
            {% if events | count > 0 %}
              {{ events[0].summary }}
            {% else %}
              unbekannt
            {% endif %}

          datum: >
            {% set events = kalender['calendar.abfuhrkalender'].events %}
            {% if events | count > 0 %}
              {{ events[0].start }}
            {% else %}
              unknown
            {% endif %}


###############################
### gelbe Tonne
###############################

  - trigger:
      - platform: time_pattern
#        hours: "0"
#        minutes: "0"
        minutes: "/1"

    action:
      - service: calendar.get_events
        target:
          entity_id: calendar.abfuhrkalender
        data:
          duration:
            days: 31
        response_variable: abfuhrtermine

    sensor:
      - name: "Müllabfuhr: Tage bis gelbe Tonne"
        unique_id: mullabfuhr_tage_bis_gelbe_tonne
        unit_of_measurement: ""
        state: >
          {% set termin = abfuhrtermine['calendar.abfuhrkalender'].events
             | selectattr('summary', 'eq', 'Wertstoff')
             | list
             | first %}

          {% if termin %}
            {{ ((as_datetime(termin.start) | as_local).date() - now().date()).days }}
          {% else %}
            unknown
          {% endif %}


###############################
### Papier
###############################

  - trigger:
      - platform: time_pattern
#        hours: "0"
#        minutes: "0"
        minutes: "/1"

    action:
      - service: calendar.get_events
        target:
          entity_id: calendar.abfuhrkalender
        data:
          duration:
            days: 31
        response_variable: abfuhrtermine

    sensor:
      - name: "Müllabfuhr: Tage bis Papiertonne"
        unique_id: mullabfuhr_tage_bis_papiertonne
        unit_of_measurement: ""
        state: >
          {% set termin = abfuhrtermine['calendar.abfuhrkalender'].events
             | selectattr('summary', 'eq', 'Papier')
             | list
             | first %}

          {% if termin %}
            {{ ((as_datetime(termin.start) | as_local).date() - now().date()).days }}
          {% else %}
            unknown
          {% endif %}

        
###############################
### Biotonne
###############################

  - trigger:
      - platform: time_pattern
#        hours: "0"
#        minutes: "0"
        minutes: "/1"

    action:
      - service: calendar.get_events
        target:
          entity_id: calendar.abfuhrkalender
        data:
          duration:
            days: 31
        response_variable: abfuhrtermine

    sensor:
      - name: "Müllabfuhr: Tage bis Biotonne"
        unique_id: mullabfuhr_tage_bis_biotonne
        unit_of_measurement: ""
        state: >
          {% set termin = abfuhrtermine['calendar.abfuhrkalender'].events
             | selectattr('summary', 'eq', 'Bioabfall')
             | list
             | first %}

          {% if termin %}
            {{ ((as_datetime(termin.start) | as_local).date() - now().date()).days }}
          {% else %}
            unknown
          {% endif %}

###############################
### Restmüll
###############################

  - trigger:
      - platform: time_pattern
#        hours: "0"
#        minutes: "0"
        minutes: "/1"

    action:
      - service: calendar.get_events
        target:
          entity_id: calendar.abfuhrkalender
        data:
          duration:
            days: 31
        response_variable: abfuhrtermine

    sensor:
      - name: "Müllabfuhr: Tage bis Restmüll"
        unique_id: mullabfuhr_tage_bis_restmull
        unit_of_measurement: ""
        state: >
          {% set termin = abfuhrtermine['calendar.abfuhrkalender'].events
             | selectattr('summary', 'eq', 'Restabfall 4-wöchentlich')
             | list
             | first %}

          {% if termin %}
            {{ ((as_datetime(termin.start) | as_local).date() - now().date()).days }}
          {% else %}
            unknown
          {% endif %}
          
###############################
### Problemstoffsammlung
###############################

  - trigger:
      - platform: time_pattern
#        hours: "0"
#        minutes: "0"
        minutes: "/1"

    action:
      - service: calendar.get_events
        target:
          entity_id: calendar.abfuhrkalender
        data:
          duration:
            days: 365
        response_variable: abfuhrtermine

    sensor:
      - name: "Müllabfuhr: Tage bis Problemstoffsammlung"
        unique_id: mullabfuhr_tage_bis_problemstoffsammlung
        unit_of_measurement: ""
        state: >
          {% set termin = abfuhrtermine['calendar.abfuhrkalender'].events
             | selectattr('summary', 'eq', 'Problemstoffsammlung')
             | list
             | first %}

          {% if termin %}
            {{ ((as_datetime(termin.start) | as_local).date() - now().date()).days }}
          {% else %}
            unknown
          {% endif %}
          
###############################
### Müllabfuhrtermine - Ende
###############################

Sollten die Tonnen in Eurem Kalender anders angegeben sein, als bei mir, dann müsst Ihr in dem Block noch die Werte für die „Tonnen“ anpassen:

selectattr('summary', 'eq', 'Wertstoff')

(hier z.B. den für „Wertstoff“)

Update:
jetzt können die Template-Sensoren erstellt und befüllt werden:

→ Einstellungen → Entwicklerwerkzeuge → YAML → „Konfiguration prüfen“

wenn alles in Ordnung ist, dann können die Template-Entitäten neu geladen werden (geht schneller als Home Assistant neu zu starten):

→ Einstellungen → Entwicklerwerkzeuge → „YAML-Konfiguration neu laden“ und darunter „Template-Entitäten“

Die neuen Entitäten sollten jetzt unter → Einstellungen → Geräte & Dienste → „Entitäten“ sichtbar sein.

Direkt am Anfang sind die Werte der einzelnen Tonnen und der „Nächsten Abholung“ noch unbekannt, da diese Information noch nicht aus dem Kalender geholt worden sind!

In dem großen Block ist für jeden Template-Sensor folgendes angegeben:

#        hours: "0"
#        minutes: "0"
        minutes: "/1"

Dadurch werden die Template-Sensoren jede Minute aktualisiert und somit solltest Du nach ca. 1 Minute die entsprechenden Daten in den Template-Sensoren sehen :slightly_smiling_face:

sollte alles funktionieren, dann ersetze die Bereiche wie folgt:

        hours: "0"
        minutes: "0"
#        minutes: "/1"

damit die Template-Sensoren jeden Tag um 00:00 Uhr aktualisiert werden.

Update: Jetzt nochmal wie oben "Konfiguration prüfen und Template-Entitäten neu laden

Ich hoffe diese 1. Variante ist nachvollziehbar und ich habe nichts vergessen zu beschreiben und würde mich sehr über Eure Rückmeldungen freuen :slightly_smiling_face:

Bitte entschuldigt im Voraus, wenn ich diesen Beitrag ggf. öfter anpasse, da ich es hier auf einem Tablet beschreibe und da ist es nicht so übersichtlich und ggf. müssen auch noch Anpassungen gemacht werden…

VG Micha

PS: die Integration „Waste Collection Schedule“ habe ich bereits entfernt und bin wieder eine Integration mit Internet-Anbindung los :slightly_smiling_face:

Nachtrag:

Bitte vergesst nicht, die Termine für das Folgejahr in den Kalender rechtzeitig einzutragen oder ggf. den lokalen Kalender löschen und dann mit den Daten aus dem aktuellen ICS-Kalender mit dem selben Namen erneut zu erstellen!

…Ihr könnt Euch ja eine Automatisierung erstellen, die Euch rechtzeitig Benachrichtigt/Informiert :smiling_face_with_sunglasses:

bei Waste Collection halte ich es noch für vertretbar da auf „Sachen aus dem Internet“ zurückzugreifen.

Auch im Bezug auf den WAF :wink:
Weil da gewöhnt man sich an die automatische Aktualisierung. Auch wenn sich Abholungen verschieben wegen Wetter.

Beim eigenen Einpflegen musst halt dahinter bleiben.

Ich hab es aber auch bevor Waste meine Stadt unterstütze (und ich es zum laufen brachte) alles per ICS von deren Seite gezogen.

@Muschelschubser26 ich würde aber den kalender und automation per config.yaml aus dem recorder ausschließen sonst könnte es lustig werden das die groß wird :wink:

Moin @ArnaudFeld,

vielen Dank für Deine Rückmeldung :+1:t2: Ich möchte einfach keine Anbindung an das Internet haben.

Bei „Waste Collection Schedule“ haben mich auch die sehr häufigen Updates gestört und ich frage mich immer, was passiert, wenn es diese Integration Morgen nicht mehr gibt und bei einer Internet-Störung werden die Tonnen auch nicht angezeigt.

Die Idee war auch nur um zu zeigen, wie eine lokale Umsetzung ohne „Waste Collection Schedule“ aussehen könnte, falls jemand auch nach einer lokalen Lösung sucht.

…wegen dem Recorder: Danke für den Himweis :+1:t2: meine Recorder-Einstellung ist so konfiguriert, dass bei mir erstmal nichts gespeichert wird und ich die für mich wichtigen Entitäten explizit mit „include“ eingebunden habe.

VG Micha

Das was an Info abgerufen is, bleibt vorhanden wenn ich das richtig im Kopf habe.

Bzw. Ich weiß das es dann noch läuft weil ich das neulich provoziert hatte aus Gründen bei einer Umstellung.

Und wenn es doch soweit kommt weiß ich hier bei der Stadt wie ich das schnell rausgezogen bekomme.

Das nur mit dem include is auch ne Lösung.

in dem großen Block habe ich die Zeile

unit_of_measurement: "Tag(e) - "

durch

unit_of_measurement: "Tage“

ersetzt, da die Karte „Nächste Abholung“ nur angezeigt wird, wenn keine Karte der jeweiligen Tonne angezeigt wird.

Ich habe mir gerade noch 6 weitere Helfer (Template-Sensoren) angelegt, in denen die Tage inkl. Text auf dem Dashboard angezeigt werden. Ich finde die Darstellung so besser :slightly_smiling_face:

Weiterhin wird die Karte „Nächste Abholung“ über die Option „Sichtbarkeit“ nur angezeigt, wenn Morgen keine Tonne abgeholt wird und ansonsten nur die Karte für die entsprechende Tonne.

Beispiel: für den Template-Sensor-Code für „die nächste Abholung“

Name: Müllabfuhr: Müllabfuhr: Tage bis nächste Abholung-Text

-> Optionen für Template:

{% set tage = states('sensor.mullabfuhr_tage_bis_nachste_abholung') | int(-1) %}
{% set typ = state_attr('sensor.mullabfuhr_tage_bis_nachste_abholung', 'typ') %}

{% if tage == 0 %}
  Heute{% if typ %} ({{ typ }}){% endif %}
{% elif tage == 1 %}
  Morgen{% if typ %} ({{ typ }}){% endif %}
{% elif tage > 1 %}
  In {{ tage }} Tagen{% if typ %} ({{ typ }}){% endif %}
{% else %}
  Unbekannt
{% endif %}

Zusatz: wer zusätzlich noch die Tonnen aus dem Kalender für die Dashboard-Anzeige umbenennen möchte

- → Optionen für Template:

{% set tage = states('sensor.mullabfuhr_tage_bis_nachste_abholung') | int(-1) %}
{% set typ = state_attr('sensor.mullabfuhr_tage_bis_nachste_abholung', 'typ') %}

{% if typ == 'Wertstoff' %}
  {% set typ = 'Gelbe Tonne' %}
{% endif %}
{% if typ == 'Papier' %}
  {% set typ = 'Papiertonne' %}
{% endif %}
{% if typ == 'Bioabfall' %}
  {% set typ = 'Biotonne' %}
{% endif %}
{% if typ == 'Restabfall 4-wöchentlich' %}
  {% set typ = 'Restmüll' %}
{% endif %}
{% if typ == 'Problemstoffsammlung' %}
  {% set typ = 'Problemstoff' %}
{% endif %}

{% if tage == 0 %}
  Heute{% if typ %} ({{ typ }}){% endif %}
{% elif tage == 1 %}
  Morgen{% if typ %} ({{ typ }}){% endif %}
{% elif tage > 1 %}
  In {{ tage }} Tagen{% if typ %} ({{ typ }}){% endif %}
{% else %}
  Unbekannt
{% endif %}

Beispiel: für den Template-Sensor-Code für eine Tonne (hier die Papiertonne)

Name: Müllabfuhr: Tage bis Papiertonne-Text

-> Optionen für Template:

{% set tage = states('sensor.mullabfuhr_tage_bis_papiertonne') | int(-1) %}
          {% if tage == 0 %}
            Heute
          {% elif tage == 1 %}
            Morgen
          {% elif tage > 1 %}
            In {{ tage }} Tagen
          {% else %}
            Unbekannt
          {% endif %}

VG Micha

Auch schicke Umsetzung. Ist das bei dir auf dem Main-Dashboard oder wo blendest du das ein?

ich habe bei mir aktuell nur in einer Badge drin:

image

und hier der Code:

type: custom:trash-card
entities:
  - calendar.abfall
event_grouping: true
drop_todayevents_from: "10:00:00"
next_days: 4
pattern:
  - label: " "
    pattern: Restmüll
    color: grey
    type: custom
    picture: /local/abfall/schwarz.png
  - label: " "
    pattern: Biotonne
    color: green
    type: custom
    picture: /local/abfall/grün.png
  - label: " "
    pattern: Gelber Sack
    color: yellow
    type: custom
    picture: /local/abfall/gelb.png
day_style: counter
card_style: chip
alignment_style: left
color_mode: icon
items_per_row: 3
refresh_rate: 60
with_label: true
layout: horizontal


Richtig :+1:t2: die jeweilige Karte ist auf dem Main-Dashboard zu sehen :grinning_face:

Deine Karte schaut inhaltlich recht ähnlich aus wie meine :grinning_face::+1:t2: wozu benötigst Du eine Refresh-Rate von 60?

das is noch ein Überbleibsel von nem Test den ich gefahren habe :smiley: Da wollte ich einfach recht schnell was sehen