若是我提早起牀,鬧鐘你就別響

鬧鐘已經成了咱們生活中必不可少的東西。若是全球每一個國家的當地時間明天早上,全部的鬧鐘忽然都不響了,不知道會發生什麼樣的混亂。javascript

然而咱們要討論另一種狀況,鬧鐘天天定時響起來,真的是最好的狀況嗎?你有過醒來之後等鬧鐘的經歷嗎?若是你有時候在鬧鐘響以前就起來了,那麼你會不會但願鬧鐘能知道你已經起來了?若是你提早醒了,那麼鬧鐘就不響,只有你一直睡着的時候,鬧鐘纔會按時響起來。java

這個項目基於 Andorid 上面的自動化 workflow 程序 Automate 和 Python 製做。總代碼量很是小。python

作這個東西目的,是由於我如今早上有時候會在 7 點起牀寫東西,而後再去上班。但有時候可能會直接睡到 7 點 45 ,讓鬧鐘把我鬧醒。提早起牀可能會忘記關鬧鐘,可是我不但願在我早上寫做的時候被鬧鐘打擾。git

若是我早上提早起牀使用電腦,那麼 Automate 能夠獲得信息,並關閉鬧鐘。若是 Automate 發現我 7 點 45 都尚未碰電腦,就會把我鬧醒。整個過程,我不須要和鬧鐘有任何的交互。github

這就是AutoAlarmClock這個項目存在的意義。web

設計思路

AutoAlarmClock分爲三個部分,安卓手機上的Automate,VPS上面的Web Server和Mac OS上面的一行命令。數據庫

天天早上7點40,手機上的Automate會訪問一個URL A:autoemo.kingname.info:745/alarm_clock,只要沒有獲得返回信息「No」,不管是網絡問題,仍是由於服務器返回的是其餘信息,都會設定一個鬧鐘,在7點45分響起來。只有訪問URL之後,服務器返回「No」,那麼就不設鬧鐘。flask

對於電腦來講,天天早上7點30分,若是電腦是開着的,說明我正在工做。這個時候電腦就會自動訪問一個URL B:autoemo.kingname.info:745/set_alarm.只有這個URL被訪問過,以前給Automate訪問的URL A纔會返回「No」。vim

設計實現

Web Server

Web Server是手機和電腦之間的橋樑。它是使用Python的Flask框架寫成的。代碼已經放在了Github上:AutoAlarmClock. 包括空行總共只有32行代碼。api

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天天只訪問兩次,因此沒有必要使用數據庫或者作線程安全的設置。數據只須要使用一個文本文件做爲中轉便可。一旦autoemo.kingname.info:745/set_alarm這個連接被訪問,就會在當前目錄建立一個alarmclock.txt文件,裏面存放的是今天的日期。當autoemo.kingname.info:745/alarm_clock被訪問的時候,它會去檢查alarmclock.txt,若是這個文件不存在,或者裏面的日期不是今天的日期,那麼它就會返回「Yes」。只有當alarmclock.txt存在,而且裏面的內容爲今天的日期,它纔會返回「No」。

電腦端

電腦只須要訪問autoemo.kingname.info:745/set_alarm.因爲Mac Book Pro只休眠,不關機,沒法使用開機啓動的方法來觸發這個URL的訪問。因此我使用了Crontab這個定時任務。由於在電腦休眠的時候,Crontab的定時任務是不會執行的,只有我在電腦上工做的時候,電腦開着纔會訪問這個URL,並讓它生成記錄今天日期的文本文件。

經過下面的命令設定Crontab定時任務,編輯器我選擇的是VIM:

env EDITOR=vim crontab -e複製代碼

定時任務設定爲:

30 07 * * * curl -G http://autoemo.kingname.info:745/set_alarm複製代碼

表示天天的7點30分使用curl訪問後面的連接。

Crontab在Linux下面也能夠正常使用。

若是你的電腦爲Windows,由於Windows電腦通常在晚上睡覺時會關機,因此訪問URL的工做能夠設定開機啓動來完成。

首先建立一個EnableAlarmClock.py文件:

import requests

requests.get('http://autoemo.kingname.info:745/set_alarm')複製代碼

這個文件用到了Python的requests庫,若是你沒有的話,請使用pip安裝。

再建立一個EnableAlarmClock.bat文件,文件內容以下:

python EnableAlarmClock.py複製代碼

打開Windows的 任務計劃 ,觸發器選擇「當前用戶登陸時」,操做選擇「啓動程序」,並填寫EnableAlarmClock.bat的路徑,以下圖所示:

這樣,每次開機登陸桌面的時候,程序自動就會訪問設定鬧鐘的頁面了。

手機端

Automate是安卓上面的一個強大的自動化工具,相似於IFTTT和iOS上面的Workflow。

在Automate中建立一個Flow,以下圖所示:


其中涉及到了"Time await", "HTTP request", "Expression true?", "Alarm add"這幾個組件。

  • "Time await"的設置以下圖所示:

  • "HTTP request"的設置爲下面兩張圖:


  • "Alarm add"的設置爲下圖:


    這裏因爲沒有設置「REPEAT WEEKDAYS」這一項,因此鬧鐘都是一次性的,關了之後,次日須要再根據實際狀況來讓Automate來決定是否須要建立。

設置並啓動這個Flow之後,天天早上的鬧鐘就能夠根據你是否在電腦前面工做而決定要不要鬧響了。

相關文章
相關標籤/搜索