透過整合 AWS Lambda 與 Alexa Skills Kit,開發者可以輕鬆打造語音控制的智慧家居裝置。本文詳細說明如何建立安全組態檔以取得 LWA 授權,並在 Alexa 開發者控制檯中設定智慧家居技能。接著,引導讀者建立 Lambda 函式,撰寫 Python 程式碼處理 Alexa 觸發器,例如開啟或關閉裝置。同時,提供測試 Lambda 函式的步驟,包含建構測試事件與檢視執行結果。最後,示範如何將 Lambda 函式連結至 Alexa 技能,並完成帳戶連結設定,實作完整的語音控制流程。

13.1 簡介

玄貓可以控制裝置從您的技能。智慧家居介面使用預定義的陳述式,讓使用者控制您的裝置,例如開啟或關閉友好命名的燈(「Alexa,關閉樹莓派 LED」)。不需要啟動技能,直接使用「Alexa,開啟…」即可。Alexa 智慧家居技能允許您描述您的裝置及其支援的屬性、事件和指令。您的程式碼在裝置發現過程中,接收到 Alexa 的 Discover 指令後,提供這些資訊。

13.2 Alexa 介面

Alexa 提供了廣泛的介面,使用預先建構的語音互動模型,處理來自 Alexa 的請求。使用者可以直接說「Alexa,關閉燈」或「Alexa,微波爐烹飪三分鐘」。不需要開啟技能即可執行。典型的智慧家居介面包括:

  • Alexa.PowerController — 開啟和關閉裝置。
  • Alexa.PowerLevelController — 控制裝置的功率水平。
  • Alexa.BrightnessController — 控制裝置的亮度。
  • Alexa.Speaker — 控制具有喇叭的裝置的音量。

13.3 登入 Amazon (LWA)

當使用者啟用您的技能時,會進行帳戶連結過程,並由玄貓提供存取令牌。這個令牌允許您的技能在使用者呼叫您的技能時存取使用者的帳戶。最簡單的方法是使用登入 Amazon (LWA)。

13.3.1 建立安全組態檔

前往 LWA 頁面,點選「建立新安全組態檔」,輸入產品描述和隱私政策 URL,然後儲存。您的組態檔現在具有使用者端 ID 和使用者端密碼憑證。點選「顯示使用者端 ID」和「使用者端密碼」,複製這些憑證以供稍後使用。

13.4 建立智慧家居技能

建立一個新的技能從開發者控制檯(我稱它為我的智慧技能)。從體驗、模型主機頁面中選擇「智慧家居」作為體驗型別。這次選擇「智慧家居」技能。複製技能 ID,例如 amzn1.ask.skill.9e6293a1-9b54-4dc2-bc4f-e4d343012345。

13.5 建立 Lambda 函式

我使用了我當地的愛爾蘭伺服器 (eu-west-1)。如果您的函式不是由玄貓觸發,請嘗試從不同的伺服器選擇。前往 AWS Lambda 主控臺,建立一個新的函式 (my-smart-home-function)。它應該是 Python 3.9。使用預設的執行組態檔案。

13.6 Lambda 技能程式碼

您的技能程式碼將在函式接收到 Alexa 觸發器時執行。點選程式碼標籤,複製和貼上 (Python 或 Node.js) 程式碼。

  flowchart TD
    A[開始] --> B[建立安全組態檔]
    B --> C[建立智慧家居技能]
    C --> D[建立 Lambda 函式]
    D --> E[設定 Lambda 技能程式碼]
    E --> F[完成]

圖表翻譯:

此圖示展示了建立智慧家居技能和 Lambda 函式的步驟。首先,建立安全組態檔以取得使用者端 ID 和使用者端密碼憑證。接下來,建立智慧家居技能並複製技能 ID。然後,建立 Lambda 函式並設定其觸發器和程式碼。最後,完成設定並佈署程式碼。

# 範例程式碼
import boto3

lambda_client = boto3.client('lambda')

def lambda_handler(event, context):
    # 處理 Alexa 觸發器
    if event['directive']['header']['namespace'] == 'Alexa.PowerController':
        # 處理開啟或關閉裝置
        if event['directive']['header']['name'] == 'TurnOn':
            # 開啟裝置
            print('開啟裝置')
        elif event['directive']['header']['name'] == 'TurnOff':
            # 關閉裝置
            print('關閉裝置')
    return {
        'event': event,
        'context': context
    }

