Erinnerung Müllabfuhr mit Home-Assistant und einem Telegram Bot

Einführung

Unsere Stadt stellt den Müllabfuhrkalender als iCS zur Verfügung. Diesen Kalender habe ich meinem Google Kalender hinzugefügt. Meinen Google Kalender habe ich dann wiederum in Home-Assistant integriert. Zur Benachrichtigung auf mein Handy habe ich mir einen Telegram Bot eingerichtet und diesen ebenfalls in HA integriert. Vorteil des Bots: er kann nicht nur Nachrichten schicken, man kann mit Hilfe von Menüs oder Kommandos mit ihm interagieren.

Einrichtung

Wenn man den Google Kalender in HA integriert hat, findet man im /config Ordner von HA die Datei google_calendars.yaml. Hier vergibt man dem "Müllkalender" einen Namen und eine eindeutige ID:

- cal_id: xxxxxxxxxxxxxxxxx@import.calendar.google.com
  entities:
  - device_id: muellkalender
    ignore_availability: true
    name: Mein-Abfallkalender
    track: true

Jetzt findet man in HA eine entsprechende Entity mit dem Namen calender.muellkalender. Bei meinem Kalender ist es so, dass an den Tagen, an denen eine Mülltonne abgeholt wird, ein ganztägiger Termin im Kalender steht. Somit kann man den Kalender nicht direkt für eine Automatisierung verwenden, da die Entity mit beginn des Termins um 0:00 erst auf "on" geht. Die Erinnerung sollte ja aber am besten bereits am Abend vorher erfolgen, damit man die entsprechende Mülltone auch rausstellen kann.

Sensor mit offset

Daher erstellen wir uns nun einen Sensor mit einem gewissen offset. Ich lasse mich am Vorabend um 17:30 Uhr erinnern. Die Zeit kann natürlich angepasst werden. Dazu muss im Template die Zahl 23400 angepasst werden. Ich lasse mich ja 6h30min vor dem eigentlichen Event erinnern und 6h30min entsprechen 23400sec. Ebenfalls müsst ihr states.calender.muellkalender an euren Kalender anpassen.

# sensor.yaml
- platform: template
    sensors:
      bins_out_offset:
        friendly_name: "Bins out offset"
        value_template: >
          {% if as_timestamp(states.calendar.muellkalender.attributes.start_time) - as_timestamp(strptime(states.sensor.date_time.state, "%Y-%m-%d, %H:%M" ) ) < 23400 and as_timestamp(states.calendar.muellkalender.attributes.end_time) > as_timestamp(strptime(states.sensor.date_time.state, "%Y-%m-%d, %H:%M" ) ) %}
            on
          {% else %}
            off
          {% endif %}

Damit das ganze auch funktioniert braucht ihr noch einen Sensor für die Zeit:

# sensor.yaml
- platform: time_date
  display_options:
    - "date_time"
    - "date"
    - "date_time_iso"

Erinnerung mit Inline Keyboard

Jetzt erstellen wir uns eine erste Automatisierung, die getriggert wird wenn der oben erstellte Sensor auf "on" wechselt. Neben der Nachricht, welche Mülltonne abgeholt wird, erstellt Telegram ein Inline Keyboard mit vier Buttons. Mit diesen Buttons kann die Erinnerung erneut gesendet werden (10, 30 oder 60min später), oder sie kann ausgeschaltet werden und das Keyboard wird wieder versteckt.

- alias: Telegram Müllerinnerung
  trigger:
  - entity_id: sensor.bins_out_offset
    platform: state
    to: 'on'
  condition: []
  action:
  - service: notify.telegram
    data_template:
      message: '{{ states.calendar.muellkalender.attributes.message }}'
      data:
        inline_keyboard:
        - 10 Minuten:/10m, 30 Minuten:/30m, 1 Stunde:/1h
        - Aus:/removekeyboard

Wenn wir jetzt einen der Buttons betätigen, sendet Telegram einen Befehl (zb. /10m) an HA zurück und gibt uns ein Feedback was er gemacht hat. Um die Befehle in HA auswerten zu können, erstellen wir vier weitere Automatisierungen - für jeden Befehl eine. Die erste Automatisierung versteckt das Inline Keyboard und deaktiviert die Erinnerungen. Die anderen drei Automatisierungen sorgen dafür, dass wir nach der festgelegten Zeit erneut erinnert werden und zeigt uns wieder das Inline Keyboard an.

