コンテンツにスキップ

Home Assistant + Alexa (+ Cloudflare Tunnel)

Created: 2024/02/29

概要

Home AssistantのESPHomeで繋いだセンサ類や照明を音声で操作したいので公式が出しているドキュメントを参考にやってみます。

Amazon Alexa Smart Home Skill - Home Assistant

要件

  • インターネットからのHTTPSアクセス
    • Alexa Smart Home APIの必須要件
    • 今回はCloudflare Tunnelで実現するのでCloudflareアカウントも必要
  • Amazon Developer アカウント
  • AWS アカウント

Cloudflare TunnelでHTTPSアクセス

brenner-tobias/addon-cloudflared: Connect remotely to your Home Assistant instance without opening any ports using Cloudflared.

アドオンがあるので使います。

アドオンをインストール

brenner-tobias/addon-cloudflared: Connect remotely to your Home Assistant instance without opening any ports using Cloudflared.のリンクからアドオンを追加しインストールする。

Tunnelを作成する

How tos · brenner-tobias/addon-cloudflared Wikiに従い作成する。作成後にアクセストークンが表示されるので控えておく。

アドオンの設定画面にCloudflare Tunnel Tokenを入れる場所があるので、作成時に控えたトークンを入れる。他の設定は(私は)必要なかった。

Cloudflare Tunnelの一覧に作ったTunnelがActiveになっていればOK。

Alexa Smart Home Skill

Alexaのスキルには色々種類があるが、ここではSmart Home Skillを作成する。

Amazon Alexa Smart Home Skill - Home Assistant

Skill作成

基本的には手順に従い作成する。まずはSkillを作成する。作成後、Skill IDを控えておく。

alt

alt

alt

Lamda作成

AWSコンソールに移りAWS LambdaにHome AssistantとAlexaの橋渡しを作成する。

AWS コンソール

その前にLambdaを実行するIAM roleを作成する。

  1. ロールを作成
  2. ステップ1 信頼されたエンティティを選択でAWSのサービス・Lambdaを選択
  3. ステップ2 許可を追加 AWSLambdaBasicExecutionRoleを選択
  4. ステップ3 名前と説明をつける

Lambdaをセットアップする。

AWS Lambda

リージョンを選択する。スマートホームスキルを複数の言語で開発する | Alexa Skills Kitにあるとおり、日本語の場合「 米国西部(オレゴン)」リージョンを選択する必要がある。

  1. 左メニューから関数を選択し、関数の作成
  2. 名称を設定しランタイムにPythonを選択
    • ドキュメントだと3.9が指定されているので一応合わせる
  3. デフォルトの実行ロールの変更から「既存のロールを利用する」を選択 作成したロールを選ぶ
  4. 関数の作成

トリガーを設定する。+ トリガーの作成からAlexaとつなぐ。

  1. Alexaを選択
  2. Alexa Smart Homeを選択
  3. Skill IDにAlexa Development Consoleで作ったSkill IDを入力する
  4. 追加

コードを追加する。コードタブのlambda_function.pyにスクリプトを入力する。入力後Deployをクリックする。

環境変数を設定する。設定タブの環境変数から次のキーを追加する。

  • BASE_URL: Home AssistantにアクセスするhttpsなURL、末尾のスラッシュはつけない

Lambdaをテストする。テストタブに移動し、AlexaのDiscoveryのテストを作成する。

  • イベント名: Discovery
  • イベントJSON
    {
    "directive": {
        "header": {
        "namespace": "Alexa.Discovery",
        "name": "Discover",
        "payloadVersion": "3",
        "messageId": "1bd5d003-31b9-476f-ad03-71d471922820"
        },
        "payload": {
        "scope": {
            "type": "BearerToken"
        }
        }
    }
    }
    

実行すると"message": "401: Unauthorizedが返ってくるがトークンを設定していないので正常である。しっかりとテストをしたい場合は環境変数でいろいろ設定する。今回は省く。

LamdaとAlexaをつなぐ

lambdaのARNをAlexa Developer Consoleに接続する。

  1. スキルを選択
  2. SMART HOMEを選択
  3. AWS Lambda ARNに作成したLambdaのARNを貼る
  4. SAVE

AlexaとHome Assistantアカウントをつなぐ

アカウントをリンクさせる。

  1. ACCOUNT LINKINGを選択
  2. 次の通り入力
    • Authorization URI: https://[YOUR HOME ASSISTANT URL]/auth/authorize
    • Access Token URI: https://[YOUR HOME ASSISTANT URL]/auth/token
    • Client ID: https://alexa.amazon.co.jp/ ※日本語の場合
    • Client Secret: 適当でOK。Home Assistantはこのフィールドを見ない。
    • Your Authentication Scheme: Credentials in request body を選択
    • Scope: smart_homeを入力
    • Domain List: 空欄
    • Default Access Token Expiration Time: 空欄

認定を受けて公開する

認定タブにて検証を行う。期限付きでテストできるようになっているのでとりあえずその状態で様子見ます・・・