鬧鐘已經(jīng)成了我們生活中必不可少的東西。如果全球每個國家的當(dāng)?shù)貢r間明天早上,所有的鬧鐘突然都不響了,不知道會發(fā)生什么樣的混亂。
然而我們要討論另外一種情況,鬧鐘每天定時響起來,真的是最好的情況嗎?你有過醒來以后等鬧鐘的經(jīng)歷嗎?如果你有時候在鬧鐘響之前就起來了,那么你會不會希望鬧鐘能知道你已經(jīng)起來了?如果你提前醒了,那么鬧鐘就不響,只有你一直睡著的時候,鬧鐘才會按時響起來。
這個項(xiàng)目基于 Andorid 上面的自動化 workflow 程序 Automate 和 Python 制作??偞a量非常小。
做這個東西目的,是因?yàn)槲椰F(xiàn)在早上有時候會在 7 點(diǎn)起床寫東西,然后再去上班。但有時候可能會直接睡到 7 點(diǎn) 45 ,讓鬧鐘把我鬧醒。提前起床可能會忘記關(guān)鬧鐘,但是我不希望在我早上寫作的時候被鬧鐘打擾。
如果我早上提前起床使用電腦,那么 Automate 可以得到信息,并關(guān)閉鬧鐘。如果 Automate 發(fā)現(xiàn)我 7 點(diǎn) 45 都還沒有碰電腦,就會把我鬧醒。整個過程,我不需要和鬧鐘有任何的交互。
這就是AutoAlarmClock這個項(xiàng)目存在的意義。
設(shè)計(jì)思路
AutoAlarmClock分為三個部分,安卓手機(jī)上的Automate,VPS上面的Web Server和Mac OS上面的一行命令。
每天早上7點(diǎn)40,手機(jī)上的Automate會訪問一個URL A:http://autoemo.kingname.info:745/alarm_clock,只要沒有得到返回信息“No”,無論是網(wǎng)絡(luò)問題,還是因?yàn)榉?wù)器返回的是其他信息,都會設(shè)定一個鬧鐘,在7點(diǎn)45分響起來。只有訪問URL以后,服務(wù)器返回“No”,那么就不設(shè)鬧鐘。
對于電腦來說,每天早上7點(diǎn)30分,如果電腦是開著的,說明我正在工作。這個時候電腦就會自動訪問一個URL B:http://autoemo.kingname.info:745/set_alarm.只有這個URL被訪問過,之前給Automate訪問的URL A才會返回“No”。
設(shè)計(jì)實(shí)現(xiàn)
Web Server
Web Server是手機(jī)和電腦之間的橋梁。它是使用Python的Flask框架寫成的。代碼已經(jīng)放在了Github上:AutoAlarmClock. 包括空行總共只有32行代碼。
from flask import Flask
from datetime import date
import os
app = Flask(__name__)
@app.route('/')
def index():
return 'please visit my blog at http://kingname.info'
@app.route("/alarm_clock")
def alarm_clock():
if os.path.exists('alarmclock.txt'):
with open('alarmclock.txt') as f:
date_in_txt = f.read()
today = str(date.today())
if date_in_txt == today:
return 'No'
return 'Yes'
@app.route('/set_alarm')
def set_alarm():
with open('alarmclock.txt', 'w') as f:
f.write(str(date.today()))
return 'OK'
if __name__ == "__main__":
app.run(host='0.0.0.0', port=745)
由于這個Web Server每天只訪問兩次,所以沒有必要使用數(shù)據(jù)庫或者做線程安全的設(shè)置。數(shù)據(jù)只需要使用一個文本文件作為中轉(zhuǎn)即可。一旦http://autoemo.kingname.info:745/set_alarm這個鏈接被訪問,就會在當(dāng)前目錄創(chuàng)建一個alarmclock.txt文件,里面存放的是今天的日期。當(dāng)http://autoemo.kingname.info:745/alarm_clock被訪問的時候,它會去檢查alarmclock.txt,如果這個文件不存在,或者里面的日期不是今天的日期,那么它就會返回“Yes”。只有當(dāng)alarmclock.txt存在,并且里面的內(nèi)容為今天的日期,它才會返回“No”。
電腦端
電腦只需要訪問http://autoemo.kingname.info:745/set_alarm.由于Mac Book Pro只休眠,不關(guān)機(jī),無法使用開機(jī)啟動的方法來觸發(fā)這個URL的訪問。所以我使用了Crontab這個定時任務(wù)。因?yàn)樵陔娔X休眠的時候,Crontab的定時任務(wù)是不會執(zhí)行的,只有我在電腦上工作的時候,電腦開著才會訪問這個URL,并讓它生成記錄今天日期的文本文件。
通過下面的命令設(shè)定Crontab定時任務(wù),編輯器我選擇的是VIM:
env EDITOR=vim crontab -e
定時任務(wù)設(shè)定為:
30 07 * * * curl -G http://autoemo.kingname.info:745/set_alarm
表示每天的7點(diǎn)30分使用curl訪問后面的鏈接。
Crontab在Linux下面也可以正常使用。
如果你的電腦為Windows,因?yàn)閃indows電腦一般在晚上睡覺時會關(guān)機(jī),所以訪問URL的工作可以設(shè)定開機(jī)啟動來完成。
首先創(chuàng)建一個EnableAlarmClock.py文件:
import requests
requests.get('http://autoemo.kingname.info:745/set_alarm')
這個文件用到了Python的requests庫,如果你沒有的話,請使用pip安裝。
再創(chuàng)建一個EnableAlarmClock.bat文件,文件內(nèi)容如下:
python EnableAlarmClock.py
打開Windows的 任務(wù)計(jì)劃 ,觸發(fā)器選擇“當(dāng)前用戶登錄時”,操作選擇“啟動程序”,并填寫EnableAlarmClock.bat的路徑,如下圖所示:

這樣,每次開機(jī)登錄桌面的時候,程序自動就會訪問設(shè)定鬧鐘的頁面了。
手機(jī)端
Automate是安卓上面的一個強(qiáng)大的自動化工具,類似于IFTTT和iOS上面的Workflow。
在Automate中創(chuàng)建一個Flow,如下圖所示:

其中涉及到了"Time await", "HTTP request", "Expression true?", "Alarm add"這幾個組件。
-
"Time await"的設(shè)置如下圖所示:
-
"HTTP request"的設(shè)置為下面兩張圖:
-
"Alarm add"的設(shè)置為下圖:
這里由于沒有設(shè)置“REPEAT WEEKDAYS”這一項(xiàng),所以鬧鐘都是一次性的,關(guān)了以后,第二天需要再根據(jù)實(shí)際情況來讓Automate來決定是否需要創(chuàng)建。
設(shè)置并啟動這個Flow以后,每天早上的鬧鐘就可以根據(jù)你是否在電腦前面工作而決定要不要鬧響了。