- alias: Telegram callback Keyboard verstecken
  trigger:
    platform: event
    event_type: telegram_callback
    event_data:
      data: /removekeyboard
  action:
  - service: telegram_bot.answer_callback_query
    data_template:
      callback_query_id: '{{ trigger.event.data.id }}'
      message: OK
  - service: telegram_bot.edit_replymarkup
    data_template:
      message_id: '{{ trigger.event.data.message.message_id }}'
      chat_id: '{{ trigger.event.data.chat_id }}'
      inline_keyboard: []
- alias: Telegram enrneute Müll Erinnerung in 10min
  trigger:
    platform: event
    event_type: telegram_callback
    event_data:
      data: /10m
  action:
  - service: telegram_bot.answer_callback_query
    data_template:
      callback_query_id: '{{ trigger.event.data.id }}'
      message: OK, reminding you in 10 minutes
  - service: telegram_bot.edit_replymarkup
    data_template:
      message_id: '{{ trigger.event.data.message.message_id }}'
      chat_id: '{{ trigger.event.data.chat_id }}'
      inline_keyboard: []
  - delay: 00:10:00
  - service: notify.telegram
    data_template:
      message: '{{ trigger.event.data.message.text }}'
      data:
        inline_keyboard:
        - 10 Minuten:/10m, 30 Minuten:/30m, 1 Stunde:/1h
        - Aus:/removekeyboard
- alias: Telegram enrneute Müll Erinnerung in 30min
  trigger:
    platform: event
    event_type: telegram_callback
    event_data:
      data: /30m
  action:
  - service: telegram_bot.answer_callback_query
    data_template:
      callback_query_id: '{{ trigger.event.data.id }}'
      message: OK, reminding you in 30 minutes
  - service: telegram_bot.edit_replymarkup
    data_template:
      message_id: '{{ trigger.event.data.message.message_id }}'
      chat_id: '{{ trigger.event.data.chat_id }}'
      inline_keyboard: []
  - delay: 00:30:00
  - service: notify.telegram
    data_template:
      message: '{{ trigger.event.data.message.text }}'
      data:
        inline_keyboard:
        - 10 Minutes:/10m, 30 Minuten:/30m, 1 Stunde:/1h
        - Aus:/removekeyboard
- alias: Telegram enrneute Müll Erinnerung in 1h
  trigger:
    platform: event
    event_type: telegram_callback
    event_data:
      data: /1h
  action:
  - service: telegram_bot.answer_callback_query
    data_template:
      callback_query_id: '{{ trigger.event.data.id }}'
      message: OK, reminding you in 1 hour
  - service: telegram_bot.edit_replymarkup
    data_template:
      message_id: '{{ trigger.event.data.message.message_id }}'
      chat_id: '{{ trigger.event.data.chat_id }}'
      inline_keyboard: []
  - delay: 01:00:00
  - service: notify.telegram
    data_template:
      message: '{{ trigger.event.data.message.text }}'
      data:
        inline_keyboard:
        - 10 Minutes:/10m, 30 Minuten:/30m, 1 Stunde:/1h
        - Aus:/removekeyboard

Ergebnis in Telegram

Das ganze sieht dann in Telegram so aus:

Nachtrag:

Einem aufmerksamen Leser ist aufgefallen, dass ich die Datei sensor.yaml verwende. Bei frisch installierten Systemen wird diese Datei eventuell nicht vorhanden sein. Ich nutze diese Datei um dort alle zusätzlichen Sensoren einzutragen und meine Konfiguration so etwas übersichtlicher zu gestalten. Wenn ihr diese Datei nicht verwenden wollt, müsst ihr die Sensoren in die configuration.yaml eintragen. Dabei müsst ihr vor den eigentlichen Sensor das Wort "sensor" gefolgt von einem Doppelpunkt eintragen:

# configuration.yaml
sensor:
  - platform: time_date
    display_options:
      - "date_time"
      - "date"
      - "date_time_iso"

Wenn ihr die Datei sensor.yaml verwenden wollt, müsst ihr diese in dem Ordner anlegen, in dem auch die configuration.yaml liegt. Danach fügt ihr folgendes in der configuration.yaml ein:

# configuration.yaml
sensor: !include sensor.yaml

