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
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?
Sorry….musste es nur in der config eintragen, dass ich eine sensor.yaml habe…
Freut mich, dass du es selbst lösen konntest und vielen Dank für den Hinweis. Ich werde den Beitrag dann entsprechend anpassen 😉
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‘
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
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.
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.
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?
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 …
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.
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.
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
Ok, hab alles hinbekommen. Fragt mich nicht wie 😀
Aber vielen Dank für die Anleitung.
Freut mich wenn es geklappt hat 🙂