пятница, 27 сентября 2013 г.

Будильник & Tasker

Любой, начинающий копаться с Tasker, делал себе будильник. Ну или хотя бы говорящие часы. И я не миновал сей участи. Кукушка мне каждую четверть часа отчитывается в наушники по велодороге на работу - так удобно ориентироваться в скоростном режиме.
Но вот с будильником всё несколько интереснее. Он же должен быть аккуратным, чтобы не испортить мне весь день. То есть разбудить не только вовремя, но и ... во время ... фазы быстрого сна.


Теория

А это у нас когда? Правильно! Когда мы чутко спим. К утру длительность фазы быстрого сна становится вполне приемлемой, чтобы отловить ее в получасовом интервале перед установленным будильником. Чем мы и займемся.

Практика

Разминаем пальцы. Будем немного свайпать и тыкать. Наш добрый будильник будет говорить на ушко нежные слова. Поэтому придется оснастить систему преобразователем текста в голос. Что-то вроде PicoTTS или SVOX.

Пружинки

Заводим два будильника в системном приложении "Часы". Причем тот, который сработает первым, должен сработать без звука за полчаса до... В этом вся фишка. Будильник - без звука :)
Второй наворачиваем так, чтобы он таки уже разбудил в нужное время Ч. Мне хватает минимальной громкости и нежной мелодии.
Оба будильника именуем уникально ... "будильник 0" и "будильник 1". Это понадобится в Tasker.

Циферблатики

Создаем пять профилей. Замечание: на картинках показано исходное состояние профилей. Именно так они должны уходить в ночь. Потом они будут переключаться.
 Первым сработает "будильник 0" и профиль с соответствующим событием отработает задачу:
a будильник 0 сработал (353)
A1: Alarm Volume [ Level:1 Display:Off Sound:Off ]
A2: Profile Status [ Name:будильник Set:On ]
A3: Profile Status [ Name:будильник 1 сработал Set:On ]


Устанавливаем комфортную громкость канала будильника. Отпускаем профили, которые рассмотрим чуть ниже.





Собственно профиль "будильник". Его задача проста - каждые 10 минут говорить на ухо заданную фразу:
a будильник (48)
A1: Notify LED [ Title:wake up Text: Icon:ipack:holdlightmd:device_access_alarms Number:0 Colour:Green Rate:500 Priority:3 ]
A2: JavaScriptlet [ Code:var time = global('TIME');
time = time.replace(/\./,':'); Libraries: Auto Exit:On Timeout (Seconds):45 ]
A3: Say [ Text:Вовка, ты спишь? время то уже, %time Engine:Voice:com.svox.classic:rus-RUS Stream:4 Pitch:5 Speed:5 Continue Task Immediately:On Continue Task After Error:On ]

Сперва выводим в область уведомлений средство для гашения будильника. Потом форматируем текущее время в вид, который говорилка воспринимает как показания часов. И толкаем ей фразу + время - очень удобно знать который час и сколько еще можно повытягиваться. Так будет происходить каждые 10 минут часа.
NOTE: Следует понимать логику повторений по времени в Tasker. Он будет повторять каждую десятую минуту текущего часа, но не через каждые десять минут от момента запуска профиля. Именно поэтому первый будильник установлен на 6:09 - чтобы профиль отработал в 6:10, 6:20 и 6:30.

 Следующим отработает профиль по событию "Сработал будильник с именем "будильник 1". Это на тот случай если все предыдущие попытки не увенчались успехом. Мало того, что сам будильник протрезвонит, так ещё и отпустится профиль, в котором говорилка сорвется с цепи:
a будильник 1 сработал (351)
A1: Notify LED [ Title:wake up Text: Icon:ipack:holdlightmd:device_access_alarms Number:0 Colour:Green Rate:500 Priority:3 ]
A2: Profile Status [ Name:будильник Set:Off ]
A3: Profile Status [ Name:будильник рубильник Set:On ]
A4: Alarm Volume [ Level:2 Display:Off Sound:Off ]

А предыдущую (добрую) говорилку мы заткнем. И повысим громкость канала. 

 Всё! Игры в добрых кончились.Теперь будем поднимать громкость итеративно при каждом срабатывании вот этого профиля - каждую четвертую минуту часа:
a будильник рубильник (219)
A1: Notify LED [ Title:wake up Text: Icon:ipack:holdlightmd:device_access_alarms Number:0 Colour:Green Rate:500 Priority:3 ]
A2: JavaScriptlet [ Code:var time = global('TIME');
time = time.replace(/\./,':'); Libraries: Auto Exit:On Timeout (Seconds):45 ]
A3: Say [ Text:Вовка, вставай! %time Engine:Voice:com.svox.classic:rus-RUS Stream:4 Pitch:5 Speed:5 Continue Task Immediately:On Continue Task After Error:On ]
A4: Alarm Volume [ Level:%VOLA+1 Display:Off Sound:Off ] If [ %VOLA < 4 ]


Нет. Мы не изверги конечно и поставим порог громкости канала :) Но если рядом кто-то спит, то недовольство гарантировано. Ибо, говорилка будет занудствовать довольно громко.


Прекратить этот беспредел можно всего лишь нажав на уведомление. Даже на полусонном автомате. И тогда все профили перейдут в ожидание следующего утра:
a wake up (50)
A1: Profile Status [ Name:будильник рубильник Set:Off ]
A2: Profile Status [ Name:будильник 1 сработал Set:Off ]
A3: Notify Cancel [ Title:wake up Warn Not Exist:Off ]








Лирика

Все это, конечно, не спасет любителя поспать. Для таких нужно приложение, которое по Wi-Fi пережжет нитку, удерживающую гирю над подушкой. У нас другие цели - аккуратно попытаться разбудить. Если смартфон в режиме "Полет" положить под подушку, то его хорошо слышно только тому, кто на ней спит. Проверено. Причем, что интересно, иногда кажется, что уже не сплю, но слышу уже только второй или третий вопрос. Вот так. А Вы говорите Inception

Приятных снов и пробуждений!