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.

24 sierpnia 2014

Operatory logiczne, znaki specjalne i porównywanie wartości

Dziś czeka Cię czytelniku trochę teorii. Niestety jest ona niezbędna by sprawnie posługiwać się zmiennymi, instrukcjami warunkowymi i pętlami. Postaram się przedstawić ją w taki sposób byśmy przeszli przez nią bezboleśnie nie przysypiając przed monitorem, a w kolejnym wpisie spróbujemy wykorzystać nowo nabytą wiedzę w praktyce.

Operatory logiczne

Aby bezproblemowo posługiwać się instrukcjami warunkowymi i pętlami niezbędne jest porównywanie wartości zmiennych. W Taskerze można tego dokonać na dwa sposoby. Pierwszy sposób to tzw. uproszczony, drugi to wyrażenia regularne (RegEx), o którym napiszę przy innej okazji.
Dziś zajmiemy się sposobem uproszczonym realizowanym przez operatory logiczne oraz uniwersalne operatory Matches/Not Matches. Wykorzystując je porównujemy prawy parametr czyli wzór do wartości po lewej stronie.
Wzór (prawy parametr) możemy definiować wykorzystując znaki specjalne.

Znaki specjalne

  • / oznacza operator logiczny lub czyli wzór zielony/czerwony będzie pasował do wartości czerwony lub do wartości zielony
  • * oznacza dowolną ilość dowolnych znaków czyli wzór 123* będzie pasował do wartości 123 ale także do 123DOM
  • + oznacza jeden lub więcej dowolnych znaków czyli wzór 123+ nie będzie pasował do wartości 123, a będzie pasował do wartości 123D
  • ! oznacza negację czyli !*zielony*/*czerwony* będzie pasował do wszystkich wartości poza tymi zawierającymi zielony lub czerwony

Wielkość liter w porównaniach

Wielkość liter nie gra roli przy porównywaniu wartości chyba, że wzór (prawy parametr) ma w zapisie wielkie litery. Wtedy wielkość liter ma znaczenie.

Przykłady porównywania wartości

  • pomoc pasuje do pomoc ale nie do pomocny
  • pomoc* pasuje do pomoc i do pomocny
  • *nie* pasuje do każdego ciągu znaków zawierającego nie
  • 123+ pasuje do 123 i przynajmniej jednego znaku np. 1234
  • + pasuje do przynajmniej jednego znaku (niepusta wartość)
  • nie*domu pasuje do niedaleko domu i nie mam domu
  • Pomoc/*gratis pasuje do Pomoc lub każdego ciągu znaków kończącego się ciągiem gratis

Porównywanie numerów telefonów kontaktów

W Taskerze porównywanie numerów telefonów kontaktów dostało kilka dodatkowych tagów specjalnych by ułatwić nam nieco życie.

  • C:ANY pasuje do numeru telefonu jakiegokolwiek kontaktu
  • C:FAV pasuje do numeru telefonu jakiegokolwiek kontaktu należącego do ulubionych
  • CG:nazwa_grupy pasuje do numeru telefonu jakiegokolwiek kontaktu z grupy nazwa_grupy

Przykłady porównywania numerów telefonów

  • !C:ANY pasuje do każdego numeru telefonu nie zapisanego w kontaktach
  • 025*/Janek* pasuje do numeru telefonu zaczynającego się 025 lub do numeru telefonu kontaktu, którego początek to Janek
  • C:FAV/0123456789 pasuje do numeru telefonu jakiegokolwiek kontaktu należącego do ulubionych lub numeru 0123456789
  • CG:*Rodzina*/CG:Praca pasuje do numerów kontaktów z grupy, która ma w nazwie ciąg Rodzina lub do numerów kontaktów z grupy Praca

Matches (~)

Z operatorem Matches warunek będzie spełniony jeśli obie wartości będą do siebie pasowały np. moje profile ~ *profil*

Not Matches (!~)

Z operatorem Not Matches warunek będzie spełniony jeśli obie wartości nie będą do siebie pasowały np. moje profile !~ *profil

Maths: Less Than (<)

