Voice Assistant local - dodawanie przypomnienia

To kolejny post z moich zabaw z VA. Podczas pracy nad wpisywaniem do kalendarza zauważyłem pewien problem. Trzeba powiedzieć długie zdanie w mniej lub bardziej odpowiedni sposób. Wydaje się, że lepiej podzielić takie zdania na dwa, Nazwałem do sentencją 2-krokową. I zacząłem pracę nad dodawaniem przypomnień. Z założenia miało to działać w ten sposób, że ustawiam przypomnienie na najbliższe godziny (uproszczenie w stosunku do kalendarza) a gdy jest wyznaczona godzina VA wywołuje mi te głosem (i np. powiadomienie na telefon) W opcji miał być też budzik. No i zacząłem zabawę, efekt raczej bardziej niż niezadawalający, Ale po kolei.
sentencje:

   AddReminderRel:
     data:
       # --- z dniem relatywnym ---
       - sentences:
           - "(ustaw | ustaw mi | dodaj | przypomnij | przypomnij mi) [mi] przypomnienie (na|w) {day_rel} [o|na] [godzin(ę|ie)] <time>"
           - "(ustaw | ustaw mi | dodaj | przypomnij | przypomnij mi) [mi] przypomnienie (na|w) {day_rel} [o|na] [godzin(ę|ie)] <time>"
           - "(ustaw | ustaw mi | dodaj | przypomnij | przypomnij mi) [mi] przypomnienie (na|w) {day_rel} [o|na] [godzin(ę|ie)] <time>"
           - "(ustaw | ustaw mi | dodaj | przypomnij | przypomnij mi) [mi] przypomnienie (na|w) {day_rel} [o|na] [godzin(ę|ie)] <time>"

      # --- bez dnia (skrypt zdecyduje: dziś czy jutro) ---
       - sentences:
           - "(ustaw | ustaw mi | dodaj | przypomnij | przypomnij mi) [mi] przypomnienie [na|o]  [godzin(ę|ie)] <time>"
           - "(ustaw | ustaw mi | dodaj | przypomnij | przypomnij mi) [mi] przypomnienie [na|o]  [godzin(ę|ie)] <time>"
           - "(ustaw | ustaw mi | dodaj | przypomnij | przypomnij mi) [mi] przypomnienie [na|o]  [godzin(ę|ie)] <time>"
           - "(ustaw | ustaw mi | dodaj | przypomnij | przypomnij mi) [mi] przypomnienie [na|o]  [godzin(ę|ie)] <time>"


Intent_script

AddReminderRel:
    description: "Przypomnienie 2‑krokowe"
    action:
      # ===== KROK 1: policz termin =====
      - variables:

          # rzutowania; gdy brak <time> – domyślnie 09:00
          hour_i: "{{ (hour | int(9)) if (hour is not none) else 9 }}"
          minute_i: "{{ (minute | int(0)) if (minute is not none) else 0 }}"
          hhmmss: "{{ '%02d:%02d:00' | format(hour_i, minute_i) }}"

          # dzień relatywny → offset
          rel: "{{ day_rel | default('today') }}"
          day_offset: >-
            {% if rel == 'tomorrow' %} 1
            {% elif rel == 'day_after_tomorrow' %} 2
            {% elif rel == 'today' %} 0
            {% endif %}


          # datetime bez stałych sekund (odporne na DST/koniec m‑ca/roku)??
          base_dt: "{{ today_at(hhmmss) + timedelta(days=day_offset) }}"
          due_dt_obj: >-
            {% set dt = base_dt %}
            {% if rel in ['', 'today'] and dt < now() %}
              {{ dt + timedelta(days=1) }}
            {% else %}
              {{ dt }}
            {% endif %}
          # string z sekundami – najpewniejszy dla todo.add_item
          due_dt_final: "{{ (as_timestamp(due_dt_obj) | timestamp_custom('%Y-%m-%d %H:%M:%S', true)) }}"

      - service: script.turn_on
        target:
          entity_id: script.przypomnienie
        data:
          variables:
            data_time: "{{ due_dt_final }}"
 

