1. Базова функція будильника
Вхід у режим призупинення
для цього рішення потрібно перейти в режим призупинення, запустивши сценарій нижче. Це змушує комп'ютер перейти в режим призупинення і пробуджує вас у (годинний) час, визначений вами (у сценарії). відтворення вашої пісні.
Звичайно, ви можете просто запустити сценарій вручну для його використання, але зручніше зробити його доступним за допомогою комбінації клавіш, встановленої в 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варіант використовується, оскільки згаданий ОП його комп'ютер не підтримує функцію "призупинити оперативну пам'ять" в BIOS. Дивіться також man rtcwake.
Функція зупинки
Функція зупинки працює за допомогою функції, яка вимірює час очікування щосекунди під час відтворення пісні та запам'ятовує останній час очікування. Якщо останній час очікування перевищує поточний, це означає, що відбулася подія клавіші або миші, і Rhythmbox вбивається.