9 czerwca 2015

Tasker - aktualizacja do wersji 4.7

Wczoraj, po długim okresie beta testów, pojawiła się nowa wersja Taskera 4.7. Zachęcam do aktualizacji.

Lista zmian

  • Prefs / Misc: Android Backup
  • action Tasker / Import Data
  • action Array Process: Sort Numeric Integer and Sort Numeric Floating-Point
  • action Send Intent: Extra fields: support for parcelable Java objects created with Java Function
  • action Send Intent: Extra fields: support for Uris via casting of value
  • action Send Intent: extra Extra field (also for JS function)
  • file selection: text box for specification
  • file selection for local data backup and restore
  • scene element WebView: Background tab
  • action Test System: added Android ID test type
  • action Test Display / Orientation: added landscape-reverse and portrait-reverse values
  • per-action log access in task edit screen after test runs
  • action Vibrate/Vibrate Pattern: Continue On Error param
  • action Zip: Target File parameter
  • action Media Control: option to send the command to a specific app
  • main screen profile/task/scene list: multi-select mode action: Move To Top (when items are user-sorted)
  • main screen profile/task/scene: sort by age
  • action Zip: Target File parameter
  • action Media Control: option to send the command to a specific app
  • scene element TextEdit: Focus event
  • action Element Text: parameter Selection (TextEdit elements only)
  • JS: function Say: parameters Respect Audio Focus and Use Network
  • scene element Web: Support Popups parameter for e.g. form selection elements
  • state Net / Auto Sync
  • action Launch App: parameter Always Start New Copy, default is now to use existing copy of app when possible
  • Music Play Dir: Audio Only: extra file extensions
  • display-off monitoring: use of significant motion sensor where available (no power usage when stationary,
  • Prefs / Monitor / Display Off / Motion Detection (enabled by default)
  • BODY_SENSORS permission for Heart Rate
  • State / Heart Rate (untested)
  • variable: %HEART (Heart Rate) (untested)
  • action Net / HTTP Head
  • events Variables / Variable Cleared/Set: parameter User Variables Only
  • event Tasker / Timer Change (when Task Timer status changes)
  • Tasker / Test Tasker: type Timer Widget Remaining
  • Prefs / UI / List Item Drag Margin / Disable option
  • variable %TNET: try using getprop as workaround when Android doesn't return a value
  • action Get Voice: parameter Language
  • actions File / GZip and File / GUnzip
  • state Power / Battery Temperature
  • state Power Save Mode (Android 5.0+)
  • task edit screen: test buttons: log display when action fails
  • Search Tasker: matches also against action parameters which have a set of strings to choose for the value

Pobieranie

Google Play
Strona Taskera

18 marca 2015

Energooszczędna lokalizacja w Taskerze

Dziś zajmę się tematem bardzo często poruszanym przez użytkowników Taskera. Mianowicie chodzi o lokalizację i zmianę ustawień/uruchamianie tasków w zależności od miejsca, w którym przebywa użytkownik wraz z urządzeniem. Lokalizacja bazująca na GPS i usługach lokalizacyjnych Google nie należy do zbyt energooszczędnych dlatego ja zaproponuję swoje rozwiązanie, które dopieszczam od wielu lat. Pewne aspekty tego projektu zapożyczone są z rozwiązań kolegi Mariusza Turka oraz użytkownika YouTube PolePosition.
Projekt bazuje na dwóch etapach lokalizacji. W pierwszym poszukiwana jest strefa WiFi (czyli obszar gdzie w urządzeniu jest włączana łączność WiFi) na podstawie działających w tej strefie nadajników GSM. Drugi etap to poszukiwanie sieci WiFi, która jednoznacznie identyfikuje dane miejsce (przykładowo połączenie z siecią domową Tasker interpretuje jako obecność użytkownika w domu). Dopełnieniem całości jest profil skanujący nadajniki w celu tworzenia danych dla poszukiwania strefy WiFi. W tym przypadku posłużę się aplikacją Power Toggles, która umożliwia tworzenie przycisków w panelu notyfikacji.

Wymagania

Opis wykonania

Zaczynamy od dodania do wcześniejszego profilu Połączone WiFi zmiennej %WIFIC, która będzie otrzymywać wartość 1 gdy urządzenie będzie miało połączenie z siecią WiFi oraz czyszczona, gdy tego połączenia nie będzie.

Kolejnym krokiem jest stworzenie profilu, który będzie zapisywał do zmiennej numery nadajników GSM. Wykorzystam do tego zmienną %CELLID, w której przechowywany jest numer nadajnika GSM. Profil opiera się o pętlę, która odczytuje zawartość zmiennej 6 razy co 30 sekund co pozwoli zebrać więcej danych. Obróbka danych wykonana będzie poprzez stworzenie z nich tablicy, w której usunięte zostaną duplikaty, puste elementy tablicy oraz na koniec elementy zostaną posortowane. Następnie elementy tablicy oddzielone znakiem końca linii zostają zapisane do zmiennej %NadajnikiStrefyWiFi.

Ze zmienną %CELLID wiąże się dziwna przypadłość. Zmienna ta zawiera wartość tylko wtedy gdy użyta jest w tasku uruchomionym poprzez profil. Z tego względu musiałem stworzyć dodatkowy profil PT Skanowanie nadajników, który uruchamia task skanowania gdy zmienna %SkanNadajników otrzyma wartość 1. Wartość tą nadaję taskiem PT Skan nadajników, który jest uruchamiany poprzez klawisz Power Toggles.

Poniżej instrukcja jak dodać za pomocą Power Toggles klawisz w panelu powiadomień uruchamiający task Taskera.

Teraz tworzymy profil Strefa WiFi, który odpowiada za pierwszy etap lokalizacji. Profil ten uaktywniać się ma poprzez kontekst Cell Near z podaną zmienną %NadajnikiStrefyWiFi gdy nieaktywny jest tryb samolotowy oraz zmienna %WIFIC jest różna od 1. W tasku wejściowym tego profilu jest tylko jedna akcja - włączenie WiFi.

Kolejnym profilem jest Poza strefą WiFi, którego kontekstami są Cell Near ze zmienną %NadajnikiStrefyWifi i zaznaczoną zmienną Invert, brak tryby samolotowego i zmienna %WIFIC różna od 1. W tasku wejściowym profilu następuje wyłączenie WiFi po 30 sekundach oczekiwania i sprawdzeniu czy zmienna %WIFIC jest różna od 1, a profil Strefa WiFi nie jest aktywny. Zapobiegnie to wyłączeniu WiFi jeśli użytkownik połączył się z jakąś inną siecią oraz włączaniu i wyłączaniu WiFi gdy jest się na na skraju strefy WiFi.

Ostatnim etapem jest stworzenie profili W domu, W pracy, itp. Dla przykładu dodałem do projektu profil W domu, w którym ustawiam głośność dzwonków i zmieniam ustawienia wibracji. Sposób wykorzystania tych profili każdy musi sam sobie oprogramować. Profile takie są aktywowane kontekstem WiFi Connected z wpisaną nazwą lub adresem MAC danej sieci WiFi.

Rozpisany projekt

Profile: Strefa WiFi (2)
Priority: 7 Restore: no Enforce: no
State: Cell Near [ Cell Tower / Last Signal:%NadajnikiStrefyWiFi Ignore Cells:* ]
State: Not Airplane Mode
State: Variable Value [ %WIFIC != 1 ]
Enter: Wejście do strefy WiFi (3)
A1: WiFi [ Set:On ]

Profile: Poza strefą WiFi (277)
Priority: 7 Restore: no Enforce: no
State: Not Cell Near [ Cell Tower / Last Signal:%NadajnikiStrefyWiFi Ignore Cells:* ]
State: Not Airplane Mode
State: Variable Value [ %WIFIC != 1 ]
Enter: Wyjście ze strefy WiFi (4)
A1: If [ %WIFIC = 1 ]
A2: Stop [ With Error:Off Task: ]
A3: Else
A4: Wait [ MS:0 Seconds:30 Minutes:0 Hours:0 Days:0 ]
A5: WiFi [ Set:Off ] If [ %WIFIC != 1 & %PACTIVE !~ *Strefa WiFi* ]
A6: End If

Profile: W domu (8)
Restore: no Enforce: no
State: Wifi Connected [ SSID:Dom MAC:* IP:* ]
Enter: Wewnątrz (9)
A1: Ringer Volume [ Level:5 Display:Off Sound:Off ]
A2: Notification Volume [ Level:5 Display:Off Sound:Off ]
A3: Vibrate On Ringer [ Set:Off ]
Exit: Na zewnątrz (10)
A1: Wait [ MS:0 Seconds:20 Minutes:0 Hours:0 Days:0 ]
A2: Stop [ With Error:Off Task: ] If [ %WIFIC = 1 ]
A3: Ringer Volume [ Level:7 Display:Off Sound:Off ]
A4: Notification Volume [ Level:7 Display:Off Sound:Off ]
A5: Vibrate On Ringer [ Set:On ]

Profile: Połączone WiFi (177)
State: Wifi Connected [ SSID:* MAC:* IP:* ]
Enter: Anon (178)
A1: Variable Set [ Name:%WIFIC To:1 Do Maths:Off Append:Off ]
A2: Variable Set [ Name:%wifiinfo To:%WIFII Do Maths:Off Append:Off ]
A3: Variable Search Replace [ Variable:%wifiinfo Search:(?<=(\n)).* Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo Replace Matches:Off Replace With: ]
A4: Variable Search Replace [ Variable:%wifiinfo2 Search:" Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo2 Replace Matches:On Replace With: ]
A5: If [ %SCREEN ~ on ]
A6: Variable Search Replace [ Variable:%wifiinfo5 Search:IP : Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo5 Replace Matches:On Replace With: ]
A7: Variable Search Replace [ Variable:%wifiinfo7 Search:Spd: Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%wifiinfo7 Replace Matches:On Replace With: ]
A8: Flash [ Text:Połączono z siecią %wifiinfo2
Adres IP: %wifiinfo5
Prędkość: %wifiinfo7 Long:On ]
A9: End If
Exit: Anon (258)
A1: Variable Clear [ Name:%WIFIC Pattern Matching:Off ]

Profile: PT Skanowanie nadajników (62)
Event: Variable Set [ Variable:%SkanNadajników Value:1 ]
Enter: Skanowanie nadajników (187)
A1: AutoNotification [ Configuration:Title: Skanowanie nadajników
Text: Trwa skanowanie nadajników GSM/3G strefy WiFi
Status Bar Icon: ic_action_signal
Id: Skan-Wifi
Persistent: true Package:com.joaomgcd.autonotification Name:AutoNotification Timeout (Seconds):0 ]
A2: Goto [ Type:Action Label Number:1 Label:koniec ] If [ %CELLID !Set ]
A3: Variable Set [ Name:%indeks To:1 Do Maths:Off Append:Off ]
A4: If [ %NadajnikiStrefyWiFi Set & %NadajnikiStrefyWiFi !~ *NadajnikiStrefyWiFi" ]
A5: Variable Search Replace [ Variable:%NadajnikiStrefyWiFi Search:.+ Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In:%array Replace Matches:Off Replace With: ]
A6: End If
<pętla>
A7: Array Push [ Name:%array Position:1 Value:%CELLID Fill Spaces:Off ]
A8: Wait [ MS:0 Seconds:30 Minutes:0 Hours:0 Days:0 ]
A9: Variable Add [ Name:%indeks Value:1 Wrap Around:0 ]
A10: Goto [ Type:Action Label Number:1 Label:pętla ] If [ %indeks < 7 ]
A11: Array Process [ Variable:%array Type:Remove Duplicates ]
A12: Array Process [ Variable:%array Type:Squash ]
A13: Array Process [ Variable:%array Type:Sort Numeric, Integer ]
A14: Variable Set [ Name:%enter To:
Do Maths:Off Append:Off ]
A15: Variable Join [ Name:%array Joiner:%enter Delete Parts:Off ]
A16: Variable Set [ Name:%NadajnikiStrefyWiFi To:%array Do Maths:Off Append:Off ]
<koniec>
A17: AutoNotification Cancel [ Configuration:Id: Skan-Wifi Package:com.joaomgcd.autonotification Name:AutoNotification Cancel Timeout (Seconds):0 ]
A18: Variable Clear [ Name:%SkanNadajników Pattern Matching:Off ]

PT Skan nadajników (69)
A1: Variable Set [ Name:%SkanNadajników To:1 Do Maths:Off Append:Off ]

Pobieranie projektu

Profil Energooszczędna lokalizacja [Tasker 4.7b4]

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.