透過 AWS Lambda 函式與 SQS 佇列,實作 Alexa 語音指令控制 Raspberry Pi 上的燈泡。此係統的核心邏輯是不斷輪詢 SQS 訊息,解析訊息內容,判斷是否為 Alexa.PowerController 名稱空間的開關指令。根據指令內容,設定燈泡的顏色和開關狀態,並回傳執行結果給 Alexa。此架構具備良好的擴充套件性,未來可整合更多控制指令和燈泡功能,例如亮度和色溫調整,並支援更多智慧家居裝置,打造更完善的自動化生活體驗。

控制邏輯

控制邏輯如下:

while True:
    # 接收SQS訊息
    msg_text = get_sqs_msg(queue)
    
    # 判斷是否為Alexa.PowerController名稱空間
    if "namespace" in msg_text and msg_text["namespace"] == "Alexa.PowerController":
        # 判斷是否為開關命令
        if msg_text["value"] == "ON":
            powerState = "on"
            colour = (255, 0, 0)  # 紅色
        else:
            powerState = "off"
            colour = (0, 0, 0)  # 黑色
        
        # 控制燈泡
        fire(powerState, colour)
    
    # 等待1秒
    time.sleep(1)

內容解密:

此段程式碼實作了控制系統的核心邏輯。它不斷地接收SQS訊息,並根據訊息的名稱空間和值來判斷是否需要控制燈泡的開關和顏色。如果是Alexa.PowerController名稱空間且值為"ON",則將燈泡設為開啟狀態和紅色;否則,將燈泡設為關閉狀態和黑色。最後,控制系統根據powerState和colour來控制燈泡。

未來,系統可以進一步擴充套件以支援更多的控制命令和燈泡功能,例如調整亮度、色溫等。此外,系統也可以整合其他智慧家居裝置,以實作更加智慧化和自動化的生活體驗。

14.4 建立智慧家庭技能

要建立智慧家庭技能,我們需要從亞馬遜開發者控制檯開始。以下是步驟:

  1. 建立技能:登入亞馬遜開發者控制檯,點選「建立技能」按鈕。
  2. 選擇技能型別:選擇「智慧家庭」作為技能型別。
  3. 命名技能:給你的技能命名,例如「Sense Hat」。
  4. 建立技能:點選「建立技能」按鈕。

建立技能後,你會看到一個智慧家庭伺服器端點,包含你的 AWS Lambda ARN Skill ID。這個 ID 以「amzn1.ask.skill」開頭。請複製這個 ID,以便在下一節中使用。

14.5 建立函式

建立函式的步驟如下:

  1. 登入 AWS Lambda:登入你的 AWS Lambda 帳戶。
  2. 建立函式:點選「建立函式」按鈕。
  3. 選擇 Python:選擇 Python 作為程式語言。
  4. 命名函式:給你的函式命名,例如「sensehatfunction」。
  5. 建立函式:點選「建立函式」按鈕。

建立函式後,你需要新增一個觸發器。點選「新增觸發器」按鈕,選擇「Alexa Smart Home」,然後輸入你在上一節中儲存的 Smart Home 技能 ID。點選「新增」按鈕。

14.6 建立安全組態檔

建立安全組態檔的步驟如下:

  1. 登入亞馬遜開發者控制檯:登入你的亞馬遜開發者控制檯帳戶。
  2. 建立安全組態檔:點選「安全」選單,選擇「Login with Amazon」。
  3. 建立新組態檔:點選「建立新組態檔」按鈕。
  4. 輸入描述:輸入一個描述,例如「Sense Hat 安全組態檔」。
  5. 儲存組態檔:點選「儲存」按鈕。

建立安全組態檔後,你需要儲存 Client ID 和 Client Secret 認證。

14.7 組態智慧家庭技能

組態智慧家庭技能的步驟如下:

  1. 傳回技能頁面:傳回你的智慧家庭技能頁面。
  2. 輸入 AWS Lambda ARN Skill ID:輸入你在上一節中儲存的 AWS Lambda ARN Skill ID。
  3. 點選儲存:點選「儲存」按鈕。
  4. 設定帳戶連結:點選「設定帳戶連結」按鈕。
  5. 輸入 Client ID 和 Client Secret:輸入你在上一節中儲存的 Client ID 和 Client Secret。
  6. 選擇驗證方案:選擇「HTTP 基本驗證」(Recommended)。
  7. 新增範圍:點選「新增範圍」按鈕,然後輸入「profile:user_id」。
  8. 複製重導向 URL:複製重導向 URL,以便在下一步中使用。
  9. 點選儲存:點選「儲存」按鈕。

