設定計時器 - 虛擬物聯網硬體和樹莓派
在本課程的這一部分,你將調用無伺服器代碼來理解語音,並根據結果在你的虛擬物聯網設備或樹莓派上設置計時器。
設定計時器
從語音轉文字調用返回的文本需要發送到你的無伺服器代碼,由LUIS處理,返回計時器的秒數。這個秒數可以用來設置計時器。
計時器可以使用Python的threading.Timer
類來設置。這個類需要一個延遲時間和一個函數,並在延遲時間後執行該函數。
任務 - 將文本發送到無伺服器函數
-
在VS Code中打開
smart-timer
項目,如果你使用的是虛擬物聯網設備,請確保在終端中加載了虛擬環境。 -
在
process_text
函數上方,聲明一個名為get_timer_time
的函數來調用你創建的REST端點:def get_timer_time(text):
-
添加以下代碼到這個函數中來定義要調用的URL:
url = '<URL>'
將
<URL>
替換為你在上一課中構建的REST端點的URL,可以是你電腦上的或雲端的。 -
添加以下代碼來將文本設置為以JSON形式傳遞的屬性:
body = {
'text': text
}
response = requests.post(url, json=body) -
在這之下,從響應負載中檢索
seconds
,如果調用失敗則返回0:if response.status_code != 200:
return 0
payload = response.json()
return payload['seconds']成功的HTTP調用返回200範圍內的狀態碼,如果文本被處理並識別為設置計時器意圖,你的無伺服器代碼將返回200。
任務 - 在後台線程上設置計時器
-
在文件頂部添加以下導入語句來導入threading Python庫:
import threading
-
在
process_text
函數上方,添加一個函數來說出響應。現在這個函數只會寫到控制台,但在本課程的後面部分,這將會說出文本。def say(text):
print(text) -
在這之下添加一個函數,該函數將由計時器調用來宣布計時器完成:
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
函數。 -
在這之下,添加以下
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
參數傳遞。 -
在
create_timer
函數的末尾,添加一些代碼來構建一個消息,告訴用戶計時器已啟動:announcement = ''
if minutes > 0:
announcement += f'{minutes} minute '
if seconds > 0:
announcement += f'{seconds} second '
announcement += 'timer started.'
say(announcement)同樣,這只包括有值的時間單位。然後這個句子被發送到
say
函數。 -
在
process_text
函數的末尾添加以下內容,以從文本中獲取計時器的時間,然後創建計時器:seconds = get_timer_time(text)
if seconds > 0:
create_timer(seconds)只有當秒數大於0時才會創建計時器。
-
運行應用程序,並確保函數應用程序也在運行。設置一些計時器,輸出將顯示計時器被設置,然後顯示計時器到期時:
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/pi或code-timer/virtual-iot-device文件夾中找到這段代碼。
😀 你的計時器程序成功了!