I do tego skrypt (na końcu wyjaśnię dlaczego)

przypomnienie:
  alias: przypomnienie
  mode: single
  fields:
    data_time: {}
#    sat_dev_id: {}
  sequence:
  - action: assist_satellite.ask_question
    continue_on_error: true
    target:
      entity_id: assist_satellite.home_assistant_voice_main_urzadzenie_asystenta_glosowego
    data:
      preannounce: false
      question: Jaki tekst przypomnienia?
      answers:
      - id: 'true'
        sentences:
        - tak
      - id: 'false'
        sentences:
        - nie
    response_variable: odpowiedz
  - action: todo.add_item
    target:
      entity_id: todo.przypomnienia
    data:
      description: 'Utworzono głosem '
      due_datetime: '{{ data_time }}'
      item: '{{ odpowiedz.sentence }}'
  - action: assist_satellite.announce
    data:
      entity_id: assist_satellite.home_assistant_voice_main_urzadzenie_asystenta_glosowego
      preannounce: true
      message: Ustawiono przypomnienie {{ odpowiedz.sentence }}      
 

Jak to działa. Po sentencji “ustaw przypomnienie na jutro na 15:15” VA pyta się o tekst przypomnienia - mówimy a on zapisuje w liście “przypomnienia”,
Jak robiłem to wszystko w intent_script to po prostu mi nie działało. Zatrzymywało się i koniec. Nie potrafię tego wyjaśnić. Ale pojawił się pomysł na oddzielenie tego na dwa różne etapy i zadziałało. Może nie do końca , bo działa na “jutro” i “pojutrze” a na “dzisiaj” nie działa. Nie mogę znaleźć błędu. Może bym szukał dalej, ale postanowiłem zrobić trzeci krok. Automatyzacje, która za pomocą VA przypominałaby mi o tych zadaniach - no i klops. Nie znalazłem możliwości wywołania skryptu czy czegokolwiek za pomocą listy zadań. Jakoś o tym wcześniej nie pomyślałem.
Jak widzicie potrzebuje pomocy. Doszedł jeszcze inny problem. W przypadku oddzielenia takiej “rozmowy” na dwa etapy, robi się kłopot gdy w domu są dwa lub więcej urządzeń VA. Bo skrypt musi wiedzieć do jakiego urządzenia zadać pytanie. Tego również nie potrafiłem zrobić. Przyszedł mi do głowy dosyć prosty sposób, ale wymagający dopisku do konfiguracji yaml samych urządzeń. Zrobić pomocnika input_text , do którego swój id zapisywałoby urządzenie w tym momencie aktywne. W skrypcie można by to odczytać. Ale nie wydaje mi się, że to dobry pomysł, i w związku z tym kolejna prośba o pomoc.

Cześć! Słuchaj świetny pomysł z tym dialogiem dwuetapowym (chyba dobze podpowiadam). Standardowe systemy są “głuche” na kontekst po zakończeniu pierwszej komendyty to przeskoczyłeś skryptem i to jest super kierunek.

Przeanalizowałem kody i mam dla Ciebie gotowe rozwiązania na te “klopsy” o których wspomniałeś.

1. Dlaczego to “dzisiaj” Cię nie słucha?

Problem leży w matematyce czasu w intent_script. Kiedy mówisz “dzisiaj”, day_offset wynosi 0. Jeśli godzina, którą podajesz, już minęła (np. jest 16:05, a chcesz przypomnienie na 16:00), Twój kod dodaje jeden dzień i przeskakuje na jutro. Ale najważniejsze: upewnij się, że twoje sentencje poprawnie przekazują wartości do slotow.

Zmień logikę obliczania czasu na prostszą i bardziej odporną:

