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.のリンクからアドオンを追加しインストールする。
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を控えておく。



Lamda作成
AWSコンソールに移りAWS LambdaにHome AssistantとAlexaの橋渡しを作成する。
その前にLambdaを実行するIAM roleを作成する。
- ロールを作成
- ステップ1 信頼されたエンティティを選択でAWSのサービス・Lambdaを選択
- ステップ2 許可を追加 AWSLambdaBasicExecutionRoleを選択
- ステップ3 名前と説明をつける
Lambdaをセットアップする。
リージョンを選択する。スマートホームスキルを複数の言語で開発する | Alexa Skills Kitにあるとおり、日本語の場合「 米国西部(オレゴン)」リージョンを選択する必要がある。
- 左メニューから関数を選択し、関数の作成
- 名称を設定しランタイムにPythonを選択- ドキュメントだと3.9が指定されているので一応合わせる
 
- デフォルトの実行ロールの変更から「既存のロールを利用する」を選択 作成したロールを選ぶ
- 関数の作成
トリガーを設定する。+ トリガーの作成からAlexaとつなぐ。
- Alexaを選択
- Alexa Smart Homeを選択
- Skill IDにAlexa Development Consoleで作ったSkill IDを入力する
- 追加
コードを追加する。コードタブの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に接続する。
- スキルを選択
- SMART HOMEを選択
- AWS Lambda ARNに作成したLambdaのARNを貼る
- SAVE
AlexaとHome Assistantアカウントをつなぐ
アカウントをリンクさせる。
- ACCOUNT LINKINGを選択
- 次の通り入力- 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: 空欄
 
- Authorization URI: 
認定を受けて公開する
認定タブにて検証を行う。期限付きでテストできるようになっているのでとりあえずその状態で様子見ます・・・