Oba porównywane parametry muszą być wartościami liczbowymi i pierwszy musi być mniejszy od drugiego np. 3 < 6 by warunek był spełniony.

Maths: Greater Than (>)

Oba porównywane parametry muszą być wartościami liczbowymi i pierwszy musi być większy od drugiego np. 9 > 6 by warunek był spełniony.

Maths: Equals (=)

Oba porównywane parametry muszą być wartościami liczbowymi i obie wartości muszą być sobie równe np. 3 = 3 by warunek był spełniony.

Maths: Not Equals (!=)

Oba porównywane parametry muszą być wartościami liczbowymi i muszą być od siebie różne np. 3 != 6 by warunek był spełniony.

Maths: Is Even

Parametr musi być wartością liczbową parzystą by warunek był spełniony.

Maths: Is Odd

Parametr musi być wartością liczbową nieparzystą by warunek był spełniony.

Is Set / Isn't Set

Warunek jest spełniony jeśli dana zmienna ma ustawioną wartość/nie ma ustawionej wartości.

W praktyce można stosować operatory Matches/Not Matches w przypadku wartości liczbowych. Trzeba jedynie pamiętać, że w takim przypadku Tasker nie porównuje wartości liczbowych jako takich ale znaki. Jeśli znaki pasują to warunek będzie spełniony.

Warunki wykonania akcji

W konfiguracji każdej prawie akcji możliwe jest dodanie warunków, niezbędnych do spełnienia by ta akcja została wykonana.

