8 m Witte Google Nest speaker op een bureaubladIk hou ervan om dingen los te laten en mezelf helemaal te verliezen in de dingen waarmee ik bezig ben. Dan wil het wel eens gebeuren dat ik bijna een afspraak mis en me moet haasten om alsnog op tijd te zijn. Gelukkig heb ik een oplossing gevonden die me altijd herinnert aan wat er in mijn agenda staat. Een gesproken melding op mijn Nest speakers! Hier lees je hoe ik het gemaakt heb.

Er zijn een paar dingen die je moet weten voor we beginnen: De aankondigingen onderbreken eventuele muziek die wordt afgespeeld. Persoonlijk gebruik ik mijn Nest speakers alleen om mee te praten en dingen te regelen, maar voor jou kan dat anders zijn. Als je dat niet vervelend vindt of, net als ik, speciaal hiervoor een Nest speaker hebt staan, dan zijn er geen beren op de weg. Tot slot wordt er iedere keer, dat een melding gestuurd wordt, een geluid afgespeeld om aan te geven dat er een cast sessie gestart is. Dit is relatief makkelijk op te lossen, maar dit werkt niet zo goed samen met de automatiseringen hieronder. Ik heb dit zo goed mogelijk geprobeerd op te lossen, maar als je je Nest speaker ook gebruikt om muziek op af te spelen, zal de ervaring niet hetzelfde zijn.

In dit artikel zal ik je helpen om de volgende dingen te maken:

  • Een datum- en tijdsensor in iso-indeling om de tijd eenvoudig te berekenen
  • Een sensor die 15 minuten voor aanvang van de afspraak wordt ingeschakeld
  • Het script voor de daadwerkelijke aankondiging
  • Automatiseringen om de aankondiging te activeren op basis van tijd

Ik neem aan dat je al een agenda hebt ingesteld binnen je Home Assistant. Ik heb mijn Google Agenda verbonden. Instructies voor het koppelen van deze agenda vindt je in de documentatie van Home Assistant.

Verder gebruik ik de Cloud TTS-service van Nabu Casa voor meer natuurlijkere stemmen. Misschien geef jij de voorkeur aan een andere TTS-integratie, of gebruik je de standaard Google Translate TTS , die standaard is geactiveerd . Als dit het geval is, kan je de service en parameters in het onderstaande script wijzigen.

Datum- en tijdsensor

In de aankondiging maak ik gebruik van relatieve tijd. Bijvoorbeeld: ‘Je afspraak begint over 4 minuten.’ Om deze relatieve tijd makkelijk te kunnen berekenen, maak ik gebruik van de datum en tijd sensor in het ISO formaat. Deze sensor kan je toevoegen aan je configuration.yaml bestand. Bekijk voor details de Time and Date documentatie. Hieronder een voorbeeld met de minimale configuratie om de aankondigingen te laten werken:

# Voorbeeld datum- en tijdsensor in ISO formaat
sensor:
  - platform: time_date
    display_options:
      - 'date_time_iso'

Check na het toevoegen en opslaan je configuratie en herstart Home Assistant.

Aanvangssensor

In de attributen van de sensor voor je agenda is een optie voor een afwijking. Mijn ervaring is echter dat deze vaak niet zo nauwkeurig werkt als wenselijk is. Dit zorgt voor problemen met de automatisering die de aankondiging moet starten. Daarom heb ik mijn eigen binaire sensor gemaakt die een kwartier voor aanvang van de afspraak aan gaat. Deze kan je kopiéeren en plakken in je configuration.yaml bestand. Vergeet daarbij niet het entity ID van de agenda aan te passen.

# Binaire sensor voor een afwijking in de starttijd van je afspraak
binary_sensor:
  - platform: template
    sensors:
      agenda_afspraak_afwijking:
        value_template: "{{ (float(state_attr('calendar.JOUW_AGENDA', 'start_time') | as_timestamp()) - float(states.sensor.date_time_iso.state | as_timestamp())) | float > -59 and (float(state_attr('calendar.JOUW_AGENDA', 'start_time') | as_timestamp()) - float(states.sensor.date_time_iso.state | as_timestamp())) | float < 900 }}"

Deze sensor converteert de tijd van de ISO sensor hierboven en de starttijd van de afspraak in je agenda naar Unix tijd. Als deze tijd minder dan 900 en meer dan 59 seconde is, gaat de sensor aan.

Script voor de aankondiging

Nu is het tijd om het script dat de daadwerkelijke aankondiging regelt in je scripts.yaml bestand te plakken. Hieronder leg ik kort uit wat ik gemaakt heb en hoe het script op bepaalde elementen van afspraken reageert:

  • Als de afspraak nog moet starten, wordt er gesproken over 'je volgende afspraak' en de relatieve tijd in minuten wordt genoemd.
  • Als de afspraak nu start of al gestart is, verdwijnt het woord 'volgende' uit de aankondiging en wordt vertelt dat de afspraak nu begint of hoe lang de afspraak al bezig is in minuten.
  • Als de locatie van de afspraak de term FaceTime, Google Duo, Online, Teams, WhatsApp of Zoom bevat, wordt er bijvoorbeeld gesproken over 'je volgende Zoom afspraak. Als de locatie het woord 'Telefonisch' bevat, wordt er gesproken over 'Je telefonische afspraak'.
  • Als één van de termen in het punt hierboven niet in de locatie staat, wordt de locatie na de relatieve starttijd genoemd. Als er niks bij de locatie is ingevuld, wordt dit overgeslagen.
  • Als er iets bij de notities van de afspraak is ingevuld, wordt deze helemaal aan het einde voorgelezen.

