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

16 stycznia 2015

Diagnozowanie błędów w Taskerze

Im bardziej skomplikowane profile i taski się tworzy tym większa jest szansa na popełnienie błędu. Jak tego błędu szukać w Taskerze? Z osobistego doświadczenia wiem, że czasem można kilka dni patrzeć na błąd i go nie widzieć dlatego najlepiej od początku wyrobić w sobie nawyki, które pomogą go uniknąć. A jak już błąd się pojawi to trzeba znać sposoby na jego odnalezienie i zdiagnozowanie. Poniżej postaram się przedstawić sposoby jakie sam używam do tego, z lepszym bądź gorszym skutkiem.

Skokowe wykonywanie tasków

Począwszy od Taskera 4.6 jest możliwość skokowego wykonywania tasków. W dodatku kolorowymi kropkami aplikacja informuje czy dana akcja została wykonana bez błędów (kropka zielona) czy zakończyła się błędem (kropka czerwona). Znakiem "play" oznaczona jest akcja, która zostanie wykonana w następnym kroku.

W trakcie przerwy pomiędzy kolejnymi akcjami można wyjść z ekranu edycji tasku i na zakładce Zmienne podejrzeć wartości zmiennych na danym etapie wykonywania tasku.

Wyświetlanie błędów/ostrzeżeń Taskera

Prostą metodą na poszukiwanie błędów jest włączenie opcji Popup Errors/Warnings w Taskerze. Przy każdym wejściu do interfejsu Taskera, aplikacja wyświetli okno z błędami/ostrzeżeniami, które wydarzyły się od ostatniej wizyty w interfejsie. Fakt, że opis tych błędów i ostrzeżeń jest bardzo enigmatyczny i zazwyczaj nic nie mówi poza tym, że błędy są i należy je znaleźć.

Tosty podczas działania tasku

Najprostszym sposobem przeciwdziałania powstawania błędów oraz ich wyszukiwania jest używanie tostów umieszczonych na danym etapie wykonywania tasków. Tekst tostów może być bardzo różny. Ja czasem wstawiam do tostów numer akcji, w której są generowane dzięki czemu wiem jak daleko dotarło wykonywanie tasku. Czasem najlepiej sprawdza się tost z wartością zmiennej, która jest w danym tasku obrabiana. Wszystko zależy od tego co się tworzy i co chce się sprawdzić.

Własny log

Bardzo dobrym sposobem na kontrolę poprawności pracy profilów których działanie rozciągnięte jest w czasie jest stworzenie własnego loga tekstowego. Tworzy się go za pomocą akcji Write File z zaznaczonymi opcjami Add Newline (każdy zapis dodaje nową linię) oraz Append (zapis nie nadpisuje zawartości pliku). W polu Text należy podać takie dane jakie będą potrzebne do diagnozowania działania profilu. Najczęściej data i czas są bardzo pomocne. Samo miejsce umieszczenia zapisu do loga też należy dobrze przemyśleć. Zbyt duża ilość danych w logu utrudni jego interpretację zbyt mała nie dostarczy wystarczających danych.

Run Log

Ostatnią metodą, jaką używam, jest Run Log. Jest to funkcja wbudowana w Taskera. Uruchamia się ją z ekranu głównego naciskając menu / More / Run Log.

Run log po włączeniu pokazuje zmiany statusów profili oraz wykonywanych tasków i akcji. Dla łatwiejszej orientacji wpisy rozróżnione są kolorami:
  • fioletowy odpowiada za taski,
  • pomarańczowy za profile,
  • niebieski za akcje,
  • biały/czarny za monitor i usługę Taskera.
Po dłuższym przytrzymaniu danego elementu pokazuje się menu, które umożliwia przejście do odpowiedniego profilu/tasku/akcji lub filtrowanie loga.
Analizując log należy pamiętać, że taski oznaczone jako Anon to te, którym nie nadano nazw (właśnie dlatego opłaca się to robić) oraz, że wpisy, w których występuje zmienna pokazują jej wartość po zakończeniu tej akcji.

Kolumna ID tabeli loga

ID oznacza wewnętrzny numer identyfikacyjny profilu/tasku/akcji jaki nadaje im Tasker.
Po kropce w ID akcji umieszczany jest jej numer w tasku, przykładowo akcja o ID 20.3 to trzecia akcja tasku o ID 20.
Po dwukropku w ID tasku umieszczany jest numer kopii tasku równocześnie wykonywanego, przykładowo task o ID 6:2 to druga kopia tasku o ID 6 wykonywana równocześnie (dwie kopie tego tasku są wykonywane w tym momencie).

Kolumna Status tabeli loga

Status opisuje nowy status zdarzenia powodującego wpis w logu. Jeśli dany wpis zawiera błąd oznaczany jest kolorem czerwonym.

    Statusy usługi (Services)
  • Start usługa została uruchomiona. Niespodziewane uruchomienie usługi najczęściej jest powodowane przez zabicie jej przez system operacyjny gdy opcja Run In Foreground była wyłączona.
  • Stop usługa została zatrzymana.
  • Restart usługa została zrestartowana. Zazwyczaj ma to miejsce gdy nowe dane trzeba doczytać po zmianie konfiguracji przez użytkownika.

    Statusy profili
  • Active warunki profilu zostały spełnione i stał się on aktywny.
  • Inactive nie wszystkie warunki profilu były spełnione i przestał on być aktywny.
  • Instant profil typu instant był na moment aktywowany. Profil typu instant to nic innego jak profil z kontekstem typu Event, profil z kontekstem Time gdzie czas From i To jest ustawiony ten sam oraz profil z kontekstem Time z włączoną opcję Repeat.

    Statusy tasków
  • RejBad task został odrzucony np. nie miał zadeklarowanych akcji.
  • RejCopy task został odrzucony gdyż uruchomiona jest jego druga kopia z włączoną opcją Abort New Task.
  • RejMaxQ osiągnięto maksymalną długość kolejki tasków, którą można skonfigurować w opcjach.
  • Running task został dołączony do kolejki tasków i zaczyna być wykonywany.
  • ExitErr wykonywanie tasku zostało zatrzymane ze względu na pojawienie się błędu.
  • ExitOK wykonano wszystkie akcje tasku.
  • ExitRep task został zatrzymany gdyż uruchomiona została jego druga kopia z włączoną opcją Abort Existing Task.
  • ExitKill task został zatrzymany gdyż usługa Taskera została zatrzymana.

    Statusy akcji
  • Disabled akcja została wyłączona przez użytkownika i pominięta podczas wykonywania tasku.
  • Err podczas wykonywania akcji wystąpił błąd, który spowodował przerwanie wykonywania tasku.
  • ErrIgnore podczas wykonywania akcji wystąpił błąd ale wykonywanie tasku nie zostało przerwane, prawdopodobnie przez zaznaczoną opcję Continue On Error.
  • Exception wystąpił niespodziewany błąd, prawdopodobnie spowodowany przez system operacyjny lub Taskera, co spowodowało zatrzymanie wykonywania tasku.
  • OK akcja wykonana poprawnie.

To tyle na dziś. Jeśli będziesz miał pytania lub coś wyda Ci się niezrozumiałe to zapraszam do zadawania pytań w komentarzach. Postaram się pomóc.

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.

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.