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]