# Wewnątrz intent_script
data_time: >
  {% set h = hour | int(9) %}
  {% set m = minute | int(0) %}
  {% set offset = {"today": 0, "tomorrow": 1, "day_after_tomorrow": 2}.get(day_rel, 0) %}
  {% set t = today_at("%02d:%02d:00" | format(h, m)) + timedelta(days=offset) %}
  {{ t.strftime('%Y-%m-%d %H:%M:%S') }}

2. Problem wielu urządzeń (Satelity)

Zapomnij o input_text i zapisywaniu ID ręcznie. Home Assistant wie, kto do niego mówi! W intent_script ukryty jest obiekt _intent.device_id. Przekażemy go po rostu do skryptu jako zmienną.

Poprawka w intent_script:

AddReminderRel:
  action:
    - service: script.przypomnienie
      data:
        data_time: "..." # (tutaj kod czasu powyżej)
        voice_device_id: "{{ _intent.device_id }}"

Poprawk w skrypcie przypomnienie: Zamiast wpisanej na sztywno encji satelity, użyj device_id:

- action: assist_satellite.ask_question
  target:
    device_id: "{{ voice_device_id }}"
  data:
    question: Jaki tekst przypomnienia?

3. “Klops” z powiadomieniem (Jak to wywołać?)

Tu masz rację - lista todo to tylko “karta papieru”, ona sama nie zacznie mówić. Potrzebujesz “strażnika”, czyli automatyzacji, która co minutę sprawdza, czy termin jakiegś zadania właśnie nie nadszedł.

Oto gotowiec, który sprawdzi listę i przeczyta przypomnienie na głos:

automation:
  - alias: "Głosowe wywołanie przypomnień"
    trigger:
      - platform: time_pattern
        minutes: "/1"
    action:
      - action: todo.get_items
        target:
          entity_id: todo.przypomnienia
        data:
          status: needs_action
        response_variable: lista
      - repeat:
          for_each: "{{ lista['todo.przypomnienia']['items'] }}"
          sequence:
            - if:
                condition: template
                value_template: "{{ item.due and now() >= as_datetime(item.due) }}"
              then:
                - action: tts.speak 
                  target:
                    entity_id: tts.google_en_com # lub Twój TTS
                  data:
                    media_player_entity_id: media_player.glosnik_salonie
                    message: "Przypominam o: {{ item.summary }}"
                - action: todo.update_item
                  target:
                    entity_id: todo.przypomnienia
                  data:
                    item: "{{ item.summary }}"
                    status: completed

Moim zdaniem najpierw popraw przekazywanie voice_device_id. Dzięki temu Twój system stanie się inteligentny odpowie dokładnie w tym pokoju w którym stoisz bez żadnych dodatkowych pomocników tekstowych.

Dzięki @Allon za miłe słowa o samym pomyśle. Ale po kolei. Jeśli chodzi o dzisiaj/jutro to taki był zamysł, że jak powiem godzinę, która już minęła, to ma dodać przypomnienie na jutro. To takie naturalne. Ten problem na razie pominąłem. Wziąłem się za _intent.device_id i generalnie mi nie działa, wyrzuca “…nieoczekiwany błąd” jak próbuje to przetestować w szablonach - również błąd. Piszesz, że obiekt jest “ukryty” - to może trzeba mieć “coś” zaznaczone aby je móc wykorzystać? Jak się debuguje VA to widać to wszystko co jest potrzebne, ale nie mogę się do tego dobrać.

intent:
  engine: conversation.home_assistant
  language: pl
  intent_input: Ustaw przypomnienie na jutro na 9:15
  conversation_id: 01KFSVNKFMEBZAMRDZP0QSNJCW
  device_id: 1c30854c1257cbac1c9ddfb97fc86ff9
  satellite_id: assist_satellite.home_assistant_voice_main_urzadzenie_asystenta_glosowego
  prefer_local_intents: false
  done: true
  processed_locally: true
  intent_output:
    response:
      speech:
        plain:
          speech: Podczas przetwarzania zapytania wystąpił nieoczekiwany błąd
          extra_data: null
      card: {}
      language: pl
      response_type: error
      data:
        code: unknown
    conversation_id: 01KFSVNKFMEBZAMRDZP0QSNJCW
    continue_conversation: false