Het script voor de daadwerkelijke aankondiging is hieronder te vinden. Nadat je de entity ID voor je eigen agenda en mediaspeler hebt gewijzigd, kan je deze rechtstreeks in je script.yaml plakken.

volgende_agenda_afspraak_aankondigen:
  alias: volgende agenda-afspraak aankondigen
  sequence:
  - service: tts.cloud_say
    data_template:
      entity_id: media_player.JOUW_MEDIAPLAYER
      message: "{% set event_name = state_attr('calendar.JOUW_AGENDA', 'message') %}{% set event_location = state_attr('calendar.JOUW_AGENDA', 'location') %}{% set event_start = ((float(state_attr('calendar.JOUW_AGENDA', 'start_time') | as_timestamp()) - float(states('sensor.date_time_iso') | as_timestamp())) / 60) %}{% set event_started = ((float(states('sensor.date_time_iso') | as_timestamp()) - float(state_attr('calendar.JOUW_AGENDA', 'start_time') | as_timestamp())) / 60) | round(0) %}{% set event_description = state_attr('calendar.JOUW_AGENDA', 'description') %}Je {% if event_start | float > 0 %}volgende {% endif %}{% if 'Teams' in event_location or 'Online' in event_location or 'FaceTime' in event_location or 'Zoom' in event_location or 'WhatsApp' in event_location or 'Google Duo' in event_location %}{{ event_location }} {% elif 'Telefonisch' in event_location %}telefonische {% endif %}afspraak, {{ event_name }}, {% if event_start | float < 0 %}is {% if event_started == 1 %}1 minuut{% else %}{{ event_started | round(0) }} minuten{% endif %} geleden begonnen.{% else %}start {% if event_start == 0 %}nu.{% else %}over {% if event_start == 1 %}1 minuut{% else %}{{ event_start | round(0) }} minuten{% endif %}.{% endif %}{% endif %}{% if not (is_state_attr('calendar.JOUW_AGENDA', 'location', '') or 'Teams' in event_location or 'Online' in event_location or 'FaceTime' in event_location or 'Zoom' in event_location or 'WhatsApp' in event_location or 'Google Duo' in event_location or 'Telefonisch' in event_location) %} De locatie van deze afspraak is {{ event_location }}.{% endif %}{% if not is_state_attr('calendar.JOUW_AGENDA', 'description', '') %} {{ event_description }}{% endif %}"
      language: en-US
      options:
        gender: male
  mode: single

Automatiseringen

Voor we starten met de automatiseringen, vergeet niet eerst je template entities en je scripts te herladen. Dit doe je bij Configuratie > Herstarten. Als de log geen fouten bevat, kan je de twee onderstaande automatiseringen naar je automations.yaml kopiéren of ze plakken in een nieuwe automatisering via de yaml modus in de interface.

Wanneer een volgende afspraak bijna begint

De eerste automatisering wordt gestart wanneer de sensor met de afwijking aan gaat; dus 15 minuten voor je afspraak begint. Hierbij wordt gecontroleerd of er niet al een andere afspraak bezig is. Een verbale herinnering voor je volgende afspraak is in zo een geval niet gewenst.

- alias: Aankondiging - Volgende agenda afspraak
  description: ''
  trigger:
  - platform: state
    entity_id: binary_sensor.agenda_afspraak_afwijking
    from: 'off'
    to: 'on'
  condition:
  - condition: state
    entity_id: calendar.JOUW_AGENDA
    state: 'off'
  action:
  - service: script.volgende_agenda_afspraak_aankondigen
    data: {}
  mode: single

Wanneer een volgende afspraak nu begint of al begonnen is

Helaas is de integratie voor de Google Agenda niet zo precies als ik graag gezien had. Hierdoor kan het gebeuren dat twee afspraken die tegen elkaar aan gepland zijn, niet meteen geladen worden of de sensor met de afwijking niet aan gaat. Om toch een aankondiging te starten in deze situaties, heb ik onderstaande automatisering gemaakt die wordt gestart als de naam van een afspraak wordt bijgewerkt, terwijl die afspraak al bezig is.

- alias: Aankondiging - Volgende agenda afspraak start
  description: ''
  trigger:
  - platform: state
    entity_id: calendar.JOUW_AGENDA
    attribute: message
  - platform: state
    entity_id: calendar.JOUW_AGENDA
    from: 'off'
    to: 'on'
  condition:
  - condition: state
    entity_id: binary_sensor.agenda_afspraak_afwijking
    state: 'off'
  - condition: state
    entity_id: calendar.JOUW_AGENDA
    state: 'on'
  action:
  - service: script.volgende_agenda_afspraak_aankondigen
    data: {}
  mode: single

