跳至主要内容

設定計時器 - 虛擬物聯網硬體和樹莓派

在本課程的這一部分,你將調用無伺服器代碼來理解語音,並根據結果在你的虛擬物聯網設備或樹莓派上設置計時器。

設定計時器

從語音轉文字調用返回的文本需要發送到你的無伺服器代碼,由LUIS處理,返回計時器的秒數。這個秒數可以用來設置計時器。

計時器可以使用Python的threading.Timer類來設置。這個類需要一個延遲時間和一個函數,並在延遲時間後執行該函數。

任務 - 將文本發送到無伺服器函數

  1. 在VS Code中打開smart-timer項目,如果你使用的是虛擬物聯網設備,請確保在終端中加載了虛擬環境。

  2. process_text函數上方,聲明一個名為get_timer_time的函數來調用你創建的REST端點:

    def get_timer_time(text):
  3. 添加以下代碼到這個函數中來定義要調用的URL:

    url = '<URL>'

    <URL>替換為你在上一課中構建的REST端點的URL,可以是你電腦上的或雲端的。

  4. 添加以下代碼來將文本設置為以JSON形式傳遞的屬性:

    body = {
    'text': text
    }

    response = requests.post(url, json=body)
  5. 在這之下,從響應負載中檢索seconds,如果調用失敗則返回0:

    if response.status_code != 200:
    return 0

    payload = response.json()
    return payload['seconds']

    成功的HTTP調用返回200範圍內的狀態碼,如果文本被處理並識別為設置計時器意圖,你的無伺服器代碼將返回200。

任務 - 在後台線程上設置計時器

  1. 在文件頂部添加以下導入語句來導入threading Python庫:

    import threading
  2. process_text函數上方,添加一個函數來說出響應。現在這個函數只會寫到控制台,但在本課程的後面部分,這將會說出文本。

    def say(text):
    print(text)
  3. 在這之下添加一個函數,該函數將由計時器調用來宣布計時器完成:

    def announce_timer(minutes, seconds):
    announcement = 'Times up on your '
    if minutes > 0:
    announcement += f'{minutes} minute '
    if seconds > 0:
    announcement += f'{seconds} second '
    announcement += 'timer.'
    say(announcement)

    這個函數接收計時器的分鐘數和秒數,並構建一個句子來說明計時器已完成。它會檢查分鐘數和秒數,並且只有在有數字的情況下才包括每個時間單位。例如,如果分鐘數為0,則只包括秒數。然後這個句子被發送到say函數。

  4. 在這之下,添加以下create_timer函數來創建計時器:

    def create_timer(total_seconds):
    minutes, seconds = divmod(total_seconds, 60)
    threading.Timer(total_seconds, announce_timer, args=[minutes, seconds]).start()

    這個函數接收將在命令中發送的計時器的總秒數,並將其轉換為分鐘和秒數。然後它使用總秒數創建並啟動一個計時器對象,傳遞announce_timer函數和包含分鐘和秒數的列表。當計時器到期時,它將調用announce_timer函數,並將此列表的內容作為參數傳遞 - 因此列表中的第一項作為minutes參數傳遞,第二項作為seconds參數傳遞。

  5. create_timer函數的末尾,添加一些代碼來構建一個消息,告訴用戶計時器已啟動:

    announcement = ''
    if minutes > 0:
    announcement += f'{minutes} minute '
    if seconds > 0:
    announcement += f'{seconds} second '
    announcement += 'timer started.'
    say(announcement)

    同樣,這只包括有值的時間單位。然後這個句子被發送到say函數。

  6. process_text函數的末尾添加以下內容,以從文本中獲取計時器的時間,然後創建計時器:

    seconds = get_timer_time(text)
    if seconds > 0:
    create_timer(seconds)

    只有當秒數大於0時才會創建計時器。

  7. 運行應用程序,並確保函數應用程序也在運行。設置一些計時器,輸出將顯示計時器被設置,然後顯示計時器到期時:

    pi@raspberrypi:~/smart-timer $ python3 app.py 
    Set a two minute 27 second timer.
    2 minute 27 second timer started.
    Times up on your 2 minute 27 second timer.

💁 你可以在code-timer/picode-timer/virtual-iot-device文件夾中找到這段代碼。

😀 你的計時器程序成功了!