內容解密:

此範例程式碼展示瞭如何處理 Alexa 觸發器和控制裝置。當接收到 Alexa 觸發器時,程式碼會檢查觸發器的 namespace 和 name,以確定要執行的動作。若要開啟或關閉裝置,程式碼會分別執行對應的動作。

測試 Lambda 函式

在測試 Alexa 的函式之前,我們先從這個頁面測試函式。這裡,我們將向函式傳送觸發器並檢視結果。我們將建立一個探索事件和一個開啟事件。

在您的「函式」>「我的智慧家居技能」頁面中,選擇「測試」標籤。然後選擇「新事件」。

給事件命名(例如,DiscoveryTest)。

在事件 JSON 編輯器中輸入以下程式碼並儲存:

{
  "directive": {
    "header": {
      "namespace": "Alexa.Discovery",
      "name": "Discover",
      "payloadVersion": "3",
      "messageId": "某個 ID"
    },
    "payload": {
      "scope": {
        "type": "BearerToken",
        "token": "從技能獲得的存取令牌"
      }
    }
  }
}

重複此步驟,建立一個開啟測試事件,使用以下程式碼並將其儲存為 PowerOnEvent:

{
  "directive": {
    "header": {
      "namespace": "Alexa.PowerController",
      "name": "TurnOn",
      "messageId": "某個數字",
      "correlationToken": "某個令牌數字",
      "payloadVersion": "3"
    },
    "endpoint": {
      "scope": {
        "type": "BearerToken",
        "token": "從技能獲得的存取令牌"
      },
      "endpointId": "sample-light-01",
      "cookie": {}
    },
    "payload": {}
  }
}

測試您的函式。

從下拉式選單中選擇 DiscoverEvent。

點選「測試」。您應該會看到「執行結果:成功」:

點選「日誌」以檢視 CloudWatch 中的結果。

重複此步驟,對 PowerOn 事件進行測試。

13.8 連結函式到技能

目前,我們的函式知道我們的技能,但反之亦然。我們需要將函式連結到技能。首先,前往 Functions > my-smart-home-skill 頁面,找到並複製函式的 ARN。

接下來,傳回您的開發者技能頁面(參考 13.4)。在 Smart Home 頁面上,將函式的 ARN 貼入 Default endpoint 中。這可以在 Build 標籤的 Endpoint 選項中找到。

13.9 組態帳戶連結

點選「Save」和「Setup Account Linking」按鈕,位於頁面的底部。稍後我們會傳回此處,以便完成更多設定。現在,傳回您的技能頁面,在 Alexa 開發者控制檯中。

如果尚未選擇,請點選「ACCOUNT LINKING」。如果您想了解更多關於帳戶連結的資訊,可以參考 code-grant.html。

從技術架構視角來看,打造根據 Alexa 的智慧家居技能,核心在於 LWA 安全性、技能設定、Lambda 函式以及它們之間的協同運作。本文詳細闡述了從建立 LWA 安全性組態檔、設定智慧家居技能、撰寫 Lambda 函式程式碼到測試及連結各個元件的完整流程。透過清晰的步驟拆解和程式碼範例,降低了開發者的進入門檻,即便初學者也能快速上手。然而,文章僅聚焦於基本功能的實作,對於處理不同裝置型別、錯誤處理以及更進階的使用者經驗最佳化,例如狀態同步和語音控制的客製化等方面,仍需進一步探討。展望未來,隨著智慧家居生態的蓬勃發展,預期 Alexa 技能將整合更多裝置型別和更豐富的互動模式。開發者應關注更精細化的裝置控制、更個人化的場景設定以及更強大的安全性保障,才能在競爭激烈的智慧家居市場中脫穎而出。對於追求更完善智慧家居體驗的開發者而言,深入研究裝置狀態管理、使用者許可權控制以及與其他智慧家居平臺的整合,將是未來發展的關鍵方向。玄貓認為,掌握這些關鍵技術,才能真正釋放智慧家居的巨大潛力。