Wecker aus dem Suspended-Modus

9

Ich möchte, dass mein Laptop morgens aus dem angehaltenen Modus aufwacht und mich alarmiert, mit meiner MP3-Datei aufzuwachen. Wie mache ich es?

Ich habe versucht, apmsleep zu verwenden, aber es funktioniert nicht, da mein PC im BIOS nicht über die Funktion "In RAM suspendieren" verfügt. Was kann ich machen? Vielen Dank!

Chelios
quelle

Antworten:

13

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.pyund 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, xprintidlemuss 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 rtcwakeBefehl 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 diskOption 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.

Jacob Vlijm
quelle
Ich würde Neulingen empfehlen, die Sudoers-Datei nicht zu berühren.
RegarBoy
@ Entwickler müssen sie praktisch, aber eine Warnung sollte gegeben werden. Wird bearbeitet, wenn ich nach Hause komme (derzeit auf dem Handy).
Jacob Vlijm
@ Entwickler und fertig ....
Jacob Vlijm
1
Sollte es nicht sein sudo visudo /etc/sudoers?
UniversallyUniqueID
@ BharadwajRaju nein, probier es aus :) vi ist nur der Editor.
Jacob Vlijm
2

Wenn Sie Ihren Laptop über ein Kabel mit dem Internet verbinden können, können Sie versuchen, mit einem anderen Computer oder Smartphone ein "magisches Paket" an das Internet zu senden und es aufzuwecken.

Suchen Sie nach "Wake on Lan" (WOL).

Presbitero
quelle
Nein, es ist nur WiFi.
Chelios
1

Ich hatte Probleme beim Ausführen von Jacobs Python-Skript, also habe ich es in Bash umgeschrieben . Laden Sie es einfach herunter, machen Sie es ausführbar und bearbeiten Sie die Variablen entsprechend.

Ein paar Dinge: Die Alarmzeit wird über eingestellt date -d. Einige Beispiele aus man date:

  • "So, 29. Februar 2004, 16:21:42 -0800"
  • "2004-02-29 16:21:42"
  • "nächsten Donnerstag"

Nach dem Aufwachen vlc -Lspiele ich Musik in einer Schleife. Wenn Ihr Pfad ein Ordner ist, wird versucht, darin enthaltene Dateien abzuspielen. Das ist, was ich tue.

Саша Давиденко
quelle