To będzie mój drugi temat z prób z Voice Assistant. Wcześniej był o zmianie programów w TV. Jest tutaj.
Podaje link, bo tam jest kilka zdań jak mam skonfigurowany VA. Generalnie szukam na VA bardziej przydatnych funkcji, jednak cały czas w oparciu na lokalnym asystencie, bez AI. Przyszła pora na wpis do kalendarza. To w/g mnie przydatna funkcja, aby na szybko coś zapisać aby nie zapomnieć.
Po kolei - sentencja (w custom_sentences/pl)
AddCalendarEvent:
data:
- sentences:
- "dodaj do kalendarza {event} <date> [(o|na) [godzin(ę|ie)] <time>]"
- "dodaj {event} do kalendarza <date> [(o|na) [godzin(ę|ie)] <time>]"
- "zapisz w kalendarzu {event} <date> [(o|na) [godzin(ę|ie)] <time>]"
- "dodaj do kalendarza <date> {event} [(o|na) [godzin(ę|ie)] <time>]"
- "zapisz w kalendarzu <date> {event} [(o|na) [godzin(ę|ie)] <time>]"
expansion_rules:
date: "{day}{month_num}"
# H, H:MM, H.MM, H MM
time: "{hour}[:{minute}]|{hour}[.{minute}]|{hour}[ {minute}]|{hour}"
lists:
# <<< dowolny tekst
event:
wildcard: true
month_num:
values:
- in: "stycznia"
out: "01"
- in: "lutego"
out: "02"
- in: "marca"
out: "03"
- in: "kwietnia"
out: "04"
- in: "maja"
out: "05"
- in: "czerwca"
out: "06"
- in: "lipca"
out: "07"
- in: "sierpnia"
out: "08"
- in: "września"
out: "09"
- in: "października"
out: "10"
- in: "listopada"
out: "11"
- in: "grudnia"
out: "12"
Tutaj można się wykazać całą masą innych pomysłów. Zamiana miesiąca na numer w tym miejscu jest prostsza niż robienie tego w skrypcie. Może również przydać się w innych komendach, których jeszcze nie wymyśliłem.
Kolej na intens_script:
AddCalendarEvent:
speech:
text: "OK"
action:
- variables:
calendar_entity: "calendar.kalendarz" # <-- PODMIEŃ NA SWÓJ
year: "{{ now().year }}"
# czas istnieje już wtedy, gdy jest jakakolwiek godzina (minuty opcjonalne)
has_time: "{{ (hour|string|trim) != '' }}"
day_i: "{{ day|int(0) }}"
day_ok: "{{ 1 <= day_i <= 31 }}"
# rzutowania
hour_i: >-
{% if has_time %}
{{ (hour|string|trim|replace(',', '.')|float|int) }}
{% else %} 0 {% endif %}
minute_i: >-
{% if has_time and (minute|string|trim) != '' %}
{{ (minute|string|trim|replace(',', '.')|float|int) }}
{% else %} 0 {% endif %}
date_str: "{{ '%04d-%s-%s' % (year, month_num, day) }}"
start_dt_str: >-
{% if has_time %}{{ date_str ~ ' ' ~ '%02d:%02d:00'|format(hour_i, minute_i) }}{% else %}{{ '' }}{% endif %}
end_dt_str: >-
{% if has_time %}
{{ (as_datetime(date_str ~ ' ' ~ '%02d:%02d:00'|format(hour_i, minute_i)) + timedelta(minutes=60)).strftime('%Y-%m-%d %H:%M:%S') }}
{% else %}{{ '' }}{% endif %}
# all-day: end = start + 1 dzień (string!)
end_date_all_day_str: "{{ (as_datetime(date_str) + timedelta(days=1)).strftime('%Y-%m-%d') }}"
- choose:
# Wariant Z GODZINĄ
- conditions:
- condition: template
value_template: "{{ has_time and day_ok }}"
sequence:
- service: calendar.create_event
target:
entity_id: "{{ calendar_entity }}"
data:
summary: "{{ event | trim }}"
start_date_time: "{{ start_dt_str }}" # "YYYY-MM-DD HH:MM:SS"
end_date_time: "{{ end_dt_str }}"
default:
# Wariant CAŁODNIOWY
- condition: template
value_template: "{{ day_ok }}"
- service: calendar.create_event
target:
entity_id: "{{ calendar_entity }}"
data:
summary: "{{ event | trim }}"
start_date: "{{ date_str }}" # "YYYY-MM-DD"
end_date: "{{ end_date_all_day_str }}" # "YYYY-MM-DD" (start+1)
Proszę o wybaczenie wszystkich programistów, ja tego skryptu nie pisałem, to wynik nierównej walki z AI. Udało się chyba po godzinie.
Dodatkowe wyjaśnienia. Od razu przyjąłem pewne uproszczenia. Jak nie podamy godziny, to tworzy się wydarzenia całodzienne. Nie ma możliwości (oczywiście tylko u mnie) zrobić jakiegoś powtórzenie (np. co rok) . Jak podamy godzinę, to z góry zakładamy, że wydarzenia trwa 60 minut. Generalnie działa.
To wszystko ma na celu stworzenie przydatnego asystenta. Kolejne pomysły już są w głowie…