1.Função de despertador básico
Entrando no modo suspenso
para esta solução, você precisa entrar no modo de suspensão executando o script abaixo. Isso faz com que o computador entre em modo suspenso e o acorde em um horário (de relógio), definido por você (no script). tocando sua música.
É claro que você pode simplesmente executar o script manualmente para usá-lo, mas é mais conveniente disponibilizá-lo através de uma combinação de teclas, definida em System Settings > Keyboard > Shortcuts > Custom Shortcuts
.
Configurar
-
Cole o script abaixo em um arquivo vazio, defina o horário de despertar (em 1-24 horas, 1-60 minutos), defina o caminho para sua música de despertar e salve-o como
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])
-
torne o script executável
-
Defina uma combinação de teclas para executar o script; abra
System Preferences > Keyboard > Shortcuts > Custom Shortcuts
, adicione o comandosudo /path/to/wakeup.py (sudo = assuming you do the next step below)
e escolha uma combinação de teclas
-
O script precisa dos privilégios do administrador. Para executá-lo sem ter que digitar a senha, abra o arquivo sudoers:
sudo visudo
adicione a linha ao final do arquivo:
[your_username] ALL=NOPASSWD: [/path/to/wakeup.py]
Note que o arquivo sudoers é um arquivo essencial; erros no arquivo podem levar a sérios problemas , então seja cuidadoso!
N.B.
- Após o despertar, o computador fica inativo por 20 segundos antes do início do alarme.
- Se você não quiser editar o arquivo sudoers, precisará instalar
gksu
:sudo apt-get install gksu
. Nesse caso, o comando para executar o script égksu /path/to/wakeup.py
, e você será solicitado sua senha toda vez que você a executar.
Agora você pode entrar no modo de suspensão com sua combinação de teclas e você será despertado pela sua música de despertar.
2.Extended version incluindo a função stop quando a tecla (qualquer) ou o mouse é pressionado
As diferenças entre este e a versão "básica" são que neste o alarme pára quando qualquer pressionamento de tecla ou movimento do mouse é detectado (mais conveniente do que parar o Rhythmbox no computador quando você acabou de acordar para cima), e que o alarme sai automaticamente após um período de tempo definido.
A configuração é praticamente a mesma que a versão básica, mas xprintidle
precisa ser instalado para detectar eventos de movimento de pressionamento de tecla ou de mouse:
sudo apt-get install xprintidle
O script:
#!/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()
Explicação
rtcwake
Ambos os scripts são escritos em torno do comando rtcwake
, conforme explicado aqui . O comando pode ser usado para colocar o computador em suspensão e acordar após um período de tempo definido (e, opcionalmente, executar um comando após o despertar). A opção -m disk
é usada, pois OP mencionou que seu computador não suporta o recurso "suspender para RAM" no BIOS. Veja também man rtcwake
.
A função de parada
A função de parada funciona por uma função que mede o tempo ocioso a cada segundo enquanto a música está tocando, e lembra o último tempo ocioso. SE o último tempo ocioso excede o atual, significa que ocorreu um evento de pressionamento de tecla ou de mouse e o Rhythmbox foi eliminado.