大家覺得 LINE 是什麼類型的 app? 通訊軟體? 垃圾廣告軟體? 嗯絕對是垃圾廣告軟體XD 那如果我說 LINE 也可以控制你家的家電呢? 當然是在有架設 HA 的情況下
不只有 LINE,甚至 Facebook Messenger、Twitter、Telegram、Skype 都可以
AI、NLP、Chatbot、ML、DL 可以說是近年來很火紅的幾個關鍵字
為什麼 Google Assistant 自從問世以來一直都是最強大的語音助理,因為在上述那些關鍵字的領域中 Google 都是佼佼者
今天要來介紹一下 Google 的自然語言平台 - Dialogflow
Dialogflow 最早的前身為 Speaktoit,後來在 2014 年改名為 api.ai,在 2016 年被 Google 買下,2016 年 GA 問世了,api.ai 作為其後盾之一用來開發 GA 的 Actions,而在 2017 年再改名為現在的 Dialogflow
Dialogflow 與 Actions on Google 深度的結合,就算你從沒寫過程式,你也可以在半小時內完成你自己的 Google Assistant 語音小程式/遊戲
Dialogflow 可以說是 GA 最強大的外掛了
那這 Google 的平台又跟 LINE 有什麼關係? 其實只要建好一個 Dialogflow 的專案,再連結到 LINE Bot,完全不用修改就可以直接用同一個專案
好了,正式進入教學~
我估計有些人會因為標題說 LINE 可以控制家電所以就點進來了
這邊我要先說明清楚不是單單一個 Dialogflow 跟 LINE Bot 就能讓你控制家電,這是利用 HA 整合 Dialogflow 得以使 LINE Bot 透過 Dialogflow 去取用 HA 上的所有功能
然後本篇教學真的很長很長...打到很想死,所以我先提一下在本篇教學涵蓋了基礎使用教學、進階玩法還有如何把作品分享給別人使用
(貼心提醒,因為 Dcard 會壓縮圖片畫質,所以如果在 Dcard 網站上看圖片很模糊,可以將圖片在新頁面開啟後將網址前綴 imgur.dcard.tw 改成 imgur.com,這樣才是沒有壓縮過的原圖)
*****注意*****
你的 HA 版本要更新至 0.98
*****注意*****
首先,要讓 HA 串接 Dialogflow,跟我上一篇串接 GA 的前提一樣,需要有自己的網域或者是使用 DuckDNS,再不然就是花錢買 Home Assistant Cloud
這邊就不重複教學了,有需要的人可以到上一篇看
能從外網連到你的 HA 後,點選側邊欄的設定
點選 "整合"
點擊右下 +
點選 "Dialogflow"
點擊 "SUBMIT"
HA 會給你一組 URL,請把它複製起來後貼到記事本,因為在按下 FINISH 後你再也無法在這個頁面看到這組 URL 了,你只能刪除整合再重來
Response 中填入當 Dialogflow 接收到使用者命令後卻無法跟 HA 溝通時要回覆的句子,你可以輸入 Cannot connect to Home Assistant 或是任何句子
最後這裡也是重點,點開 "Fulfillment",開啟 Enable webhook call for this intent
凡事要跟 HA 溝通的 Intent 都必須要開啟此選項,不然 Dialogflow 不知道要去呼叫 HA
然後點擊右上方 SAVE
這時你可以在右上方的 Try it now 中輸入你設定的觸發句子,以我剛剛的例子就是 "Turn on the lights",按下 enter 後如果沒有設定錯誤,Dialogflow 會連結至 HA 去執行 intent_script 中的 LightsOn 這個 intent,然後我所設定的燈會被打開
以上是在 Dialogflow 中測試,點選 See how it works in Google Assistant. 後會開啟 Actions Console,在這裡你可以在網頁上模擬你寫的 GA Action
點擊 Talk to xxxxx,這邊你會顯示 my first app 還是什麼東西,不要緊,等等會告訴你怎麼改名稱
按下麥克風圖示
允許網頁存取麥克風,然後說出觸發句子,比如說 Turn on the lights
模擬的 GA 也可以執行正確的 intent
當然,在手機或 Google Home 上的 GA 同樣也可以透過 Talk to xxxx 來執行你設定的 Action
Intent 的觸發沒問題後點選上方 Develop 頁籤
在 Invocation 底下可以修改這個 Action 的名稱,還有語音包,要注意命名時不要用到 GA 的保留字詞,比如像 "Google" 或 "Assistant"
(我命名 Home Assistant 時也有跳出警告不能用保留字 Assistant,但他還是讓我過了)
先設定 Action and parameters,Action 名稱取作 LocateIntent
PARAMETER NAME 填入 User
ENTITY 先輸入一個 @ 然後選擇 "@sys.given-name"
VALUE 填入$User
輸入這些參數是為了讓 HA 知道我們究竟是要問 "哪個人",User 這參數之後會丟給 intent_script 去判斷
Training phrases 中填入觸發詞
這邊要注意,當你輸入完一句話後,在人名的地方點兩下,會跳出選擇列表,選擇@sys.given-name:User
最後別忘了要給他一個無法跟 HA 溝通時要回覆的句子,還有要開啟 Enable webhook call for this intent,然後 SAVE
回到 configuration.yaml 設定 intent_script
這邊使用到迴圈,將 HA 上每個人的位置先找出來後,再根據我們提問的人名挑選出來,如果提問的人名有在 HA 上,就回答 "xxx is at xxx",如果提問的人名沒有在 HA 上,就回答 "I am sorry, I do not know where xxx is." 如果 HA 上都沒有任何人,那就回答 Sorry, I don't have any trackers registered.
之所以可以挑選出人名就是因為我們剛剛在 Dialogflow 上新增 Intent 時已經告訴他要拋 User 這個變數過來給 HA 了
把 template 中迴圈部分放到 Developer Tools 中去執行,可以看到 HA 上所有人的狀態都會顯示出來
1. 第4行中使用了 {{ Room }}、{{ OnOff }} 這兩個從 Dialogflow 拋過來的變數,當你的命令是 Turn the living room lights on,那 {{ Room }}、{{ OnOff }} 分別會代換成 living room 跟 on
2. 第6~8行是執行通知的動作,當接收命令後第一個動作是發 Pushbullet 通知有人開關燈,一樣的可以用 Dialogflow 拋過來的變數,但是必須用 data_template 的形式
data_template 我在先前 HA 串接 LINE 通知時有提過,可以過去看看
3. 第9~16行是一組 action,但我們拆開來看
第9~14行使用 if else 的 service_template,這種用法相當自由,因為一般我們在使用 HA 的 service 時不是 light.turn_on,不然就是 light.turn_off,都是單一 service
使用 service_template 可以依據拋過來的變數來決定要用哪個 service
如果 OnOff 這變數拋過來的值是 on,service 就用 switch.turn_on
第15、16行使用 data_template 可以將拋過來的變數自由代換,但是後面又用了一個
{{ Room | replace(' ', '_') }},這是因為在 HA 上所有的 entity_id 不可能會出現空白,所以當你的區域名有空白,拋過來的變數會自動把空白替換成底線 _
當你的命令是 Turn the living room lights on,那 living room 會變成 living_room
至於這個 Action 實際執行起來結果如下圖,但因為我沒實際寫 intent_script,所以會出現 This intent is not yet configured within Home Assistant,大家可以玩玩看
最後別忘了要給他一個無法跟 HA 溝通時要回覆的句子,還有要開啟 Enable webhook call for this intent,然後 SAVE
再回到 configuration.yaml 設定 intent_script
所有的消費資料都會存在 Google 表單上,那要怎麼讓 HA 跟 Google 表單互動? 雖然 Google Sheets 有 API,也有人在 HA 論壇上分享要怎麼用 API 來串接,但那太麻煩了,我們改用 IFTTT 的方案
我們先來解決 IFTTT 的問題,如果你的 HA 已經有設定 IFTTT 的 API Key 了,那這步驟你可以跳過了,但這步驟後的新增 IFTTT Applet 還是要做
先到
新增 Webhooks 到你的帳戶,然後點右上方的 Documentation
紅框中是你的 API Key,將他複製起來
在 configuration.yaml 中新增 ifttt: 跟你的 API Key
回到 IFTTT,點選你頭像並選取 "Create",我們要新增 Applet 讓 IFTTT 能接收 HA 來的事件,然後去 Google 表單中新增我們的記帳資料
同樣的在到家 Intent 點選 "Add follow-up intent"
這次要新增 no 的回答 intent
是跟否都新增完成
我們先來編輯 "是" 的回答,點擊 "IAmHome - yes"
可以看到上方 Intent 名稱跟 Training phrases 都幫你設定好了
Training phrases 中光是 "是" 的回答就有5頁,這些都是同義的句子
Action and parameters 也幫你設定好了,等等 intent_script 就直接用這個名稱就好
最後別忘了要給他一個無法跟 HA 溝通時要回覆的句子,還有要開啟 Enable webhook call for this intent,然後 SAVE
再來編輯 "否" 的回答
跟 "是" 的回答一樣有5頁的同義句子
這邊的 Responses 就不是要輸入無法跟 HA 溝通時要回覆的句子,因為在我們要達成的情境中,如果我說不要開電腦,那 Dialogflow 就不用拋令另過去給 HA 了,所以這邊要填的是單純的語音回覆,比如說 "好的,我知道了" 之類的
然後開啟下方的 Set this intent as end of conversation,每一個 Actions 都是 GA 上的 "應用程式",跟電腦手機一樣,有 "進入" 應用程式,就有 "離開" 應用程式,當開啟了這選項,執行完這個 Intent 後,GA 就會離開當前的 Action
最後記得 SAVE
快完成了,來建立 intent_script,這邊只有兩個 intent_script,一個是到家的 IAmHome,另一個是 "是" 回答的 IAmHome.IAmHome-yes
我們剛剛說的情境是到家會開燈、開冷氣,是否開電腦需詢問,所以在到家的語音詞句中就要填入詢問句 Do you want me to turn on your computer?
那成果如何呢?
以上進階玩法結束
======================================
最後的最後,大家可能會問,那這只能自己用嗎? 其他人能不能使用? 畢竟家裡的智慧家電是全家人都會用到的東西,答案是可以的!
LINE 的部分比較簡單,你只需要將你官方帳號的 QR code 給你家人掃,或請他們搜尋 ID,他們將你的官方帳號加入好友就可以直接使用了
但是 GA 就比較麻煩些,有限制人數 20 人而且需要等待 3 小時
開始佈署 GA 給其他使用者吧
先回到 Dialogflow 的頁面,然後點選 "See how it works in Google Assistant."
點開 Additional Information
Category 選擇 Home control
For Families 跟 Alcohol and Tobacco 都選 No
設定完後拉回最上方儲存
點選側邊欄 "Surface capabilities"
全部都選擇 No,然後儲存
點選側邊欄 "Release"
點開 Alpha 的部分,然後點擊 "Manage Alpha Testers",我們要將家人的 Google 帳號加入測試白名單
上方的 Opt-in link 你可以先複製起來,等到你的 Action 正式上線後,家人需要透過此連結才能連結你的 Action,這 Opt-in link 就等同於 LINE 官方帳號的 QR code
下方文字輸入框中要輸入家人的 Google 帳號,在最下方會顯示已經被加入白名單的 Google 帳號
白名單設定好後就可以回到 Release 頁面按下 "Submit for alpha"
勾選兩個確認項後按下 Submit
這對話框中也有提及佈署需要幾個小時才能完成
提交佈署後狀態會是 Deploying 佈署中,就慢慢等他佈署吧
這邊順便說明 Alpha、Beta、Production 的差別
.Alpha 佈署不需要經過 Google 審核,人數限制 20 人
.Beta 佈署需要經過 Google 審核,人數限制 200 人
.Production 佈署需要經過 Google 審核,審核過後視為正式上架且沒有人數限制
另外,我們自己在用 Action 時都會聽到 "Here's the test version of xxxx",中文版則是 "下面是xxx的試用版",對,很煩我知道,但是很不幸的這是不能改的,你一定會聽到 "test version" 或 "試用版",然而身為 Alpha 使用者的家人們在使用時是不會出現這個詞的