Pokazywanie postów oznaczonych etykietą Else. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Else. Pokaż wszystkie posty

5 listopada 2014

Profil: Głosowe wysyłanie wiadomości SMS

Dziś przedstawię kolejny profil, w którym główne skrzypce odgrywa komunikacja głosowa z urządzeniem. Dokładnie chodzi o podyktowanie i wysłanie wiadomości SMS tylko za pomocą głosu.
Profil uruchamia się następującymi komendami głosowymi:

  • wyślij wiadomość do Jan Kowalski
  • wyślij sms do Jan Kowalski
  • wyślij smsa do Jan Kowalski
  • wiadomość do Jan Kowalski
  • sms do Jan Kowalski
przy założeniu, że wysłać ma wiadomość do kontaktu Jan Kowalski.
Po uruchomieniu profil sprawdza czy w kontaktach znajduje się kontakt o podanej nazwie oraz czy kontakt ten ma wpisany numer telefonu komórkowego następnie prosi użytkownika o podyktowanie treści wiadomości i jeśli użytkownik zatwierdzi jej poprawność wysyła ją do odbiorcy. W przypadku braku zatwierdzenia poprawności treści wiadomości profil proponuje ponowne jej podyktowanie.

Wymagania

  • wtyczka AutoVoice w wersji płatnej
  • wtyczka AutoContacts w wersji płatnej
  • generator głosu Text-To-Speech, przykładowo IVONA lub Google TTS
  • do poprawnego działania profilu niezbędny jest porządek w książce adresowej tzn. numery telefonów komórkowych muszą być opisane jako komórka

Opis wykonania

Profil uruchamiany jest za pomocą kontekstu AutoVoice Recognized z zaznaczoną opcją Event Behavior, Use Regex i filtrem komendy ustawionym na (?:wyślij )?(?:wiadomość|sms[a]?) do (?<contact>.*).

W tym miejscu spróbuję rozszyfrować ten zapis. Jest to wyrażenie regularne, które pozwala wywołać uruchomienie profilu kilkoma komendami głosowymi według powyższego schematu.
Wyrażenie (?:wyślij )? oznacza, że w komendzie może ale nie musi pojawić się słowo wyślij ze spacją po nim. Ostatni znak zapytania gwarantuje to, że słowo wyślij nie jest obligatoryjne. Dzięki temu profil można uruchomić komendą wyślij wiadomość do Jan Kowalski ale również wiadomość do Jan Kowalski.
Zestaw znaków (?: ) tworzy grupę, która w tym przypadku ma tylko jeden element czyli wyślij .
Następna część wyrażenia regularnego (?:wiadomość|sms[a]?) tworzy kolejną grupę, która ma dwa elementy oddzielone znakiem |. Zapis sms[a]? oznacza słowo sms oraz jeden znak a, który może ale nie musi wystąpić. Dzięki temu profil zostanie uruchomiony komendą wyślij sms do Jan Kowalski ale także wyślij smsa do Jan Kowalski.
W końcu wyrażenie (?<contact>.*) tworzy parametr, który zostanie przekazany do Taskera w postaci zmiennej %contact czyli w tym przypadku w tej zmiennej znajdzie się wartość Jan Kowalski.
Task zadania zaczyna się od akcji AutoContacts ze zmienną %contact wpisaną w pole Contact Name or Nickname. Dzięki temu wtyczka wyszukuje w kontaktach przykładowego Jana Kowalskiego i wypełnia zmienne danymi jego kontaktu.
Następnie sprawdzana jest zmienna %acnumber, która powinna otrzymać wartość pierwszego numeru telefonu kontaktu. Jeśli nie ma nadanej wartości oznacza task powiadamia głosowo użytkownika o nieznalezieniu kontaktu i zatrzymuje dalsze akcje.
Kolejnym krokiem jest ustalenie, który numer telefonu jest numerem komórkowym. Jeśli numer komórkowy nie zostanie odnaleziony generowana jest głosowa informacja o błędzie, a task zostaje zatrzymany.

