Linux based sleeptracker

Linux based sleeptracker

Интеллектуальный будильник из ноутбука.
Когда по воле профессии проводишь за ноутом по 15 часов в день, встаешь с ним, засыпаешь,
волей не волей приходит мысль, что было бы неплохо чтобы он включался и выключался сам.


С тех пор, как Linux стал стабильно поддерживать ACPI большинства оборудования,
отпала необходимость начинать работу с загрузки ОС.
Я уже вообще забыл когда последний раз загружался, вместо выключения всегда использую
Suspend to RAM, внешне ноут выключается, но питание на память продолжает подаваться.
Благодаря этому возврат к нормальной работе занимает меньше десяти секунд.

Вернуться из такого сна можно не только по нажатию клавиш, но и по сигналу будильника
встроенного в каждый современный ноутбук.

В моём дистрибутиве:
Mandriva Linux release 2010.1 (Official) for i586
Linux localhost.localdomain 2.6.33.7-desktop-2mnb
#1 SMP Mon Sep 20 19:00:25 UTC 2010 i686 i686 i386 GNU/Linux

для этого используется команда "rtcwake" входящая в пакет: util-linux-ng-2.17.1-5mdv2010.1

Выполнив:
# rtcwake -m mem -s 90
мы отправляем ноут спать на 90 секунд. (ноут выключается, но питание на память подается)

Пишем примитивный скрипт будильника:

#!/usr/bin/perl

use strict;
use warnings;
use POSIX qw(strftime);

my ($sec,   $min,   $hour,
    $mday,  $mon,   $year,
    $wday,  $yday,  $isdst) = localtime time;

my $wakeup_time = $ARGV[0];
if (!$wakeup_time || $wakeup_time !~ /^\d+:\d+$/){
    die ("Usage: $0 HH:MM");
}

my ($wakeup_hour, $wakeup_min) = split(/:/, $wakeup_time);

my $sleep_time  = 0;
my $cur_time    = $hour         * 3600 + $min           * 60 + $sec;
my $alarm_time  = $wakeup_hour  * 3600 + $wakeup_min    * 60;

if (($alarm_time - $cur_time) < 0){
    ## tomorrow
    $sleep_time = 86400 - $cur_time + $alarm_time;
} else {
    $sleep_time = $alarm_time - $cur_time;
}

print "cur_time:    $cur_time\n";
print "alarm_time:  $alarm_time\n";
print "sleep_time:  $sleep_time\n";
print "wake up in:  $wakeup_time\n";

if ($sleep_time > 0){
    system("sudo /usr/sbin/rtcwake -s $sleep_time -m mem");
    for (;;){
        system("/usr/bin/mplayer http://stream2.tormentedradio.com:8070");
        sleep (2);
    }
}

Собственно скрипт простой и думаю объяснения не требует,
он вызывает rtcwake с требованием уснуть со сохранением данных в памяти
на определенное количество секунд, а после того как проснулись играет нам интернет радио.

Собственно теперь к теме статьи. Интеллектуальность.
Когда данный будильник утром начинает хладнокровно орать без чувства всякого сожаления
ко мне, то я бываю зол. Поэтому стал задумываться как бы мне его усовершенствовать.

Идею подсказали часы SleepTracker компании Innovative Sleep Solutions и мой давний пост в жж:

"Шатнули стол... мышь пополза по экрану, пройдя пару десятков пиксилей остановилась...
Хм.. Используем на практике:
Датчик движения на базе линукс и оптической мышки
while true;do
    hexdump -n 1 /dev/mouse >/dev/null 2>&1 && echo "По столу кто-то ходил в \"`date`\"";
done
Copyright (c) morik"

Наш сон состоит из фаз быстрого и медленного сна. И ходят слухи, что если человека будить
во время быстрой фазы, то его пробуждение будет безболезненным и быстрым.

Конечно же можно было бы просто купить такие часы, но во первых это слишком просто,
а во вторых с собственным софтом можно сделать разные интересные вещи,
к примеру включать интернет радио.
Как Вы наверное уже догадались, совершенствование нашего будильника заключается в том,
чтобы научить его определять фазы нашего сна.
Слава Богу быстрые фазы сопровождаются нашими движениями, а это уже зацепка.
Но как с ноута узнать, что мы шевелимся? Изначально у меня была идея использовать веб камеру,
но ночью она вещает только трансляцию: "загадка черного экрана"..
Использовать ИК (инфракрасную) подсветку? кхм.. как-то сложно, да и питать её от чего-то надо..
Была мысль купить датчик движения, но его тоже питать нужно, да еще и как правило 12 вольтами
и к ноуту опять же как подключать..