Słuchaj, już widzę, gdzie leży pies pogrzebany. To klasyczny problem przy pracy z intent_script.

Obiek _intent jest dostępny tylko i wyłącznie w momencie, gdy prawdziwe urządzenie wywołuje intencje. Jeśli testujesz to w “Narzędziach deweloperskich → Szablony”, to tam ten obiekt nie istnieje stąd błąd. Ale co ważniejsze – w logu, który wkleiłeś, widać coś bardzo ciekawego.

Dlaczego masz “Nieoczekiwany błąd”?

W Twoim debugu VA widzę dwie kluczowe encje:

  1. device_id: 1c30854c... (to jest ID fizycznego urządzenia).
  2. satellite_id: assist_satellite.home_assistant... (to jest encja satelity).

Błąd występuje najprawdopodobniej dlatego, że próbujesz się dwołać do _intent.device_id wewnątrz sekcji variables lub data, a HA ma problem z parsowanie tego obiektu, jeśli któraś z wartości jest pusta lub źle zmpowana.

Jak to naprawić? (Prawidłowa składnia)

W intent_script nie używamy _intent bezpośredni w szablonach tak jak zwykłych zmiennych. Musisz to zrobic dokładnie w ten sposób, żeby system nie wyrzucił błędu “Unknown”:

