Réveil du mode suspendu

9

Je veux que mon ordinateur portable se réveille du mode suspendu le matin et m'alarme pour me réveiller en utilisant mon fichier mp3. Comment fait-on ça?

J'ai essayé apmsleep, mais cela ne fonctionne pas car mon PC n'a pas de fonction "suspendre à la RAM" dans le BIOS. Que puis-je faire? Merci!

Chelios
la source

Réponses:

13

1. fonction de réveil de base

Entrer en mode suspension

pour cette solution, vous devez entrer en mode suspension en exécutant le script ci-dessous. Il fait passer l'ordinateur en mode suspension et vous réveille à une heure (horloge) définie par vous (dans le script). jouer votre chanson.

Bien sûr, vous pouvez simplement exécuter le script manuellement pour l'utiliser, mais il est plus pratique de le rendre disponible via une combinaison de touches, définie dans System Settings > Keyboard > Shortcuts > Custom Shortcuts.

Installer

  • Collez le script ci-dessous dans un fichier vide, définissez l'heure de réveil (horloge) (en 1-24 heures, 1-60 minutes), définissez le chemin d'accès à votre chanson de réveil et enregistrez-la sous 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])
    
  • rendre le script exécutable

  • Définissez une combinaison de touches pour exécuter le script; ouvrez System Preferences > Keyboard > Shortcuts > Custom Shortcuts, ajoutez la commande

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

    et choisissez une combinaison de touches

  • Le script a besoin des privilèges d'administrateur. Pour l'exécuter sans avoir à saisir le mot de passe, ouvrez le fichier sudoers:

    sudo visudo
    

    ajoutez la ligne tout en bas du fichier:

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

    Notez que le fichier sudoers est un fichier essentiel; des erreurs dans le fichier peuvent entraîner de graves problèmes , alors faites attention!

NB

  • Après le réveil, l'ordinateur est inactif pendant 20 secondes avant le déclenchement de l'alarme.
  • Si vous ne voulez pas modifier le fichier sudoers, vous devez installer gksu: sudo apt-get install gksu. Dans ce cas, la commande pour exécuter le script est gksu /path/to/wakeup.pyet vous serez invité à entrer votre mot de passe chaque fois que vous l'exécuterez.

Vous pouvez maintenant entrer en mode suspension avec votre combinaison de touches et vous serez réveillé par votre chanson de réveil.

Version 2.Extended comprenant la fonction d'arrêt quand (n'importe quelle) touche ou souris est frappée

Les différences entre celui - ci et la version « de base » est que celui - ci l'arrête alarme lorsque tout mouvement de frappe ou la souris est détectée (plus pratique que l' arrêt Rhythmbox sur l'ordinateur lorsque vous vient de se réveiller), et que l'alarme automatiquement les sorties après une période de temps définie.

La configuration est à peu près la même que la version de base, mais xprintidledoit être installée pour détecter les événements de mouvement de touche ou de souris:

sudo apt-get install xprintidle

Le scénario:

#!/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()

Explication

rtcwake

Les deux scripts sont écrits autour de la rtcwakecommande, comme expliqué ici . La commande peut être utilisée pour mettre l'ordinateur en veille et se réveiller après un laps de temps défini (et éventuellement exécuter une commande après le réveil). L' -m diskoption est utilisée, car OP a mentionné que son ordinateur ne prend pas en charge la fonction "suspendre à la RAM" dans le BIOS. Voir aussi man rtcwake.

La fonction d'arrêt

La fonction d'arrêt fonctionne grâce à une fonction qui mesure le temps d'inactivité chaque seconde pendant la lecture du morceau et se souvient du dernier temps d'inactivité. SI le dernier temps d'inactivité dépasse celui en cours, cela signifie qu'un événement de frappe ou de souris a eu lieu et que Rhythmbox est tué.

Jacob Vlijm
la source
Je suggérerais aux débutants de ne pas toucher au fichier sudoers.
RegarBoy
@ développeur dont ils ont pratiquement besoin, mais un avertissement devrait être donné. Modifie si je rentre à la maison (actuellement sur mobile).
Jacob Vlijm
@ développeur et fait ....
Jacob Vlijm
1
N'est-ce pas sudo visudo /etc/sudoers?
UniversallyUniqueID
@BharadwajRaju non, essayez-le :) vi n'est que l'éditeur.
Jacob Vlijm
2

Si vous pouvez connecter votre ordinateur portable à Internet par un câble, vous pouvez essayer d'utiliser un autre ordinateur ou smartphone pour lui envoyer un "paquet magique" et le réveiller.

Recherchez "wake on lan" (WOL).

Presbitero
la source
Non, c'est uniquement le wifi.
Chelios
1

J'ai eu du mal à exécuter le script python de Jacob, alors je l'ai réécrit en bash . Il suffit de le télécharger, de le rendre exécutable et de modifier les variables en conséquence.

Deux ou trois choses: l'heure de l'alarme est réglée via date -d. Quelques exemples de man date:

  • "Dim, 29 févr. 2004 16:21:42 -0800"
  • "2004-02-29 16:21:42"
  • "jeudi prochain"

Après le réveil, j'utilise vlc -Lpour jouer de la musique en boucle. Si votre chemin est un dossier, il essaiera de lire les fichiers qu'il contient. C'est ce que je fais.

Саша Давиденко
la source