Następnie task głosowo prosi o podyktowanie treści wiadomości i za pomocą akcji AutoVoice Recognize rejestruje co powiedział użytkownik. Kolejnym krokiem jest głosowe odczytanie podyktowanej treści i pytanie czy treść jest poprawna. Jeśli użytkownik potwierdzi poprawność, wiadomość jest wysyłana za pomocą akcji Send SMS, w której w polu Number należy podać zmienną %komórka, a w polu Message %sms. Jeśli użytkownik nie potwierdzi poprawności smsa, task proponuje ponowne podyktowanie wiadomości i wraca do prośby o podyktowanie jej treści.

Rozpisany profil

Profile: Wyślij SMS (193)

State: AutoVoice Recognized [ Configuration:Event Behaviour: true
Command: "(?:wyślij )?(?:wiadomość|sms[a]?) do (?<contact>.+) (regex)" ]
Enter: Anon (200)
A1: AutoContacts [ Configuration:Contact Name or Nickname: %contact Package:com.joaomgcd.autocontacts Name:AutoContacts Timeout (Seconds):1000 Continue Task After Error:On ]
A2: If [ %acnumber !Set ]
A3: Say [ Text:Nie znaleziono kontaktu %contact Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]
A4: Stop [ With Error:Off Task: ]
A5: End If
A6: Variable Split [ Name:%acallnumbers1 Splitter:, Delete Base:Off ]
A7: Variable Split [ Name:%acallnumbertypes1 Splitter:, Delete Base:Off ]
A8: Variable Set [ Name:%index To:%acallnumbertypes1(#?Komórka) Do Maths:Off Append:Off ]
A9: Variable Split [ Name:%index Splitter:, Delete Base:Off ] If [ %index !~ 0 ]
A10: Variable Set [ Name:%komórka To:%acallnumbers1(%index1) Do Maths:Off Append:Off ] If [ %index !~ 0 ]
A11: If [ %komórka !Set ]
A12: Say [ Text:Nie znaleziono numeru komórkowego kontaktu %acname Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]
A13: Stop [ With Error:Off Task: ]
A14: End If
<podyktuj>
A15: Say [ Text:Podyktuj wiadomość po sygnale. Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]
A16: Variable Clear [ Name:%avcomm Pattern Matching:Off ]
A17: AutoVoice Recognize [ Configuration:
Voice command without headset
Command: "all" Package:com.joaomgcd.autovoice Name:AutoVoice Recognize Timeout (Seconds):120 ]
A18: Goto [ Type:Action Label Number:1 Label:podyktuj ] If [ %avcomm !Set ]
A19: Variable Set [ Name:%sms To:%avcomm Do Maths:Off Append:Off ]
A20: Say [ Text:Czy chcesz wysłać wiadomość do %acname o treści: %sms? Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]
A21: AutoVoice Recognize [ Configuration:
Voice command without headset
Command: "all" Package:com.joaomgcd.autovoice Name:AutoVoice Recognize Timeout (Seconds):120 ]
A22: If [ %avcomm ~ tak ]
A23: Send SMS [ Number:%komórka Message:%sms Store In Messaging App:On ]
A24: Say [ Text:Wiadomość wysłana. Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]
A25: Else
A26: Say [ Text:Czy chcesz poprawić wiadomość? Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:Off Network:Off Continue Task Immediately:Off ]
A27: AutoVoice Recognize [ Configuration:
Voice command without headset
Command: "all" Package:com.joaomgcd.autovoice Name:AutoVoice Recognize Timeout (Seconds):120 ]
A28: Goto [ Type:Action Label Number:9 Label:podyktuj ] If [ %avcomm ~ tak ]
A29: End If

Pobieranie profilu

Profil Głosowe wysyłanie wiadomości sms [Tasker 4.5u1]

4 października 2014

Profil: Głosowe wybieranie numerów

Dziś mniej teorii, a więcej praktyki. Zajmiemy się profilem, który umożliwi głosowe wybieranie numerów kontaktów i inicjowanie połączenia głosowego. Niestety sam Tasker nie pozwoli zrealizować takiego profilu. Pomocne będą wtyczki AutoContacts i AutoVoice.
Profil ma za zadanie odnaleźć dany kontakt w książce adresowej, odczytać jego numery telefonów, zapytać użytkownika, na który numer chce zadzwonić i wywołać połączenie.

Wymagania

  • wtyczka AutoVoice w wersji płatnej
  • wtyczka AutoContacts w wersji płatnej
  • generator głosu Text-To-Speech, przykładowo IVONA lub Google TTS
  • do poprawnego działania profilu niezbędny jest porządek w książce adresowej tzn. numery telefonów muszą być opisane jako komórka, domowy lub służbowy

Wtyczka AutoVoice

Wtyczka AutoVoice, w wielkim skrócie, pozwala na uruchamianie tasków Taskera za pomocą komend głosowych. Dzięki niej możemy oprogramować głosowo praktycznie wszystkie funkcje telefonu lub tabletu. Do prawidłowego działania wtyczka wymaga połączenia z internetem.

Instalacja i konfiguracja

Wtyczkę AutoVoice można pobrać ze sklepu Google Play. Po instalacji i wykupienia wersji Pro pozostaje wybór sposobu uruchamiania komend głosowych. Najprostszym rozwiązaniem jest dodanie na pulpit skrótu Recognize.

Trochę wygodniejszym rozwiązaniem jest uruchamianie tego skrótu gestem co można osiągnąć stosując alternatywne launchery np. Nova Launcher

Wtyczka AutoContacts

Wtyczka AutoContacts daje dostęp Taskerowi do kontaktów z książki adresowej. Dzięki niej możemy dotrzeć do numerów telefonów kontaktu, do którego chcemy zadzwonić.

Instalacja i konfiguracja

Wtyczkę AutoContacts można pobrać ze sklepu Google Play. Po instalacji i wykupienia wersji Pro należy w konfiguracji wtyczki uruchomić opcję Force Refresh Contacts co pozwoli odczytać z książki adresowej dane wszystkich kontaktów.
Aby łatwiej wybierać głosowo kontakty dobrze jest najczęściej używanym nadać ksywki. Po naciśnięcie opcji Manage Contacts w konfiguracji wtyczki i przytrzymaniu dłużej wybranego kontaktu możemy nadać mu ksywkę (opcja Set Nickname). Przykładowo kontaktowi Jan Kowalski nadanie ksywki Janka pozwoli na wykonanie połączenia telefonicznego do tego kontaktu poprzez wypowiedzenie komendy zadzwoń do Janka zamiast zadzwoń do Jan Kowalski.

Opis wykonania

Kontekstem uruchamiającym profil jest State / Plugin / AutoVoice Recognized. W konfiguracji kontekstu należy zaznaczyć opcję Event Behavior oraz Use Regex natomiast w polu Command Filter wpisać zadzwoń do (?<contact>.+). Taki zapis oznacza, że wszystko co zostanie wypowiedziane po zadzwoń do zostanie przekazane do tasku profila w postacie zmiennej %contact.

W edycji tasku zaczynamy od akcji Plugin / AutoContacts. W konfiguracji akcji w polu Contact Name or Nickname wpisujemy %contact czyli każemy wtyczce wyszukać dane kontaktu, którego nazwę/ksywkę dostarczymy w komendzie głosowej.
Następnie sprawdzamy za pomocą akcji If czy zmienna %acnunmber (czyli przechowująca numer telefonu odnalezionego kontaktu) ma wartość. Jeśli nie za pomocą akcji Say informujemy użytkownika o błędzie. Akcja Say używa generatora głosu Text-To-Speech by tekst zamienić na mowę.

Następnie musimy użyć akcji Variable Split, które dzielą ciągi tekstowe na części tworząc zmienną typu macierz. Jako, że AutoContacts poszczególne wartości oddziela przecinkami to w akcji Variable Split jako separatora użyjemy właśnie przecinka.
Zmienne %acallnumbers (wszystkie numery telefonów danego kontaktu) i %acallnumbertypes (typy numerów telefonów) są zmiennymi macierzowymi i mogą zawierać wyniki pochodzące od więcej niż jednego kontaktu. Dlatego odczytujemy tylko pierwsze rekordy podając parametr 1 lub (1).

Kolejnym krokiem jest przekazanie do zmiennej %index pozycji, na której znajdują się poszczególne typy numerów telefonów. W przypadku telefonu komórkowego będzie to %acallnumbertypes1(#?Komórka). Dalej za pomocą wyznaczonej wartości przekazujemy do zmiennej %komórka numer telefonu komórkowego za pomocą składni %acallnumbers1(%index1). Następnie powtarzamy te operacje dla telefonu domowego oraz służbowego.
Należy pamiętać, że w różnych wersjach producenckich systemu Android inaczej mogą być oznaczane typy numerów telefonów. W przypadku "czystego" Androida oraz wszelkich wersji bazujących na AOSP/CM będzie to odpowiednio: Komórka, Służbowy, Domowy. Jeśli w danym systemie oznaczenie te są inne (przykładowo w telefonach Samsunga numer telefonu komórkowego opisywany jest jako Komórkowy) należy zmienić je w akcjach numer 8, 11 i 14.
Kolejnym krokiem jest połączenie numerów telefonów ze zmiennych %komórka, %dom, %praca (pod warunkiem, że mają wartości) oddzielonych przecinkami do zmiennej %telefony za pomocą akcji Variable Set z zaznaczoną opcją Append. Teraz możemy zamienić tą zmienną w macierz i ilość jej elementów przekazać do zmiennej %index.

Jeśli wartość %index ma wartość 1 czyli kontakt ma tylko jeden numer telefonu za pomocą akcji Call wywołujemy połączenie głosowe pod dany numer.
Jeśli zmienna %index ma wartość większą od 1 za pomocą akcji Say pytamy użytkownika, na który numer ma być wykonane połączenie. Odpowiedź głosową rejestrujemy akcją AutoVoice Recognize, która trafia do zmiennej %avcomm. Następnie wywołujemy akcję Call pod wybrany numer w zależności od zawartości tej zmiennej.

I to już koniec. Profil gotowy. Na zrzutach ekranu powinien on wyglądać następująco:

Aby w przyszłości AutoContacts miał dostęp do dodanych i zmienionych kontaktów należy stworzyć profil, który będzie odświeżał dane wtyczki. U mnie taki profil uruchamia się codziennie o drugiej godzinie w nocy pod warunkiem podłączneia telefonu do ładowarki. W tasku tego profilu należy dodać akcję AutoContacts z zaznaczoną opcją Refresh.

Rozpisany profil

Profile: Zadzwoń do (195)
State: AutoVoice Recognized [ Configuration:Event Behaviour: true Command: "zadzwoń do (?<contact>.+) (regex)" ]
Enter: Anon (196)
A1: AutoContacts [ Configuration:Contact Name or Nickname: %contact Package:com.joaomgcd.autocontacts Name:AutoContacts Timeout (Seconds):1000 Continue Task After Error:On ]
A2: If [ %acnumber !Set ]
A3: Say [ Text:Nie znaleziono kontaktu %contact Engine:Voice:default:default Stream:5 Pitch:5 Speed:5 Respect Audio Focus:On Network:Off Continue Task Immediately:Off ]
A4: Stop [ With Error:Off Task: ]
A5: End If
A6: Variable Split [ Name:%acallnumbers1 Splitter:, Delete Base:Off ]
A7: Variable Split [ Name:%acallnumbertypes1 Splitter:, Delete Base:Off ] <komórka>
A8: Variable Set [ Name:%index To:%acallnumbertypes1(#?Komórka) Do Maths:Off Append:Off ]
A9: Variable Split [ Name:%index Splitter:, Delete Base:Off ] If [ %index !~ 0 ]
A10: Variable Set [ Name:%komórka To:%acallnumbers1(%index1) Do Maths:Off Append:Off ] If [ %index !~ 0 ] <praca>
A11: Variable Set [ Name:%index To:%acallnumbertypes1(#?Służbowy) Do Maths:Off Append:Off ]
A12: Variable Split [ Name:%index Splitter:, Delete Base:Off ] If [ %index !~ 0 ]
A13: Variable Set [ Name:%praca To:%acallnumbers1(%index1) Do Maths:Off Append:Off ] If [ %index !~ 0 ] <dom>
A14: Variable Set [ Name:%index To:%acallnumbertypes1(#?Domowy) Do Maths:Off Append:Off ]
A15: Variable Split [ Name:%index Splitter:, Delete Base:Off ] If [ %index !~ 0 ]
A16: Variable Set [ Name:%dom To:%acallnumbers1(%index1) Do Maths:Off Append:Off ] If [ %index !~ 0 ]
A17: Variable Set [ Name:%telefony To:komórka, Do Maths:Off Append:Off ] If [ %komórka Set ]
A18: Variable Set [ Name:%telefony To:dom, Do Maths:Off Append:On ] If [ %dom Set ]
A19: Variable Set [ Name:%telefony To:praca, Do Maths:Off Append:On ] If [ %praca Set ]
A20: Variable Split [ Name:%telefony Splitter:, Delete Base:Off ]
A21: Variable Set [ Name:%index To:%telefony(#) Do Maths:Off Append:Off ]
A22: If [ %index = 1 ]
A23: Call [ Number:%komórka Auto Dial:On ] If [ %komórka Set ]
A24: Call [ Number:%dom Auto Dial:On ] If [ %dom Set ]
A25: Call [ Number:%praca Auto Dial:On ] If [ %praca Set ]
A26: Else
A27: Say [ Text:Na który numer %acname chcesz zadzwonić: %telefony Engine:Voice:default:default Stream:3 Pitch:5 Speed:5 Respect Audio Focus:On Network:Off Continue Task Immediately:Off ]
A28: AutoVoice Recognize [ Configuration: Voice command without headset Command: "all" Package:com.joaomgcd.autovoice Name:AutoVoice Recognize Timeout (Seconds):120 ]
A29: Call [ Number:%komórka Auto Dial:On ] If [ %avcomm ~ *komórka* ]
A30: Call [ Number:%dom Auto Dial:On ] If [ %avcomm ~ *dom* ]
A31: Call [ Number:%praca Auto Dial:On ] If [ %avcomm ~ *praca* ]
A32: End If

Profile: Odświeżanie kontaktów (197)
Time: 02:00
State: Power [ Source:AC ]
Enter: Anon (198)
A1: AutoContacts [ Configuration:Refresh: true Package:com.joaomgcd.autocontacts Name:AutoContacts Timeout (Seconds):1000 ]

Pobieranie profilu

Profil Głosowe wybieranie połączenia telefonicznego [Tasker 4.5u1]

30 sierpnia 2014

Zapętlony Tasker

Prędzej czy później (raczej prędzej) tworząc profile w Taskerze potrzebne nam będzie skorzystanie z instrukcji warunkowych i pętli. Dla niewtajemniczonych pewnie brzmi to dość strasznie ale postaram się wszystko łopatologicznie wytłumaczyć. Przed pętlami omówię akcje Goto, Stop oraz etykiety akcji, które będą nam za chwilę potrzebne.
Oczywiście zachęcam do komentowania i zadawania pytań jeśli coś będzie niejasne.

Akcje Goto, Stop oraz etykiety

Zazwyczaj akcje tasku wykonywane są kolejno jeden po drugim. Dzięki akcji Goto możemy wykonać skok do innych części tasku. Skok taki można wykonać do:

  • akcji o wybranym numerze
  • akcji o wprowadzonej etykiecie (label)
  • początku pętli
  • końca pętli
  • końca instrukcji warunkowej If
Etykieta akcji to nazwa nadana przez użytkownika. Tworzy się ją w konfiguracji danej akcji zaznaczając checkbox Label i wpisując nazwę etykiety.
Akcja Stop powoduje natychmiastowe zakończenie przetwarzania tasku.

Instrukcja warunkowa If...Else...End If

Instrukcja warunkowa If jest elementem, który pozwala wykonać pewne akcje w zależności od tego czy zdefiniowane wyrażenie logiczne jest spełnione lub nie.
Instrukcję tą tworzymy za pomocą akcji If, Else oraz End If. W konfiguracji akcji If dokonujemy porównania wartości. Jeśli jest ono spełnione wykonują się akcje po akcji If, jeśli nie, wykonują się akcje po akcji Else (jeśli takowa jest dodana). Jeżeli po instrukcji warunkowej mają być umieszczone inne akcje, nie związane z instrukcją warunkową, trzeba zakończyć ją akcją End If.

Warunek If można też stosować w konfiguracji każdej akcji. Pozwala to uprościć warunki. W powyższym przykładzie warunek If dodany jest w konfiguracji akcji Else dzięki czemu otrzymujemy podwójną instrukcję warunkową. Dla zmiennej %BATT (globalna zmienna Taskera przechowująca poziom naładowania baterii) większej od 90 zostanie wyświetlony tost z tekstem Bateria naładowana. Jeśli wartość zmiennej %BATT będzie mniejsza niż 90 ale większa niż 20 (dodatkowy warunek If w konfiguracji akcji Else) wyświetlony zostanie tost Bateria: powyżej 20%. Jeśli żaden z powyższych warunków nie będzie spełniony zostanie wyświetlony tost Bateria bliska rozładowaniu.

Pętla warunkowa For each...Loop

Pętla warunkowa For each umożliwia wykonanie zestawu akcji dla wybranych wartości nadawanych zmiennej. Akcja For each może przyjmować następujące zestawy wartości:

  • wartości tekstowe oddzielone przecinkami np. dom,drzewo,koń,samochód
  • wartości liczbowe oddzielone przecinkami np. 3,5,8,9
  • zakres wartości liczbowych np. 2:8 co jest równoznaczne z 2,3,4,5,6,7,8
  • zakres wartości liczbowych ze zdefiniowanym skokiem np. 0:10:2 co jest równoznaczne z 0,2,4,6,8,10
  • część zmiennej typu macierz np. %macierz(1:2) co jest równoznaczne z %macierz1,%macierz2
Jeśli jako zestaw wydajności podana zostanie zmienna typu macierz w takim zapisie %macierz() to pętla zostanie wykonana dla jej wszystkich elementów.
Na powyższym przykładzie zdefiniowano zakres wartości od 0 do 8 ze skokiem 2. Pierwsza akcja Goto powoduje przeskok do następnego elementu serii bez wykonania pozostałych akcji pętli jeśli zmienna %licznik ma wartość 4. Druga akcja Goto spowoduje przeskok do końca pętli jeśli zmienna %licznik ma wartość większą od 6. Jako wynik tego tasku otrzymamy tosty z wartościami kolejno 0, 2, 6, 8.

Pętla warunkowa Until...Loop

Pętla warunkowa Until pozwala na wykonanie pewnych akcji dopóki dana zmienna nie spełni założonego warunku. Tasker nie ma specjalnej akcji Until ale można ją zrealizować poprzez akcję Goto.

Dopóki zmienna %licznik będzie mniejsza od 12 akcja Goto będzie wykonywała przeskoki do akcji numer 2 czyli akcje pętli warunkowej będą powtarzane. Akcja Variable Add za każdym razem zwiększa zmienną %licznik o 3 (możliwe jest zdefiniowanie innej wartości w konfiguracji akcji). Gdy po czterech powtórzeniach pętli wartość zmiennej %licznik będzie wynosił 12, pętla zostanie zakończona.

Pętla warunkowa While...Loop

Pętla warunkowa While pozwala na wykonanie pewnych akcji w czasie gdy dana zmienna spełnia założony warunek. Tasker nie ma specjalnej akcji While ale można ją zrealizować poprzez akcje Goto i Stop.

W czasie gdy zmienna %licznik nie będzie równa 12 akcja Goto będzie dokonywała skoków do akcji Stop z etykietą pętla, która sprawdza warunek co spowoduje powtarzanie akcji pętli (Flash oraz Variable Add zwiększające wartość zmiennej o 3). Gdy zmienna %licznik osiągnie wartość 12, warunek zostanie spełniony i akcja Stop zatrzyma pętle warunkową oraz cały task.