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.