Pomiędzy poszczególnymi warunkami wykonania akcji (jeśli jest ich więcej niż jeden) mogą za chodzić zależności And (wszystkie warunki muszą być spełnione), Or (przynajmniej jeden warunek musi być spełniony oraz Xor (dokładnie jeden warunek musi być spełniony).
Poza tym są jeszcze do dyspozycji operatory And+, Or+ oraz Xor+ czyli operatory z większym pierwszeństwem. Ogólnie zasada jest taka, że im bardziej na prawo przesunięty klawisz operatora to ma on większe pierwszeństwo. Dodatek + do nazwy operatora zwiększa pierwszeństwo danego warunku.

19 sierpnia 2014

Tasker - aktualizacja do wersji 4.4u3

Wczoraj Tasker został zaktualizowany do wersji 4.4u3. W liście zmian głównie same poprawki.

Lista zmian

  • change: increased SD logfile size to 2MB
  • bugfix: catch OOM when scrolling app list
  • bugfix: 2 situations where exe service was occasionally hanging
  • bugfix: menu element: when too many elements to fit on screen, rearrange and delete wasn't possible
  • bugfix: state Calendar Entry: names with space were being mangled on exiting state edit
  • bugfix: menu element: select mode none: click highlight didn't match that used elsewhere
  • bugfix: menu element: select mode none: click highlight was sticking
  • bugfix: android L: was crashing on startup with Default theme selected
  • bugfix: UI lock: multi-selecting task/scenes, long-click projects wasn't requesting code
  • bugfix: UI lock: locked tasks/profiles/scenes could be dragged and thus e.g. deleted
  • bugfix: added help text for State / Display / Display State

Pobieranie

Google Play
Strona Taskera

16 sierpnia 2014

Profil: Tost z danymi sieci WiFi po połączeniu

Mimo, że nie przepadam za nakładką TouchWiz autorstwa Samsunga ma ona kilka ciekawych i przydatnych elementów. Jednym z nich jest tost wyświetlający dane sieci WiFi i szybkość połączenia zaraz po jego nawiązaniu. Dziś zademonstruję w jaki sposób uzyskać podobną funkcjonalność w Taskerze.

Opis wykonania

Na ekranie głównym Taskera, w zakładce Profile naciskamy klawisz +, z listy kontekstów wybieramy State / Net / WiFi Connected. Na ekranie edycji kontekstu nic nie zmieniamy bo chcemy by tost był wyświetlany przy połączeniu z każdą siecią. Jeśli wypełnimy na tym ekranie pola SSID, MAC lub IP to profil będzie uruchamiany tylko po połączeniu z siecią spełniającą wpisane warunki. Przykładowo podanie nazwy SSID sieci PRZYKLADOWE-WIFI spowoduje, że połączenie tylko z tą siecią uaktywni profil.
Wciskamy klawisz wstecz, następnie wybieramy New Task i przechodzimy do edycji tasku wejściowego profilu.
Wyświetlanie tostu ma sens tylko w przypadku gdy urządzenie ma włączony ekran. Dlatego zaczniemy task od sprawdzenia jego statusu. Tasker przechowuje dane na temat statusu ekranu w zmiennej %SCREEN. Może on przyjmować wartości on i off czy odpowiednio włączony i wyłączony.
Wybieramy klawisz +, kategorię Task i akcję If. W konfiguracji akcji w lewej części obszaru Condition wpisujemy %SCREEN, w prawej on, a jako operator wybieramy Matches. Czyli dalsze akcje zostaną wykonane jeśli zmienna %SCREEN będzie miała wartość on (ekran włączony).

Po powrocie do ekranu edycji tasku zajmiemy się przygotowaniem danych do naszego tostu. Dane te są przechowywane w zmiennej %WIFII. Można sprawdzić jakie dane są dostępne w zmiennej wybierając klawisz menu / More / Run An Action / Alert / Flash i w polu text wpisać %WIFII. Po dotknięciu klawisza wstecz wyświetli się tost z zawartością zmiennej %WIFII. Nam zależy na nazwie SSID sieci, przyznanym urządzeniu adresie IP oraz prędkości połączenia. Aby wyciągnąć potrzebne nam dane skorzystamy z akcji Variable Split jednak najpierw wartość zmiennej %WIFII musimy przekazać do innej tymczasowej zmiennej %wifiinfo, którą będziemy mogli edytować. Wybieramy klawisz + następnie Variables / Variable Set i w konfiguracji akcji w pole Name wpisujemy %wifiinfo, a do pola To %WIFII. Następnie naciskamy klawisz wstecz, klawisz + i wybieramy Variables / Variable Split. W konfiguracji akcji w pole Name wpisujemy %wifiinfo oraz zaznaczamy opcję Delete Base (czyli usuwamy zmienną %wifiinfo po jej podziale). Akcja Variable Split dzieli ciąg znaków na części oddzielone wybranym znakiem (Splitter). W naszym przypadku nie wybraliśmy splittera więc Tasker przyjmie spację jako znak podziału. Każde słowo z oryginalnego tekstu jest teraz dostępne w zmiennej %wifiinfoX gdzie X to numer słowa w tekście.
Wybieramy klawisz wstecz, następnie + i dodajemy akcję Alert / Flash. W konfiguracji tej akcji w polu Text wpisujemy następujący tekst:

Połączono z siecią: %wifiinfo4
Adres IP: %wifiinfo9
Prędkość: %wifiinfo13
oraz zaznaczamy opcję Long (by tost wyświetlał się dłużej).
Naciskamy teraz dwukrotnie wstecz i mamy gotowy profil. Powinien on wyglądać następująco:

Rozpisany profil

Profile: Połączone WiFi (91)
State: Wifi Connected [ SSID:* MAC:* IP:* ]
Enter: Anon (152)
A1: If [ %SCREEN ~ on ]
A2: Variable Set [ Name:%wifiinfo To:%WIFII Do Maths:Off Append:Off ]
A3: Variable Split [ Name:%wifiinfo Splitter: Delete Base:On ]
A4: Flash [ Text:Połączono z siecią %wifiinfo4
Adres IP: %wifiinfo9
Prędkość: %wifiinfo13 Long:On ]

Wideo

Pobieranie profilu

Profil Tost z danymi sieci WiFi po połączeniu [Tasker 4.4u2]

Aktualizacja

Jak kolega mrtur zauważył w komentarzach w przypadku gdy nazwa sieci będzie zawierała spację profil wyświetli niepoprawne dane. Dlatego poniżej przedstawiam poprawioną wersję.
Tym razem posłużyłem się akcją Variable Search Replace z wyszukiwaniem ciągu (?<=(\n)).*, który podzieli tekst na poszczególne linie, które trzeba poprzycinać do odpowiednich długości za pomocą kolejnych akcji Variable Search Replace z odpowiednimi wartościami pola Search.

6 sierpnia 2014

Tworzymy pierwszy profil

Przyszedł w końcu czas na własnoręczne stworzenie pierwszego profilu. Przedstawię krok po kroku jak stworzyć bardzo prosty profil wyświetlający tzw. tost "Witaj" po odblokowaniu ekranu. Do opisu załączę wyeksportowany plik xml do pobrania, opis wszystkich akcji i kontekstów oraz klip wideo, na którym pokażę, co i jak trzeba po kolei wykonać.

Ekran edycji tasku

Zaczniemy jednak od omówienia ekranu edycji tasku. Standardowo na dole mamy klawisz +, który umożliwia dodanie nowej akcji, w dolnym pasku jest jeszcze klawisz ze znakiem Play umożliwiający uruchomienie tasku. Dłuższe przytrzymanie palca na którejś z dodanych już akcji wyświetla na górze ekranu pasek umożliwiający kopiowanie, wklejanie i wyłączanie tej akcji. Wyłączona akcja oznaczona będzie fioletowym paskiem i nie będzie uruchamiana.

Profil "Witaj"

Zaczynamy tworzyć profil. Na zakładce profile Taskera naciskamy klawisz +. Pojawi się lista rodzajów kontekstów. Chcemy by nasz profil uaktywniał się przy odblokowaniu ekranu z listy wybieramy Event, a następnie z listy Display / Display Unlocked. W tym momencie Tasker wyświetli ekran konfiguracji tego kontekstu gdzie można wybrać priorytet kontekstu. Od priorytetu zależy pozycja tasku wejściowego profilu na liście oczekiwania (jeśli akurat wykonują się inne taski). W tym przypadku nie zależy nam na wysokim priorytecie więc pozostawiamy standardowy Normal.
Naciskamy klawisz Back i z listy, która się pokaże wybieramy New Task. W tym momencie Tasker zapyta o nazwę tasku. Nie ma konieczności podawania nazwy tasku ale na dłuższą metę dzięki nazwom tasków łatwiej się zorientować co i kiedy się uruchamia. W naszym przypadku nie wpisujemy nazwy zadania. Tasker przenosi nas do ekranu edycji tasku wejściowego.
Przy okazji tworzenia tego tasku użyjemy po raz pierwszy zmiennych. Nie są one w tym przypadku konieczne ale im szybciej zaczniesz ich używać tym szybciej je opanujesz. Naciskamy więc klawisz plus, z listy akcji wybieramy Variables / Variable Set. Na ekranie edycji tej akcji w polu Name wpisujemy %tekst (czyli tworzymy zmienną lokalną o nazwie %tekst), a w polu To wpisujemy Witaj (czyli nadajemy zmiennej wartość). Naciskamy klawisz wstecz i wracamy do ekranu edycji tasku. Znów naciskamy klawisz plus i wybieramy Alert / Flash. Na ekranie edycji tej akcji w polu Text wpisujemy %tekst oraz zaznaczamy opcję Long (by nasz tost dłużej trwał). Zadaniem akcji Flash będzie wyświetlenie na ekranie tekstu znajdującego się w zmiennej %tekst czyli słowa Witaj. Naciskamy klawisz wstecz i mamy przed sobą cały task tworzonego profilu. Po ponownym naciśnięciu klawisza wstecz widzimy gotowy profil. Ekrany te powinny wyglądać jak na poniższych zrzutach ekranu.

Jeśli wszystko wygląda prawidłowo możemy wyjść z Taskera, wyłączyć i włączyć ekran urządzenia i po odblokowaniu powinien pojawić się tost o treści "Witaj".

Rozpisany profil

Profile: Powitanie po odblokowaniu (152)
Event: Display Unlocked
Enter: Anon (160)
A1: Variable Set [ Name:%tekst To:Witaj Do Maths:Off Append:Off ]
A2: Flash [ Text:%tekst Long:On ]

Wideo

Pobieranie profilu

Profil Witaj [Tasker 4.4u2]