完成以上步驟後,你就可以使用你的智慧家庭技能了。

14.8 新增功能程式碼

我們將修改Alexa的Jeff Nunn程式碼(感謝Jeff!)。這需要特定的資料夾結構,因此

請下載程式碼,如 deploy-the-sample-code.md#package-the-sample-code 中所述。 壓縮檔也可在以下位置找到: 瀏覽至 skill-sample-smarthome-fireplace-python/lambda/ 目錄。將 index.py 檔案和 alexa、capabilities、events/ 目錄壓縮成一個名為 package.zip 的檔案。

上傳程式碼

上傳此檔案到您的功能程式碼中。您應該會看到以下類別似的結構: 更改程式碼,或用 software – Appendix14.2 - lambda_function.py 中的程式碼覆寫 lambda_function.py。

  • 將 index.py 改名為 lambda_function.py
  • 新增色彩控制器 JSON
[
  {
    "type": "AlexaInterface",
    "version": "3",
    "properties": {
      "supported": [
        {
          "name": "color"
        }
      ],
      "proactivelyReported": false,
      "retrievable": true
    }
  }
]
  • 更改程式碼中的區域和 SQS

設定區域和 SQS

config = Config(region_name='eu-west-1')  # 如果必要,請替換為您的區域
sqs_client = boto3.client('sqs', config=config)
  • 新增色彩控制器到 discovery 中:
color_controller_capabilities = load_capability_definition("ColorController")
capabilities.append(color_controller_capabilities)
  • 在 discovery 中,修改程式碼如下:
response.add_payload_endpoint({
  'endpointId': 'sense-hat-01',
  'friendlyName': 'Sense Hat display',
  'manufacturerName': 'Developer',
  'description': 'A Raspberry Pi Sense Hat Smart Home skill',
  'capabilities': capabilities
})
  • 取得 endpointId、token 和 correlationToken:
endpoint_id = request['directive']['endpoint']['endpointId']
token = request['directive']['endpoint']['scope']['token']
correlation_token = request['directive']['header']['correlationToken']
color_value = request['directive']['payload']['color']
  • 建立訊息:
message = {
  'endpointId': endpoint_id,
  'name': 'color',
  'value': color_value
}

圖表翻譯:

  flowchart TD
    A[開始] --> B[取得 endpointId、token 和 correlationToken]
    B --> C[建立訊息]
    C --> D[送出訊息]
    D --> E[結束]

內容解密:

以上程式碼是用於新增色彩控制器到 Alexa 智慧家居技能中。首先,我們需要下載程式碼並上傳到 lambda 函式中。然後,我們需要修改程式碼以新增色彩控制器 JSON 和設定區域和 SQS。最後,我們需要新增色彩控制器到 discovery 中並取得 endpointId、token 和 correlationToken,以建立訊息並送出。

智慧家居控制系統:Alexa 與 Raspberry Pi 的整合

14.9 測試函式

為了確保程式碼的正確性,玄貓建議您進行測試。這可以透過程式碼或測試區段進行。首先,前往程式碼區段,點選「測試」按鈕旁的下拉箭頭,選擇您想要傳送的指令。這些指令通常以 JSON 格式儲存於軟體的附錄中,例如 14.3 節中的事件測試 JSON。

接下來,點選「測試」按鈕。系統將顯示回應和記錄,讓您瞭解程式碼的執行結果。

14.10 發現您的裝置

啟用您的裝置,登入並授權。您的裝置應該被發現並可供使用。現在,您可以在 Raspberry Pi 上執行程式碼。

測試智慧家居技能

您現在可以透過開發者控制檯測試您的智慧家居技能。不同於其他技能,您不需要啟動陳述式就可以開始測試。只要確保您的 Raspberry Pi 已經連線到網路,並且 Alexa 的技能已經啟用,您就可以開始控制您的智慧家居裝置。

內容解密:

