Будильник из режима ожидания

9

Я хочу, чтобы мой ноутбук просыпался утром из приостановленного режима и просил меня проснуться, используя мой mp3-файл. Как это сделать?

Я попытался apmsleep, но он не работает, потому что мой компьютер не имеет функции «приостановить к RAM» в BIOS. Что я могу сделать? Спасибо!

Челиос
источник

Ответы:

13

Функция будильника 1.Basic

Вход в режим ожидания

для этого решения вам нужно войти в режим ожидания, запустив приведенный ниже скрипт. Это заставляет компьютер переходить в режим ожидания и будит вас в (часы) время, определенное вами (в сценарии). играть твою песню.

Конечно, вы можете просто запустить скрипт вручную, чтобы использовать его, но удобнее сделать его доступным с помощью комбинации клавиш, установленной в System Settings > Keyboard > Shortcuts > Custom Shortcuts.

Настроить

  • Вставьте приведенный ниже скрипт в пустой файл, установите время пробуждения (часы) (через 1-24 часа, 1-60 минут), укажите путь к вашей песне пробуждения и сохраните его как wakeup.py.

    #!/usr/bin/env python3
    
    import datetime
    import subprocess
    
    ###############################################
    # set wakeuptime and location of the mp3:
    hour = 7
    minutes = 15
    command = "rhythmbox /path/to/wakeupsong.mp3"
    ###############################################
    
    currtime = str(datetime.datetime.now().time()).split(":")[:2]
    minutes_set = hour*60 + minutes
    minutes_curr = int(currtime[0])*60 + int(currtime[1])
    if minutes_curr < minutes_set:
        minutes_togo = minutes_set - minutes_curr
    else:
        minutes_togo = minutes_set + 1440-minutes_curr
    interval = minutes_togo*60
    
    run = "rtcwake -m disk -s "+str(interval)+" && "+"sleep 20 &&"+command
    subprocess.call(['/bin/bash', '-c', run])
  • сделать скрипт исполняемым

  • Установите комбинацию клавиш для запуска скрипта; открыть System Preferences > Keyboard > Shortcuts > Custom Shortcuts, добавить команду

    sudo /path/to/wakeup.py (sudo = assuming you do the next step below)
    

    и выберите комбинацию клавиш

  • Скрипту нужны права администратора. Чтобы запустить его без ввода пароля, откройте файл sudoers:

    sudo visudo
    

    добавьте строку в самый конец файла:

    [your_username] ALL=NOPASSWD: [/path/to/wakeup.py]
    

    Обратите внимание, что файл sudoers является важным файлом; ошибки в файле могут привести к серьезным проблемам , поэтому будьте осторожны!

NB

  • После пробуждения компьютер бездействует в течение 20 секунд, после чего включается сигнализация.
  • Если вы не хотите редактировать файл sudoers, вам необходимо установить gksu: sudo apt-get install gksu. В этом случае команда для запуска сценария будет gksu /path/to/wakeup.py, и вам будет предложено ввести пароль при каждом запуске.

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

2. Расширенная версия, включающая функцию остановки при нажатии любой клавиши или мыши

Различия между этой и «базовой» версиями заключаются в том, что в этом случае сигнал тревоги прекращается при обнаружении любого нажатия клавиши или движения мыши (более удобно, чем останавливать Rhythmbox на компьютере, когда вы только что проснулись), и что сигнал тревоги автоматически отключается после определенный период времени.

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

sudo apt-get install xprintidle

Сценарий:

#!/usr/bin/env python3

import subprocess
import time
import datetime
from threading import Thread

#-------------------------- edit settings below -------------------------------
max_wakeupduration = 1              # max time the song will play (minutes)
wakeup_hour = 7                     # wake up hour (0-24)
wakeup_minute = 15                  # wake up minute
wakeup_song = "/path/to/song.mp3"   # path to wake up song
#------------------------------------------------------------------------------

def stop_wakeup():
    time1 = int(time.time()); time2 = time1
    last_idle = 0
    playtime = max_wakeupduration*60
    while time2 - time1 < playtime:
        get_idle = subprocess.Popen(["xprintidle"], stdout=subprocess.PIPE)
        curr_idle = int(get_idle.communicate()[0].decode("utf-8"))
        if curr_idle < last_idle:
            break
        else:
            last_idle = curr_idle
            time.sleep(1)
            time2 = int(time.time())
    subprocess.Popen(["pkill", "rhythmbox"])

def calculate_time():
    currtime = str(datetime.datetime.now().time()).split(":")[:2]
    minutes_set = wakeup_hour*60 + wakeup_minute
    minutes_curr = int(currtime[0])*60 + int(currtime[1])
    if minutes_curr < minutes_set:
        minutes_togo = minutes_set - minutes_curr
    else:
        minutes_togo = minutes_set + 1440-minutes_curr
    return minutes_togo*60

def go_asleep():
    sleeptime = calculate_time()   
    run = "rtcwake -m disk -s "+str(sleeptime)+" && "+"sleep 20"
    subprocess.call(['/bin/bash', '-c', run])
    combined_actions()

def play_song():
    command = "rhythmbox "+wakeup_song
    subprocess.Popen(['/bin/bash', '-c', command])

def combined_actions():
    Thread(target = play_song).start()
    Thread(target = stop_wakeup).start()

go_asleep()

объяснение

rtcwake

Оба сценария написаны вокруг rtcwakeкоманды, как описано здесь . Команду можно использовать, чтобы перевести компьютер в режим ожидания и активировать его через определенное время (и при необходимости запустить команду после активации). Эта -m diskопция используется, поскольку OP упомянул, что его компьютер не поддерживает функцию «приостановить работу в ОЗУ» в BIOS. Смотрите также man rtcwake.

Функция остановки

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

Якоб Влейм
источник
Я бы предложил новичку не трогать файл sudoers.
RegarBoy
@ Разработчик им практически нужен, но следует предупредить. Будет редактировать, если я вернусь домой (в настоящее время на мобильном телефоне).
Джейкоб Влейм
@ разработчик и готово ....
Джейкоб Влейм
1
Не должно ли это быть sudo visudo /etc/sudoers?
UniversallyUniqueID
@BharadwajRaju нет, попробуйте :) vi это просто редактор.
Джейкоб Влейм
2

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

Ищите «разбудить по локальной сети» (WOL).

Presbitero
источник
Нет, это только Wi-Fi.
Челиос
1

У меня были проблемы с запуском скрипта Джейкоба на Python, поэтому я переписал его на bash . Просто скачайте его, сделайте его исполняемым и соответственно отредактируйте переменные.

Пара вещей: время будильника устанавливается через date -d. Некоторые примеры из man date:

  • "Солнце, 29 февраля 2004 16:21:42 -0800"
  • "2004-02-29 16:21:42"
  • "в следующий четверг"

После пробуждения я использую vlc -Lмузыку в цикле. Если ваш путь к папке, он будет пытаться воспроизвести файлы в нем. Это то, чем я занимаюсь.

Саша Давиденко
источник