Als je deze beide automatiseringen in je Home Assistant hebt geplaatst, kan je ze uitvoeren om te testen of het werkt. Als je ze hebt toegevoegd aan je automations.yaml bestand, vergeet dan niet om eerst je automatiseringen te herladen.

Het cast-geluidje verwijderen

Als je, net als ik, denkt over meer aankondigingen, dan is het geluidje dat je hoort bij het starten van een cast-sessie op een Google Nest speaker erg vervelend. Gelukkig is er met Home Assistant een makkelijke manier om dat geluidje weg te krijgen. Ik vond de oplossing in dit topic van het Home Assistant forum. Na vijf minuten inactief geweest te zijn, wordt de cast-sessie beëindigd. De truc is dus om om de paar minuten een stil bestand af te laten spelen om de cast-sessie actief te houden. Op die manier geen startgeluiden meer bij het casten van een geluidsbestand.

Er zijn een aantal haken en ogen aan deze automatisering, zoals het onderbreken van muziek of aankondigingen. In de automatisering hieronder heb ik daar rekening mee gehouden. Het stille geluidsbestand staat daaronder.

# Automatisering om cast sessie actief te houden
-  alias: Hou cast actief
  description: ''
  trigger:
  - platform: time_pattern
    hours: '0'
    minutes: '2'
    seconds: '20'
  - platform: state
    entity_id: media_player.JOUW_MEDIASPELER
    from: playing
    for: 00:04:30
  - platform: state
    entity_id: media_player.JOUW_MEDIASPELER
    from: unavailable
  - platform: state
    entity_id: media_player.JOUW_MEDIASPELER
    to: 'off'
    for: 00:00:30
  condition:
  - condition: template
    value_template: "{{ not is_state('media_player.JOUW_MEDIASPELER', 'playing' }}"
  action:
  - service: media_player.play_media
    data:
      entity_id: media_player.JOUW_MEDIASPELER
      media_content_id: https://YOUR_HA.ADDRESS/local/silence.mp3
      media_content_type: audio/mp3
  mode: single

Het bestand met stilte kan je hieronder downloaden. Dit bestand plaats je in de map 'www' in de map waar ook je configuration.yaml staat. Het is het makkelijkste te doen via Samba. Deze video van Smart Home Junkie legt goed uit hoe je dat instelt.

Download silence.zip (2 KB)

Aankondigingsbel

De aankondigingsbel die hoorbaar is in het filmpje bovenaan de pagina is op zichzelf een heel artikel waard. Mocht je toch graag gebruik maken van deze bel, dan kan je de volgende regels toevoegen bovenaan het gedeelte 'actions' van beide automations:

  - service: media_player.play_media
    data:
      entity_id: media_player.YOUR_MEDIA_PLAYER
      media_content_id: https://YOUR_HA.ADDRESS/local/chime.mp3
      media_content_type: audio/mp3
  - wait_template: '{{ is_state(''media_player.JOUW_MEDIASPELER'', ''playing'') }}'
  - wait_template: '{{ is_state(''media_player.JOUW_MEDIASPELER'', ''idle'') }}'

De bel kan je hieronder downloaden en dien je wederom in de 'www' map te plaatsen.

Download chime.zip (41 KB)

Geen aankondigingen als er al iets aan het afspelen is

Als je geen agenda aankondigingen wilt wanneer er al iets aan het afspelen is op je Nest speaker, voeg je de volgende voorwaarde toe aan je automatiseringen:

  - condition: template
    value_template: "{{ not is_state('media_player.JOUW_MEDIASPELER', 'playing') }}"

Hou het volgende in gedachte

Wanneer je gebruik maakt van de doelen functionaliteit van Google Agenda, wordt er aan het einde van de aankondiging een tekst voorgelezen met een waarschuwing over het wijzigen van de afspraak. Deze mededeling staat in de notities van de afspraak en kan je makkelijk voorkomen door deze als voorwaarde toe te voegen bij de aankondiging.

{% if not 'functie Doelen' in state_attr('calendar.JOUW_AGENDA', 'description' %}

Dit zelfde kan je doen met tal van andere zaken, zoals reisadviezen of bepaalde afspraken uitsluiten van deze aankondigingen.

Tot slot kan het handig zijn om de automatiseringen van de aankondigingen op je dashboard te zetten of het mogelijk te maken ze allebei te gelijk uit te zetten met een input boolean. Ik kan me voorstellen dat er momenten zijn waarop je je agenda aankondigingen niet wilt horen.

Dit is alles! Als het goed is heb je nu je eigen gesproken agenda aankondigingen op je Google Nest speaker. Kom je er niet uit, heb je vragen of verbeteringen of heb je een ander doel voor je aankondigingen? Ik hoor ze heel graag in de reacties! 😄