Đồng hồ báo thức từ chế độ treo


9

Tôi muốn máy tính xách tay của tôi thức dậy từ chế độ treo vào buổi sáng và báo cho tôi thức dậy bằng tệp mp3 của tôi. Tôi phải làm nó như thế nào?

Tôi đã thử ngủ, nhưng nó không hoạt động vì PC của tôi không có tính năng "đình chỉ RAM" trong BIOS. Tôi có thể làm gì? Cảm ơn!

Câu trả lời:


13

1. Chức năng đồng hồ báo thức cơ bản

Đang vào chế độ treo

Đối với giải pháp này, bạn cần vào chế độ tạm dừng bằng cách chạy tập lệnh bên dưới. Nó làm cho máy tính chuyển sang chế độ treo và đánh thức bạn tại một thời điểm (đồng hồ-), được xác định bởi bạn (trong tập lệnh). chơi bài hát của bạn

Tất nhiên bạn chỉ có thể chạy tập lệnh theo cách thủ công để sử dụng nó, nhưng sẽ thuận tiện hơn khi cung cấp tập lệnh thông qua tổ hợp phím, được đặt trong System Settings > Keyboard > Shortcuts > Custom Shortcuts.

Thiết lập

  • Dán đoạn script bên dưới vào một tệp trống, đặt thời gian đánh thức (đồng hồ) (trong 1-24 giờ, 1-60 phút), đặt đường dẫn đến bài hát đánh thức của bạn và lưu nó dưới dạng 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])
  • làm cho kịch bản thực thi

  • Đặt tổ hợp phím để chạy tập lệnh; mở System Preferences > Keyboard > Shortcuts > Custom Shortcuts, thêm lệnh

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

    và chọn một tổ hợp phím

  • Kịch bản cần đặc quyền của quản trị viên. Để chạy nó mà không cần phải nhập mật khẩu, hãy mở tệp sudoers:

    sudo visudo
    

    thêm dòng vào dưới cùng của tập tin:

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

    Lưu ý rằng tệp sudoers là một tệp thiết yếu; lỗi trong tập tin có thể dẫn đến các vấn đề nghiêm trọng , vì vậy hãy cẩn thận!

Lưu ý

  • Sau khi thức dậy, máy tính không hoạt động trong 20 giây trước khi báo thức bắt đầu.
  • Nếu bạn không muốn chỉnh sửa tệp sudoers, bạn cần cài đặt gksu: sudo apt-get install gksu. Trong trường hợp đó, lệnh để chạy tập lệnh là gksu /path/to/wakeup.pyvà bạn sẽ được nhắc nhập mật khẩu mỗi lần bạn chạy nó.

Bây giờ bạn có thể vào chế độ tạm dừng với tổ hợp phím của mình và bạn sẽ bị đánh thức bởi bài hát đánh thức của mình.

2. Phiên bản mở rộng bao gồm chức năng dừng khi nhấn phím (bất kỳ) hoặc chuột

Sự khác biệt giữa phiên bản này và phiên bản "cơ bản" là ở chế độ này, báo thức sẽ dừng khi phát hiện thấy bất kỳ chuyển động phím hoặc chuột nào (thuận tiện hơn là dừng Rhybeatbox trên máy tính khi bạn vừa thức dậy) và báo thức sẽ tự động thoát sau một khoảng thời gian xác định.

Thiết lập khá giống với phiên bản cơ bản, nhưng xprintidlecần phải được cài đặt, để phát hiện các sự kiện di chuyển phím hoặc chuột:

sudo apt-get install xprintidle

Kịch bản:

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

Giải trình

rtcwake

Cả hai kịch bản được viết xung quanh rtcwakelệnh, như được giải thích ở đây . Lệnh có thể được sử dụng để đặt máy tính tạm dừng và thức dậy sau một khoảng thời gian xác định (và tùy ý chạy lệnh sau khi thức dậy). Các -m disktùy chọn được sử dụng, vì OP đề cập máy tính của mình không hỗ trợ "đình chỉ để RAM" tính năng trong BIOS. Xem thêm man rtcwake.

Chức năng dừng

Hàm dừng hoạt động theo chức năng đo thời gian nhàn rỗi mỗi giây khi bài hát đang phát và ghi nhớ thời gian rảnh cuối cùng. NẾU thời gian nhàn rỗi cuối cùng vượt quá thời gian hiện tại, điều đó có nghĩa là một sự kiện nhấn phím hoặc chuột đã diễn ra và Rhybeatbox bị giết.


Tôi sẽ đề nghị người mới không chạm vào tập tin sudoers.
RegarBoy

@ nhà phát triển họ thực tế cần, nhưng một cảnh báo nên được đưa ra. Sẽ chỉnh sửa nếu tôi về nhà (hiện tại trên điện thoại di động).
Jacob Vlijm

@ nhà phát triển và đã hoàn thành ....
Jacob Vlijm

1
Có nên không sudo visudo /etc/sudoers?
Đại

@BharadwajRaju không, hãy thử đi :) vi chỉ là biên tập viên.
Jacob Vlijm

2

Nếu bạn có thể kết nối máy tính xách tay của bạn với internet bằng cáp, bạn có thể thử sử dụng một máy tính hoặc điện thoại thông minh khác để gửi "gói ma thuật" tới nó và đánh thức nó.

Tìm kiếm "đánh thức trên lan" (WOL).


Không, đó chỉ là wifi.
Chelios

1

Tôi gặp khó khăn khi chạy kịch bản python của Jacob, vì vậy tôi đã viết lại nó trong bash . Chỉ cần tải về nó, làm cho nó thực thi và chỉnh sửa các biến cho phù hợp.

Một vài điều: thời gian báo thức được thiết lập thông qua date -d. Một số ví dụ từ man date:

  • "CN, 29 tháng 2 năm 2004 16:21:42 -0800"
  • "2004 / 02-29 16:21:42"
  • "thứ năm tới"

Sau khi thức dậy, tôi sử dụng vlc -Lđể chơi một số nhạc trong một vòng lặp. Nếu đường dẫn của bạn là một thư mục, nó sẽ cố gắng phát các tệp trong đó. Đó là những gì tôi làm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.