Budzik z trybu zawieszenia

9

Chcę, aby mój laptop obudził się rano z trybu zawieszonego i zaalarmował mnie, żebym obudził się przy użyciu mojego pliku mp3. Jak mam to zrobić?

Próbowałem apmsleep, ale to nie działa, ponieważ mój komputer nie ma funkcji „zawieszenia pamięci RAM” w systemie BIOS. Co mogę zrobić? Dzięki!

Chelios
źródło

Odpowiedzi:

13

1.Podstawowa funkcja budzika

Wejście w tryb zawieszenia

w przypadku tego rozwiązania należy przejść do trybu zawieszenia, uruchamiając poniższy skrypt. Powoduje, że komputer przechodzi w tryb zawieszenia i budzi cię o (zdefiniowanym przez ciebie (w skrypcie) czasie). gra twoją piosenkę.

Oczywiście możesz po prostu uruchomić skrypt ręcznie, aby go użyć, ale wygodniej jest udostępnić go za pomocą kombinacji klawiszy ustawionej w System Settings > Keyboard > Shortcuts > Custom Shortcuts.

Ustawiać

  • Wklej poniższy skrypt w pustym pliku, ustaw czas budzenia (zegar) (w ciągu 1-24 godzin, 1-60 minut), ustaw ścieżkę do utworu budzika i zapisz go jako 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])
  • uczynić skrypt wykonalnym

  • Ustaw kombinację klawiszy, aby uruchomić skrypt; otwórz System Preferences > Keyboard > Shortcuts > Custom Shortcuts, dodaj polecenie

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

    i wybierz kombinację klawiszy

  • Skrypt wymaga uprawnień administratora. Aby uruchomić go bez konieczności podawania hasła, otwórz plik sudoers:

    sudo visudo
    

    dodaj linię na samym dole pliku:

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

    Zauważ, że plik sudoers jest plikiem niezbędnym; błędy w pliku mogą prowadzić do poważnych problemów , więc bądź ostrożny!

NB

  • Po przebudzeniu komputer jest bezczynny przez 20 sekund przed uruchomieniem alarmu.
  • Jeśli nie chcesz, aby edytować plik sudoers, musisz zainstalować gksu: sudo apt-get install gksu. W takim przypadku polecenie uruchomienia skryptu to gksu /path/to/wakeup.pymonit o podanie hasła przy każdym uruchomieniu.

Teraz możesz przejść do trybu zawieszania za pomocą kombinacji klawiszy, a obudzi Cię piosenka pobudki.

2. Wersja rozszerzona, w tym funkcja zatrzymania po naciśnięciu (dowolnego) klawisza lub myszy

Różnice między tą wersją a wersją „podstawową” polegają na tym, że w tym alarm wyłącza się po wykryciu dowolnego naciśnięcia klawisza lub ruchu myszy (wygodniej niż zatrzymanie Rhythmbox na komputerze, gdy się właśnie budzisz) oraz że alarm automatycznie wychodzi po określony czas.

Konfiguracja jest prawie taka sama jak wersja podstawowa, ale xprintidlenależy ją zainstalować, aby wykryć zdarzenia ruchów klawiszy lub myszy:

sudo apt-get install xprintidle

Scenariusz:

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

Wyjaśnienie

rtcwake

Oba skrypty są napisane wokół rtcwakepolecenia, jak wyjaśniono tutaj . Polecenia można użyć do zawieszenia komputera i wznowienia działania po określonym czasie (i opcjonalnie uruchomienia polecenia po przebudzeniu). -m diskOpcja jest używana, ponieważ PO wspomniano jego komputer nie obsługuje „suspend to RAM” funkcji w BIOS. Zobacz także man rtcwake.

Funkcja stop

Funkcja stop działa według funkcji, która mierzy czas bezczynności co sekundę podczas odtwarzania utworu i zapamiętuje ostatni czas bezczynności. JEŚLI ostatni czas bezczynności przekracza bieżący, oznacza to, że miało miejsce naciśnięcie klawisza lub myszy i Rhythmbox został zabity.

Jacob Vlijm
źródło
Sugerowałbym, aby nowicjusz nie dotykał pliku sudoers.
RegarBoy,
@developer praktycznie tego potrzebują, ale należy ostrzec. Dokonam edycji, jeśli wrócę do domu (obecnie na telefonie komórkowym).
Jacob Vlijm
@developer i gotowe ....
Jacob Vlijm
1
Nie powinno tak być sudo visudo /etc/sudoers?
UniversallyUniqueID
@BharadwajRaju nie, spróbuj :) vi to tylko edytor.
Jacob Vlijm
2

Jeśli możesz podłączyć laptopa do Internetu za pomocą kabla, możesz spróbować użyć innego komputera lub smartfona, aby wysłać do niego „magiczny pakiet” i go obudzić.

Poszukaj „wake on lan” (WOL).

Presbitero
źródło
Nie, to tylko wifi.
Chelios,
1

Miałem problemy z uruchomieniem skryptu pytona Jacoba, więc przepisałem go od razu . Wystarczy go pobrać, sprawić, by był wykonywalny i odpowiednio edytować zmienne.

Kilka rzeczy: czas alarmu jest ustawiany za pomocą date -d. Niektóre przykłady z man date:

  • „Niedziela, 29 lutego 2004 r. 16:21:42 -0800”
  • „2004-02-29 16:21:42”
  • "Następny czwartek"

Po przebudzeniu używam vlc -Ldo odtwarzania muzyki w pętli. Jeśli twoja ścieżka jest folderem, spróbuje odtworzyć w nim pliki. To jest to co robię.

Саша Давиденко
źródło