AddReminderRel:
  action:
    - service: script.przypomnienie
      data:
        # Przekazujemy ID urządzenia, które wywołało komendę
        voice_device_id: "{{ _intent.device_id }}"
        # Możesz też przekazać satellite_id, jeśli wolisz operować na encjach
        voice_satellite_id: "{{ _intent.satellite_id }}"
        data_time: >
          {# Twój kod obliczania czasu #}`

Dlaczego “w szablonach” masz błąd?

W “Szablonach” nigdy teg nie przetestujesz bo tam nie ma kontekstu rozmowy. Żeby sprawdzić, czy to działa, musisz:

  1. Zapisać configuration.yaml.
  2. Przeładować Intencje/Skrypty.
  3. Powiedzieć to do urządzenia.

Moja podpowiedź: Sprytny “Fallback”

Żeby skrypt Ci się nie wywalł gdy testujesz go np. przyciskiem z interfejsu (gdzie nie ma device_id), dodaj domyśln wartość w skrypcie:

# W skrypcie przypomnienie
- action: assist_satellite.ask_question
  target:
    # Jeśli voice_device_id nie zostanie przekazane, użyje na sztywno głównego urządzenia
    device_id: "{{ voice_device_id | default('1c30854c1257cbac1c9ddfb97fc86ff9') }}"`

Jeszcze jedna rzecz – satellite_id vs device_id

W Twoim logu VA widać, że masz satellite_id. To jest super wiadomość! satellite_id to bezpośrednia nazwa encji (np. assist_satellite.moj_glosnik). Jest ona często łatwiejsa w użyciu niż długie ID urządzenia.

Spróbuj w intent_script przekazać to tak: sat_id: "{{ _intent.satellite_id }}"

A potem w skrypcie:

- action: assist_satellite.ask_question
  target:
    entity_id: "{{ sat_id }}"`

NIe do końca rozumie.
Mamy przekazywanie z STT zmiennych:
day_rel, hour, minute. Te zmienne wchodzą do intent_script.
Potem mamy zmienne przechodzące do skryptu.

AddReminderRel:
    description: "Przypomnienie 2‑krokowe"
    action:
      - service: script.turn_on
        target:
          entity_id: script.przypomnienie
        data:
        # Przekazujemy ID urządzenia, które wywołało komendę
          voice_device_id: "{{ _intent.device_id }}"
        # Możesz też przekazać satellite_id, jeśli wolisz operować na encjach
          voice_satellite_id: "{{ _intent.satellite_id }}"

Po data: zmienne przekazywane do skryptu. Ale żeby przekazać datę_time, trzeba w pierwszej kolejności ją obliczyć. Jak zrobimy tak:

AddReminderRel:
    description: "Przypomnienie 2‑krokowe"
    action:
      - service: script.turn_on
        target:
          entity_id: script.przypomnienie
        data:
        # Przekazujemy ID urządzenia, które wywołało komendę
          voice_device_id: "{{ _intent.device_id }}"
        # Możesz też przekazać satellite_id, jeśli wolisz operować na encjach
          voice_satellite_id: "{{ _intent.satellite_id }}"
          # rzutowania; gdy brak <time> – domyślnie 09:00
          hour_i: "{{ (hour | int(9)) if (hour is not none) else 9 }}"
          minute_i: "{{ (minute | int(0)) if (minute is not none) else 0 }}"
          hhmmss: "{{ '%02d:%02d:00' | format(hour_i, minute_i) }}"

          # dzień relatywny → offset
          rel: "{{ day_rel | default('today') }}"
          day_offset: >-
            {% if rel == 'tomorrow' %} 1
            {% elif rel == 'day_after_tomorrow' %} 2
            {% elif rel == 'today' %} 0
            {% endif %}


          # datetime bez stałych sekund (odporne na DST/koniec m‑ca/roku)??
          base_dt: "{{ today_at(hhmmss) + timedelta(days=day_offset) }}"
          due_dt_obj: >-
            {% set dt = base_dt %}
            {% if rel in ['', 'today'] and dt < now() %}
              {{ dt + timedelta(days=1) }}
            {% else %}
              {{ dt }}
            {% endif %}
          # string z sekundami – najpewniejszy dla todo.add_item
          due_dt_final: "{{ (as_timestamp(due_dt_obj) | timestamp_custom('%Y-%m-%d %H:%M:%S', true)) }}"

wtedy wszystkie te zmienne są przekazywane, to niby nic wielkiego, ale skrypt musi je odebrać choćby nic z nimi nie zrobił.

Próbuje robić testy i niestety gdy tylko pojawia się _intent… zawsze wyrzuca błąd

AddReminderRel:
    description: "Przypomnienie testy"
    action:
      - service: script.turn_on
        target:
          entity_id: script.przypomnienie_test
        data:
        # Przekazujemy ID urządzenia, które wywołało komendę
            voice_device_id: "{{ _intent.device_id }}"
        # Możesz też przekazać satellite_id, jeśli wolisz operować na encjach
            voice_satellite_id: "{{ _intent.satellite_id }}"
          # rzutowania; gdy brak <time> – domyślnie 09:00
            data_time: "2026-01-26 09:15:00"

przypomnienie_test:
  alias: przypomnienie_test
  mode: single
  sequence:
    - variables:
        time_var: '{{ data_time }}' 
        v_id: '{{ voice_device_id }}'
        sat_id: '{{ voice_satellite_id }}'
    - service: persistent_notification.create
      data:
        title: "DEBUG dane"
        message: "'{{ time_var }}' , '{{ v_id }}' , '{{ sat_id }}'"

lub w takiej wersji skryptu:

przypomnienie_test:
  alias: przypomnienie_test
  mode: single
  sequence:

    - service: persistent_notification.create
      data:
        title: "DEBUG dane"
        message: "'{{ data_time }}' , '{{ voice_device_id }}' , '{{ voice_satellite_id }}'"
 

W HA obiekt _intent nie jest dostepny jako zmienna globalna która można przekazać ot tak. Jeśli używasz service: script.turn_on tworzysz nowy proces który traci kontekst.

Musisz użyć bezpośredniego wywołania skrytu (składnia script.nazwa_skryptu) a nie usługi script.turn_on. To pozwala na poprawne przekazaie danych.

Nie licz daty w intent_script. Przekaż dane do skryptu i niech skrypt zajmie się obliczeniami. Dzięki temu intent_script będzie krótki odporny na błędy i łatwiejszy do debugu.

W intent_script używam script.przypomnienie_test bezpośrednio.

AddReminderRel:
  description: "Przypomnienie 2‑krokowe"
  action:
    - service: script.przypomnienie_test
      data:
        day_rel: "{{ day_rel | default('today') }}"
        hour: "{{ hour | int(9) }}"
        minute: "{{ minute | int(0) }}"
        # Pobieramy ID satelity
        voice_satellite_id: "{{ _intent.satellite_id }}"

W skrypcie przypomnienie_test: Tutaj robimy całą magię obliczeń. Używamy fields.

przypomnienie_test:
  alias: przypomnienie_test
  mode: single
  fields:
    day_rel:
      description: "Dzień relatywny"
    hour:
      description: "Godzina"
    minute:
      description: "Minuta"
    voice_satellite_id:
      description: "ID satelity"
  sequence:
    - variables:
        #  obliczenia daty
        hhmmss: "{{ '%02d:%02d:00' | format(hour, minute) }}"
        day_offset: >-
          {% if day_rel == 'tomorrow' %} 1
          {% elif day_rel == 'day_after_tomorrow' %} 2
          {% else %} 0
          {% endif %}
        base_dt: "{{ today_at(hhmmss) + timedelta(days=day_offset) }}"
        # logika
        due_dt_obj: >-
          {% if day_rel in ['today', ''] and base_dt < now() %}
            {{ base_dt + timedelta(days=1) }}
          {% else %}
            {{ base_dt }}
          {% endif %}
        data_time: "{{ due_dt_obj.strftime('%Y-%m-%d %H:%M:%S') }}"

    # testujemy czy mamy dane
    - service: persistent_notification.create
      data:
        title: "DEBUG VA"
        message: >
          Data: {{ data_time }}
          Satelita: {{ voice_satellite_id }}

@Allon to nie działa. Siedziałem nad tym długo i przerabiałem. To co przedstawiłem wyżej działa. Nawet testy gdzie nic nie robię, tylko próbuje przekazać “{{ _intent.satellite_id }}” - wyrzucają błędy. To samo, z wywołaniem skryptu - z jakiejś nieznanej mi przyczyny - wywołanie service: script.przypomnienie - powoduje, że w samym skrypcie nie wykonuje się już ask_question. Co do liczenia wszystkiego w skrypcie - racja, ale to tylko powoduje, że całość jest bardziej czytelna. Nad tym już nie siedzę. Będę siedział nad wywoływaniem tych przypomnieć - bo to też nie działa.

Generalnie zmieniła się koncepcja. Wydawało się, że pomysł z prostym przypomnieniem jest OK, ale wyszło jak zwykle. Kłopot z powiadomieniem o przypomnieniu jest “kłopotem na własne życzenie” . Wróciłem do mojej wersji dodawania do kalendarza. To działa i łatwo stworzyć automatyzacje, która te przypomnienia ogłasza na dostępne sposoby. Stworzyłem dedykowany kalendarz ‘przypomnienia’ i dodaje wydarzenia do niego. Przypomnienie ma ustalony czas trwania na 1 minutę.
I po kolei - sentencja się nie zmienia.
intent_script z lekką zmianą, bo trzeba dodać datę/czas końcowy

AddReminderRelCal:
  description: "Przypomnienie 2‑krokowe z kalendarzem"
  action:

      - variables:
        # --- Normalizacja day_rel: brak = '' (traktuj jak 'today') ---
          rel_raw: "{{ day_rel | default('') }}"
          rel: "{{ rel_raw | trim | lower }}"

        # Godzina/minuta; gdy brak -> domyślna 09:00
          hour_i: "{{ (hour | int(9)) if (hour is not none) else 9 }}"
          minute_i: "{{ (minute | int(0)) if (minute is not none) else 0 }}"
          hhmmss: "{{ '%02d:%02d:00' | format(hour_i, minute_i) }}"

        # Offset dni (zawsze liczba)
          day_offset: >-
            {% if rel == 'tomorrow' %} 1
            {% elif rel in ['day_after_tomorrow','day-after-tomorrow'] %} 2
            {% elif rel in ['today',''] %} 0
            {% else %} 0
            {% endif %}

        # --- TYLKO TIMESTAMPY, ŻADNYCH datetime/timedelta ---
        # Timestamp dla "dzisiaj o hh:mm:ss", lokalny
          today_ts_at_time: "{{ as_timestamp(today_at(hhmmss)) }}"

        # Bazowy timestamp + offset dni
          base_ts: "{{ today_ts_at_time + (day_offset | int) * 86400 }}"

        # Aktualny timestamp
          now_ts: "{{ as_timestamp(now()) }}"

        # Jeśli nie podano dnia ('') lub 'today' i godzina już minęła -> dodaj 1 dzień
          due_ts_start: >-
            {% if rel in ['','today'] and base_ts < now_ts %}
              {{ base_ts + 86400 }}
            {% else %}
              {{ base_ts }}
            {% endif %}
          due_ts_end: "{{ due_ts_start + 60 }}"
  
        # Finalny string (lokalny czas) dla usług; z sekundami
          due_dt_start_final: "{{ due_ts_start | timestamp_custom('%Y-%m-%d %H:%M:%S', true) }}"
          due_dt_end_final: "{{ due_ts_end | timestamp_custom('%Y-%m-%d %H:%M:%S', true) }}"

      - service: script.turn_on
        target:
          entity_id: script.przypomnienie_cal
        data:
         variables:
            data_time_start: "{{ due_dt_start_final }}"
            data_time_end: "{{ due_dt_end_final }}"

skrypt

przypomnienie_cal:
  alias: przypomnienie_cal
  mode: single
  fields:
    data_time_start: {}
    data_time_end: {}
  sequence:
  - action: assist_satellite.ask_question
    continue_on_error: true
    target:
      entity_id: "{{states( 'input_text.intent_device_id' )}}" 
    data:
      preannounce: false
      question: Jaka treść przypomnienia?
      answers:
      - id: 'true'
        sentences:
        - tak
      - id: 'false'
        sentences:
        - nie
    response_variable: odpowiedz

  - service: calendar.create_event
    target:
     entity_id: calendar.przypomnienia
    data:
      start_date_time: '{{ data_time_start }}'
      end_date_time: '{{ data_time_end }}'
      summary: '{{ odpowiedz.sentence }}'
       

  - action: assist_satellite.announce
    data:
      entity_id: "{{states( 'input_text.intent_device_id' )}}" 
      preannounce: true
      message: Ustawiono przypomnienie {{ odpowiedz.sentence }}  

Automatyzacje każdy może zrobić jak chce.
Kolejnymi etapami będą:

  • dodawanie przypomnienia na dowolny dzień roku (nie tylko dziś, jutro, pojutrze)
  • budzik, to wszystko będzie tak samo, ale gdy w sentencji będzie “ustaw budzik” to ustawimy przypomnienie “budzik” w naszym kalendarzu a w automatyzacji zamiast wypowiedzenia sentencji będzie dźwięk budzika.

Wpisy do kalendarza również zrobię 2-krokowo.
Nie będę o tym już tutaj pisał, chyba że:

  • ktoś mnie wywoła do tablicy;
  • znajdę sposób na identyfikacje _intent_device_id.
  • albo pojawi się nowa koncepcja.