14 Kommentare zu „Erinnerung Müllabfuhr mit Home-Assistant und einem Telegram Bot

  1. Das sieht genau nach dem aus was ich derzeit suche 😉
    Allerdings fängt es bei mir schon mit der sensor.yaml an. Sie existiert bei mir noch nicht und wenn ich sie anlege, wird sie ignoriert, ich finde also im „Verlauf“ keinen Sensor „Bins out offset“.
    Kannst du mir hier helfen?

      1. Wenn du schon am anpassen bist:
        Der folgende Sensor muss auch noch eingefügt werden:

        #Sensor für die Zeit
        – platform: time_date
        display_options:
        – ‚time‘
        – ‚date‘
        – ‚date_time‘
        – ‚date_time_utc‘
        – ‚date_time_iso‘
        – ‚time_date‘
        – ‚time_utc‘
        – ‚beat‘

  2. Ich hänge jetzt bei der Rückmeldung von Telegram an HA.
    Ich kann 10 Minuten etc. drücken, es kommt auch die festgelegte Meldung („OK, reminding you in 10 minutes“), aber danach passiert nichts mehr.

    Auch beim Klick auf „aus“ verschwinden die Button nicht.
    Muss ich denn im Code noch etwas anpassen? Ich habe es bisher 1:1 so übernommen.

    Grüße
    Jan

    1. Ich schon wieder.
      Ich weiß jetzt an was es liegt. Und zwar wird meine User_ID nicht mit übergeben.
      Zeile: chat_id: ‚{{ trigger.event.data.user_id }}‘

      Wenn ich anstatt ‚{{ trigger.event.data.user_id }}‘ fest meine User ID eintrage, dann funktioniert es.

      Beim Überwachen des Auslösers sehe ich folgendes:
      user_id: null

      Lösung:
      bei mir hilft es user_id durch chat_id zu ersetzen.

      1. Cool, vielen Dank für die Lösung 😉 Ich hatte noch keine Gelegenheit danach zu schauen, aber seit dem letzten Update von HA habe ich das Problem auch. Jetzt weiß ich ja was ich ändern muss.
        Das mit dem „Time“ Sensor ist bei mir wohl untergegangen, wird aber noch hinzugefügt 😉 Vielen Dank nochmal für deine Hinweise.

  3. Hallo und danke für die Anleitung.
    Habe alles soweit übernommen und es erscheinen auch die Automatisierungen in hass, allerdings wenn ich auf Aktion ausführen klicke um es zu testen bekomme ich keine Nachricht auf mein Handy. Telegram bleibt stumm. Hat sich hier vielleicht wieder etwas geändert mit einer neuen hass version?

    1. Ok, ich bin nun soweit das ich eine Nachricht bekomme welche Tonne rausmuss. Dafür musste ich auf notify.telegram – telegram_bot.send_message machen.

      Kann es sein, dass sich die anderen Befehle auch geändert haben? Denn diese Buttons 10 Min, 30 Min und 1 Stunde erscheinen bei mir nicht …

  4. Sorry aber ich nochmal …
    Im Trace bekomm ich folgendes, Error rendering data template: UndefinedError: ‚dict object‘ has no attribute ‚event‘

    Geht wie gesagt alles, nur die Buttons werden nicht angezeigt.

    1. Wahrscheinlich fehlt dir folgender Eintrag in der ‚configuration.yaml‘:

      notify:
      – name: telegram
      platform: telegram
      chat_id: !secret telegram_chatid

      Dann sollte es auch mit „notify.telegram“ funktionieren.
      Bei mir läuft es noch wie gehabt. Ich musste lediglich die Änderung von Jan übernehmen.

  5. Danke für die rasche Antwort, ich hab nun notify eingetragen und damit geht es auch. Allerdings bekomme ich nach wie vor, kein inlinekeyboard angezeigt, diese Buttons erscheinen einfach nicht.

    Ich bekomme einfach nur die Meldung, „Restabfalltonne“ mehr erscheint da nicht.
    Ich drücke auf Aktion ausführen und das nächste Kalenderevent ist eben, Restabfalltonne. Die wird nächste Woche abgeholt, da nimmt er sich ja logischerweise das nächste was ansteht …

    Ich war nun nochmal im Trace und hab da folgendes gefunden,

    Executed: 7. Mai 2022, 09:34:37
    Result:
    params:
    domain: telegram_bot
    service: send_message
    service_data:
    message: Restabfalltonne
    data:
    inline_keyboard:
    – 10 Minuten:/10m, 30 Minuten:/30m, 1 Stunde:/1h
    – Aus:/removekeyboard
    target: {}
    running_script: false
    limit: 10
    context:
    id: xxx
    parent_id: xxx
    user_id: null

    running_script: false macht mich da etwas stutzig oder soll das so sein?
    Und user_id: null erscheint bei mir auch

Schreibe einen Kommentar zu Daniel Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert