暂停模式的闹钟

暂停模式的闹钟

我想让我的笔记本电脑在早上从挂起模式唤醒,并使用我的 mp3 文件来闹钟叫醒我。我该怎么做?

我尝试了 apmsleep,但它不起作用,因为我的 PC 在 BIOS 中没有“挂起到 RAM”功能。我该怎么办?谢谢!

答案1

1.基本闹钟功能

进入挂起模式

对于此解决方案,您需要通过运行以下脚本进入挂起模式。它使计算机进入挂起模式并在您(在脚本中)定义的(时钟)时间唤醒您。播放您的歌曲。

当然,您可以简单地手动运行脚本来使用它,但通过组合键设置来使其可用会更方便System Settings > Keyboard > Shortcuts > Custom Shortcuts

设置

  • 将下面的脚本粘贴到一个空文件中,设置唤醒(时钟)时间(1-24 小时,1-60 分钟),设置唤醒歌曲的路径,然后将其保存为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])
    
  • 使脚本可执行

  • 设置组合键来运行脚本;打开System Preferences > Keyboard > Shortcuts > Custom Shortcuts,添加命令

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

    并选择一个组合键

  • 该脚本需要管理员权限。若要在不输入密码的情况下运行它,请打开 sudoers 文件:

    sudo visudo
    

    将此行添加到文件的最底部:

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

    请注意,sudoers 文件是必不可少的文件;文件中的错误可能会导致严重问题,所以要小心!

注意:

  • 唤醒后,计算机闲置 20 秒,然后闹钟开始。
  • 如果你不想编辑 sudoers 文件,你需要安装 gksusudo apt-get install gksu。在这种情况下,运行脚本的命令是gksu /path/to/wakeup.py,每次运行时都会提示你输入密码。

现在,您可以使用组合键进入挂起模式,并会被唤醒歌曲唤醒。

2.扩展版本 包括按下(任何)键或鼠标时的停止功能

这个版本和“基本版”的区别在于,这个版本中闹钟会在以下情况下停止:任何检测到击键或鼠标移动(比刚醒来时停止计算机上的 Rhythmbox 更方便),并且警报在定义的时间段后自动退出。

设置与基本版本几乎相同,但xprintidle需要安装,以检测击键或鼠标移动事件:

sudo apt-get install xprintidle

剧本:

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

解释

唤醒

两个脚本都是围绕rtcwake命令编写的,如下所述这里。该命令可用于将计算机置于挂起状态并在定义的时间后唤醒(并可选择在唤醒后运行命令)。-m disk使用该选项,因为 OP 提到他的计算机不支持 BIOS 中的“挂起到 RAM”功能。另请参阅man rtcwake

停止函数

停止功能的工作原理是在播放歌曲时每秒测量空闲时间并记住最后的空闲时间。如果最后的空闲时间超过了当前时间,这意味着发生了击键或鼠标事件,并且 Rhythmbox 被杀死。

答案2

如果您可以通过电缆将笔记本电脑连接到互联网,您可以尝试使用另一台计算机或智能手机向其发送“魔包”,然后唤醒它。

寻找“局域网唤醒”(WOL)。

答案3

我在运行 Jacob 的 Python 脚本时遇到了麻烦,所以我用 bash 重写它。只需下载它,使其可执行,并相应地编辑变量。

有几件事:闹钟时间是通过设置的date -d。以下是一些示例man date

  • “2004 年 2 月 29 日星期日 16:21:42 -0800”
  • “2004-02-29 16:21:42”
  • “下个星期四”

唤醒后,我会vlc -L循环播放一些音乐。如果您的路径是文件夹,它会尝试播放其中的文件。这就是我所做的。

答案4

对于使用 systemd 的系统,可以使用临时 systemd 计时器安排该命令systemd 运行. 临时单元在完成并重新启动时将被清除。

systemd-run --collect --user --unit=alarm-clock --on-active="1h 30m" --timer-property=WakeSystem=true flatpak run io.bassi.Amberol ~/Music/test.mp3

rtcwake -m no工作。suspend 独立于命令,因此系统可以挂起或正常使用。如果系统没有被挂起或被唤醒并再次挂起,它仍然可以工作。

笔记:

  • 跑步的结合Wayland 应用程序没有额外的环境变量--user)并从挂起状态唤醒(WakeSystem=true)可从systemd v254向前。
  • --collect:即使失败也会删除单元文件,否则 systemd 会在使用相同名称时抱怨悬空的服务文件,并且systemctl reset-failed需要重新启动。
  • --unit:为单位(计时器和服务文件)命名。安排多个闹钟时,省略此项可能更容易。
  • --on-active需要的时间不只是几秒钟。格式是这里
  • flatpak run io.bassi.Amberol ~/Music/test.mp3是命令。

PS
--on-active+WakeSystem=true没有按预期工作从 v254 开始,
--on-calendar可以正常工作。例如--on-calendar="12:34:56"(尽管这是重复的,因为没有指定日期)。

相关内容