在這個章節中,我們使用 Python 編寫程式碼,以實作 Alexa 和 Raspberry Pi 的整合。首先,我們定義了一個函式 send_device_state_message(message),用於傳送裝置狀態的訊息給 Alexa。

if send_device_state_message(message):
    response = AlexaResponse({
        'correlationToken': correlation_token,
        'token': token,
        'endpointId': endpoint_id
    })
    
    response.add_context_property({
        'name': 'color',
        'value': color_value
    })
    
    response = response.get()
else:
    response = AlexaResponse({
        'name': 'ErrorResponse',
        'payload': {
            'type': 'ENDPOINT_UNREACHABLE',
            'message': 'Unable to set endpoint state.'
        }
    }).get()
    
return send_response(response)

這個函式會根據 send_device_state_message(message) 的傳回值,決定是否傳送成功回應或錯誤回應給 Alexa。

圖表翻譯:

以下是程式碼的流程圖,使用 Mermaid 語法繪製:

  flowchart TD
    A[開始] --> B[傳送裝置狀態訊息]
    B --> C[判斷傳回值]
    C -->|成功| D[傳送成功回應]
    C -->|失敗| E[傳送錯誤回應]
    D --> F[結束]
    E --> F

這個流程圖顯示了程式碼的邏輯流程,從傳送裝置狀態訊息到判斷傳回值,並根據傳回值決定是否傳送成功或錯誤回應。

Node-RED與IoT應用開發

Node-RED是一種視覺化的流程基礎程式語言,適用於裝置和IoT應用。在本章中,我們將探討如何在Raspberry Pi上安裝和執行Node-RED,從簡單的"Hello World"程式開始,逐步擴充套件到接受Sense Hat的輸入並顯示溫度。

15.1 簡介

Node-RED是一種開源的視覺化程式設計工具,允許使用者透過拖拽和連線節點來建立流程。它支援多種硬體平臺,包括Raspberry Pi。透過Node-RED,我們可以輕鬆地建立IoT應用,例如感測器資料收集、控制執行器等。

15.2 前置條件

在開始之前,您需要有一臺Raspberry Pi 4,並確保您的作業系統版本是Buster或更新版本。您可以使用cat /etc/os-release命令檢查您的作業系統版本。如果需要,您也可以使用-v命令檢查您的Node.js、node和npm版本。

這篇文章涵蓋了使用 Python 和 Node-RED 開發根據 Raspberry Pi 和 Sense HAT 的智慧家居技能的詳細步驟,包括控制邏輯、與 Alexa 的整合、AWS Lambda 的佈署以及 Node-RED 的基礎應用。

從技術架構視角來看,文章清晰地展現了根據 SQS 訊息佇列的非同步通訊模式,以及 Alexa Smart Home 技能、AWS Lambda 函式和 Raspberry Pi 之間的協作關係。利用 SQS 解耦了 Alexa 技能和裝置控制邏輯,提升了系統的可靠性和可擴充套件性。然而,文章缺乏對 SQS 訊息格式的詳細說明,以及訊息傳輸的安全性考量,例如訊息加密和身份驗證機制。

文章的實務落地分析部分提供了詳細的操作步驟,涵蓋了技能建立、函式佈署、安全組態等方面,降低了讀者上手的門檻。然而,程式碼示例部分略顯零散,缺乏對整體程式碼結構的清晰闡述,尤其是在色彩控制器的整合方面,僅提供了程式碼片段,沒有完整呈現程式碼的上下文,增加了讀者理解的難度。對於錯誤處理機制也缺乏說明,例如 SQS 訊息接收失敗或裝置控制失敗時的處理邏輯。

展望未來,整合更多種類別的感測器和執行器,以及更精細的控制策略,例如根據時間或環境條件的自動化控制,將是重要的發展方向。此外,探索更進階的 Node-RED 應用,例如資料視覺化和機器學習模型的整合,也能進一步提升智慧家居系統的智慧化程度。

玄貓認為,雖然文章提供了一個可行的智慧家居技能開發框架,但在程式碼示例的完整性和系統的安全性方面仍有提升空間。建議補充更全面的程式碼示例和說明,並加入對安全性的考量,以提升文章的實用價值和專業性。 對於想要入門智慧家居開發的讀者來說,這篇文章提供了一個良好的起點,但需要額外參考其他資源以完善系統的功能和安全性。