И тут - Эврика!
Мышь!

У меня же есть мышь! Да ещё и беспроводная! Ладно, что она подключена к сервачку моему,
ради эксперимента ничего не жалко. Первая мысль - примотать к ноге. (Про вторую лучше промолчу)
Кстати важно заметить, что мышки в линухе представлены так же как обычные файлы,
к примеру: /dev/mouse, /dev/input/mouse1, а данные со всех мышек как правило
стекаются в устройство /dev/mice. Мы можем увидеть то, что передает мышка
просто распечатав содержимое этих устройств, к примеру командой: hexdump -C /dev/mice
Итак, примотать к ноге и следить за /dev/mice, но проблема в том, что мышь должна лежать
на поверхности, иначе она слепа.. Решил разобрать её, достать плату, положить между её
светодиодом и приемником шарик, чтобы когда мышь шевелится, шарик мельтешил перед
приемником и она думала, что её двигают, а саму плату примотать к руке..
Провозился до 4 утра, так ничего и не получилось, оптика мышки имела фокусное расстояние
и вблизи приемника имела очень плохую чувствительность.. Эксперимент провалился,
а я все проспал и приехал на работу только к часу дня.. Датчик движения Linux

День не заладился, ходил грустный, поведал свои мысли моему идейному вдохновителю
- Николаю Мартынову (это я так Коль тебе спасибо говорю) и вскоре он подсказал мне
изящное и просто решение:
Берем нитку, иголку, кровать, мышь. К краю пришиваем нитку и протянув её через кровать
привязываем к мышке, в результате последняя висит на краю.
Кровать как обычно застилаем покрывалом. Вот и всё! Теперь любое движение и мышь шевелится,
передавая нам ценные данные Как пользоватся rtcwake? Теперь мы знаем когда есть движение.
Ниже фотки, качество оставляет желать лучшего, но идею передают.

Под своим весом мышка натягивает нитку:
Как пользоватся rtcwake?

Нитка под покрывалом, не мешает и не порвется.
Devmice ru

И только хвостик выдавал его.
Rtcwake perl будильник

Супер, самое страшное, а это аппаратная часть, позади. Далее дело за софтом.
Берем наш будильник и делаем из него человеческую программу демон,
которая будет следить за нашими движениями и таким образом определять фазу сна.
Выкладываю её, может кому ещё пригодится:
sleep-tracker.pl

И с Вашего позволения маленький how-to как её использовать:

home [[email protected] ~]$ sleep-tracker.pl --help
    Usage:      /home/morik/bin/sleep-tracker.pl [options]
    Options:
                --help      this help
                --server    start sleep track server
                --dontfork  do not fork server
                --console   connect to server console

home [[email protected] ~]$

Запускаем демон:

home [[email protected] ~]$ sleep-tracker.pl --server
home [[email protected] ~]$

Подключаемся к демону:

home [[email protected] ~]$ sleep-tracker.pl --console
> help
Available commands:
    quit                quit from console
    status              show server status
    device              path to tracker device
    device-test-start   start test tracker device
    device-test-end     end test tracker device
    sleep-start         start sleep now
    sleep-command       setup|show sleep command, you can use '%timeout%' placeholder
    alarm-enabled       is alarm enabled (yes/no)
    alarm-threshold     setup move alarm threshold (bytes per minute)
    alarm-start         start alarm
    alarm-stop          stop alarm
    alarm-command       setup|show alarm command
    alarm-time          setup|show alarm time
    stop                stop server
    help                show current help
>

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

> alarm-time 7:30-9:00
time was saved
>

Проверяем текущий статуc

> status
Server ver. '0.10' running pid: '7092'
alarm enabled:      yes
alarm state:        not running
alarm time:         7:30-9:00
alarm command:      /usr/bin/mplayer /mnt/multimedia/music/Nostalgi/BONEY\ M\ -\ STILL\ IM\ SAD.mp3
uptime:             436
last minute act:    3
device:             /dev/input/mouse2 (exist)
>

Итак, сейчас 2:51 ночи, будильник установлен, спокойной ночи.

> sleep-start



























































Смотрите также:

Вам это будет интересно!

  1. стинг рулит как всегда
  2. Йога для мам и малышей