1. Grundlegende Weckerfunktion
Suspend-Modus aufrufen
Für diese Lösung müssen Sie in den Suspend-Modus wechseln, indem Sie das folgende Skript ausführen. Dadurch wird der Computer in den Suspend-Modus versetzt und Sie werden zu einer von Ihnen (im Skript) festgelegten (Uhr-) Zeit geweckt. spiele dein Lied.
Natürlich können Sie das Skript einfach manuell ausführen, um es zu verwenden, aber es ist bequemer, es über eine Tastenkombination verfügbar zu machen, die in festgelegt ist System Settings > Keyboard > Shortcuts > Custom Shortcuts
.
Konfiguration
Fügen Sie das folgende Skript in eine leere Datei ein, stellen Sie die Weckzeit (in 1-24 Stunden, 1-60 Minuten) ein, legen Sie den Pfad zu Ihrem Weck-Song fest und speichern Sie ihn unter 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])
Machen Sie das Skript ausführbar
Legen Sie eine Tastenkombination fest, um das Skript auszuführen. Öffnen Sie System Preferences > Keyboard > Shortcuts > Custom Shortcuts
, fügen Sie den Befehl hinzu
sudo /path/to/wakeup.py (sudo = assuming you do the next step below)
und wählen Sie eine Tastenkombination
Das Skript benötigt Administratorrechte. Öffnen Sie die sudoers-Datei, um sie auszuführen, ohne das Kennwort eingeben zu müssen:
sudo visudo
Fügen Sie die Zeile ganz unten in die Datei ein:
[your_username] ALL=NOPASSWD: [/path/to/wakeup.py]
Beachten Sie, dass die sudoers-Datei eine wichtige Datei ist. Fehler in der Datei führen möglicherweise zu schwerwiegenden Problemen . Seien Sie also vorsichtig!
NB
- Nach dem Aufwachen ist der Computer 20 Sekunden lang inaktiv, bevor der Alarm ausgelöst wird.
- Wenn Sie die sudoers-Datei nicht bearbeiten möchten, müssen Sie Folgendes installieren
gksu
: sudo apt-get install gksu
. In diesem Fall lautet der Befehl zum Ausführen des Skripts gksu /path/to/wakeup.py
und Sie werden bei jeder Ausführung zur Eingabe Ihres Kennworts aufgefordert.
Jetzt können Sie mit Ihrer Tastenkombination in den Suspend-Modus wechseln und werden von Ihrem Weck-Song geweckt.
2.Erweiterte Version mit Stoppfunktion, wenn (eine beliebige) Taste oder Maus gedrückt wird
Der Unterschied zwischen dieser und der "Basis" -Version besteht darin, dass in dieser Version der Alarm stoppt, wenn ein Tastendruck oder eine Mausbewegung erkannt wird (bequemer als das Stoppen der Rhythmbox auf dem Computer, wenn Sie gerade aufgewacht sind), und dass der Alarm danach automatisch beendet wird einen definierten Zeitraum.
Das Setup entspricht weitgehend der Basisversion, xprintidle
muss jedoch installiert werden, um Tastendruck- oder Mausbewegungsereignisse zu erkennen:
sudo apt-get install xprintidle
Das Skript:
#!/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()
Erläuterung
rtcwake
Beide Skripte werden um den rtcwake
Befehl herum geschrieben , wie hier erläutert . Der Befehl kann verwendet werden, um den Computer nach einer festgelegten Zeitspanne anzuhalten und aufzuwecken (und optional einen Befehl nach dem Aufwecken auszuführen). Die -m disk
Option wird verwendet, da OP erwähnt hat, dass sein Computer die Funktion "In RAM suspendieren" im BIOS nicht unterstützt. Siehe auch man rtcwake
.
Die Stoppfunktion
Die Stop-Funktion arbeitet mit einer Funktion, die jede Sekunde die Leerlaufzeit misst, während der Song abgespielt wird, und die letzte Leerlaufzeit speichert. Wenn die letzte Leerlaufzeit die aktuelle überschreitet, bedeutet dies, dass ein Tastenanschlag oder ein Mausereignis stattgefunden hat und die Rhythmbox beendet wird.