0.前提条件・事前準備
前提条件
グローバルIPを使用できること。
ポート番号:80,443を開放可能であること。
Amazon Developer Servicesのアカウントがあること。
事前準備
固定IPでない場合は、DDNSサービスを使用してIPとホスト名を紐付けておいてください。
ポート番号:443を開放してRaspberryPiとマッピングしておいてください。
ポート番号:80を開放してRaspberryPiとマッピングしておいてください。(SSL証明書取得に使用します。)
1.Raspberry Piセットアップ&赤外線送受信設定
こちらを参考に。(こちらのほうが詳しいので)
Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法
備考:コンデンサを使用しない場合、出力が弱いのでなるべくコンデンサを使用してください。
2.HomeAssistantインストール
##2.1.Pythonインストール
Pythonと関連モジュールをインストールします。
sudo apt-get install python3 python3-venv python3-pip
##2.2.HomeAssistantユーザ作成
HomeAssistant用のユーザを作成します。
sudo useradd -rm homeassistant
##2.3.HomeAssistantインストール先ディレクトリ作成
HomeAssistantインストール先ディレクトリを作成し、作成したディレクトリの所有権を2.2で作成したユーザに変更します。
cd /srv
sudo mkdir homeassistant
sudo chown homeassistant:homeassistant homeassistant
##2.4.HomeAssistant仮想環境作成
HomeAssistantの仮想環境を作成します。作成は2.2で作成したユーザで実行します。
sudo su -s /bin/bash homeassistant
cd /srv/homeassistant
python3 -m venv .
source bin/activate
仮想環境をアクティブにするとプロンプトが変更されます。
##2.5.HomeAssistantインストール
HomeAssistantをインストールします。
pip3 install homeassistant
##2.6.HomeAssistant起動確認
以下のコマンドでHomeAssistantを起動します。
hass
ブラウザでhttp://[raspberrypiのIPアドレス]:8123
にアクセスしてHomeAssistantの起動を確認します。
##2.7.HomeAssistantサービス化
HomeAssistantをサービスにします。
sudo nano /etc/systemd/system/home-assistant.service
[Unit]
Description=Home Assistant
After=network.target
[Service]
Type=simple
User=%i
ExecStart=/srv/homeassistant/bin/hass -c "/home/homeassistant/.homeassistant"
[Install]
WantedBy=multi-user.target
デーモンをリロード後、自動起動に設定します。
sudo systemctl --system daemon-reload
sudo systemctl enable home-assistant
サービス起動方法は以下の通りです。
sudo systemctl start home-assistant
サービス停止方法は以下の通りです。
sudo systemctl stop home-assistant
サービス再起動方法は以下の通りです。
sudo systemctl restart home-assistant
2.8.HomeAssistant Https化
AlexaSkillはhttpsかつポート443でしか使用できませんので、https化します。
2.8.1.Let’s EncryptのSSL証明書取得
Let’s EncryptのSSL証明書を取得します。
一時的にWebサーバを立ち上げますのでポート80,443を使用しているサービスは停止してください。
curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
chmod a+x /usr/bin/certbot-auto
certbot-auto certonly --standalone -t -d [ドメイン名] -m [メールアドレス] --agree-tos
取得に成功すると、/etc/letsencrypt/live/[ドメイン名]/
に以下のファイルが作成されます。
- cert.pem
- chain.pem
- fullchain.pem
- privkey.pem
###2.8.2. HomeAssistant設定ファイル変更
HomeAssistantの設定ファイルを変更してポート443でサービスを起動します。
http:
# Secrets are defined in the file secrets.yaml
api_password: !secret http_password
server_port: 443
ssl_certificate: /etc/letsencrypt/live/[ドメイン名]/fullchain.pem
ssl_key: /etc/letsencrypt/live/[ドメイン名]/privkey.pem
サービス再起動します。
sudo systemctl restart home-assistant
ブラウザでhttps://[ドメイン名]:443
にアクセスしてHomeAssistantの起動を確認します。
2.9.HomeAssistant アクセスパスワード設定
HomeAssistant アクセスパスワードを設定します。
http_password: [パスワード]
パスワードに「#」をいれたら認証できなかったというQAを何処かで見ましたので、記号は使わないほうがいいと思います。
3.HomeAssistant 設定
3.1.Switch 作成
赤外線送信するSwitchを作成します。以下は例です。コマンドは各自変更してください。
switch
platform: command_line
switches:
light:
command_on: "irsend -#5 SEND_ONCE 'light' 'on'"
command_off: "irsend -#5 SEND_ONCE 'light' 'off'"
friendly_name: "light"
tv_power:
command_on: "irsend SEND_ONCE 'tv' 'power'"
friendly_name: "tv.power"
tv_volume1:
command_on: "/home/pi/volume.sh volumeUp 1"
command_off: "/home/pi/volume.sh volumeDown 1"
friendly_name: "tv.volume1"
tv_volume2:
command_on: "/home/pi/volume.sh volumeUp 2"
command_off: "/home/pi/volume.sh volumeDown 2"
friendly_name: "tv.volume2"
tv_volume3:
command_on: "/home/pi/volume.sh volumeUp 3"
command_off: "/home/pi/volume.sh volumeDown 3"
friendly_name: "tv.volume3"
ボリュームの場合は0.05秒間隔で指定回数繰り返すshellを作成しておきます。
(irsendコマンドの引数は各自変更してください)
for i in `seq 1 $2`
do
irsend SEND_ONCE "tv" $1;
perl -e 'select(undef, undef, undef, 0.05);'
done
作成したshellに実行権限を付与します。
chmod a+x /home/pi/volume.sh
ブラウザでhttps://[ドメイン名]:443
にアクセスして作成したSwitchが動作することを確認してください。
複数コマンドを実行したい場合は、shellを作るか、sceneを使用してください。以下は例です。
scene:
- name: all_power_on
entities:
switch.light: on
switch.recorder_power: on
switch.tv_power: on
- name: all_power_off
entities:
switch.light: off
switch.tv_power: on
3.2.HomeAssistant Alexa設定
HomeAssistantでAlexaの設定を行います。
alexa:
intent_script: !include alexa.yaml
LightOnIntent:
action:
service: switch.turn_on
data_template:
entity_id: switch.light
speech:
type: plain
text: ライトをつけました
LightOffIntent:
action:
service: switch.turn_off
data_template:
entity_id: switch.light
speech:
type: plain
text: ライトを消しました
TVVolumeUpIntent:
action:
service: switch.turn_on
data_template:
entity_id: switch.tv_volume{{ Count }}
speech:
type: plain
text: ボリュームを{{ Count }}上げました
TVVolumeDownIntent:
action:
service: switch.turn_off
data_template:
entity_id: switch.tv_volume{{ Count }}
speech:
type: plain
text: ボリュームを{{ Count }}下げました
- 「~Intent」はAlexaSkillから指定される値でどのコマンド実行するかが指定されます。
- switch.turn_on/switch.turn_offでswitchのcommand_on/command_offのどちらのコマンドを起動するか指定します。
- AlexaSkillからはパラメータ(AlexaSkillではslotといいます)を指定できます。(「Count」はslot名です。)
4.AlexaSkill 作成
以下は、Amazon Developer Servicesで行います。
4.1.スキル情報設定
呼び出し名は各自変更してください。
呼び出し名が「リモコン」だと、「アレクサ、リモコンでライトをオンにして」のような呼び出しになります。
4.2.対話モデル
{
"languageModel": {
"intents": [
{
"name": "AMAZON.CancelIntent",
"samples": []
},
{
"name": "AMAZON.HelpIntent",
"samples": []
},
{
"name": "AMAZON.StopIntent",
"samples": []
},
{
"name": "LightOffIntent",
"samples": [
"ライトをオフにして"
],
"slots": []
},
{
"name": "LightOnIntent",
"samples": [
"ライトをオンにして"
],
"slots": []
},
{
"name": "TVVolumeDownIntent",
"samples": [
"ボリュームを {Count} 下げて"
],
"slots": [
{
"name": "Count",
"type": "AMAZON.NUMBER"
}
]
},
{
"name": "TVVolumeUpIntent",
"samples": [
"ボリュームを {Count} 上げて"
],
"slots": [
{
"name": "Count",
"type": "AMAZON.NUMBER"
}
]
}
],
"invocationName": "リモコン"
}
「アレクサ、リモコンでボリュームを3あげて」と発話すると、「ボリュームを {Count} 上げて」にパターンが一致しますので「TVVolumeUpIntent」とパラメータ名「Count」に「3」が格納されてHomeAssistantに渡されます。
4.3.設定
デフォルト欄には「https://[ドメイン名]/api/alexa?api_password=[パスワード]」を設定してください。
備考:HomeAssistantはリクエストをPOSTでしか受け付けていませんので「https://[ドメイン名]/api/alexa?api_password=[パスワード]」のアドレスにブラウザからアクセスしてもエラーとなります。
4.4.SSL証明書
4.6.テスト
サービスシミュレーターに発話を入力して動作を確認してください。
4.7.公開情報 & プライバシーとコンプライアンス
公開はしないので適当に入力してください。
「申請」を行うと公開されますので、「申請」はしないようにしてください。
5.AlexaSkill有効化
あとは、スマホのAlexaアプリでスキルを有効化してください。
お疲れ様でした。
6.その他
HomeAssistant Debugログを出力するには以下を追加して再起動してください。
logger:
default: debug
HomeAssistant Debugログ出力場所は/home/homeassistant/.homeassistant/home-assistant.log
です。