AmazonEchoで赤外線リモコン操作(RaspberryPiでHomeAssistant使用)

# 0.前提条件・事前準備
## 前提条件
グローバルIPを使用できること。
ポート番号：80,443を開放可能であること。
Amazon Developer Servicesのアカウントがあること。

## 事前準備
 固定IPでない場合は、DDNSサービスを使用してIPとホスト名を紐付けておいてください。
 ポート番号：443を開放してRaspberryPiとマッピングしておいてください。
 ポート番号：80を開放してRaspberryPiとマッピングしておいてください。(SSL証明書取得に使用します。)

# 1.Raspberry Piセットアップ＆赤外線送受信設定
こちらを参考に。(こちらのほうが詳しいので)
[Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_stretch_lirc_ir_remote_control_2017/)

備考：コンデンサを使用しない場合、出力が弱いのでなるべくコンデンサを使用してください。

# 2.HomeAssistantインストール

##2.1.Pythonインストール
Pythonと関連モジュールをインストールします。

```bash
sudo apt-get install python3 python3-venv python3-pip
```
##2.2.HomeAssistantユーザ作成
HomeAssistant用のユーザを作成します。

```bash
sudo useradd -rm homeassistant
```
##2.3.HomeAssistantインストール先ディレクトリ作成
HomeAssistantインストール先ディレクトリを作成し、作成したディレクトリの所有権を2.2で作成したユーザに変更します。

```bash
cd /srv
sudo mkdir homeassistant
sudo chown homeassistant:homeassistant homeassistant
```
##2.4.HomeAssistant仮想環境作成
HomeAssistantの仮想環境を作成します。作成は2.2で作成したユーザで実行します。

```bash
sudo su -s /bin/bash homeassistant
cd /srv/homeassistant
python3 -m venv .
source bin/activate
```
仮想環境をアクティブにするとプロンプトが変更されます。
##2.5.HomeAssistantインストール
HomeAssistantをインストールします。

```bash
pip3 install homeassistant
```
##2.6.HomeAssistant起動確認
以下のコマンドでHomeAssistantを起動します。

```bash
hass
```
ブラウザで`http://[raspberrypiのIPアドレス]:8123`にアクセスしてHomeAssistantの起動を確認します。

##2.7.HomeAssistantサービス化
HomeAssistantをサービスにします。

```bash
sudo nano /etc/systemd/system/home-assistant.service
```

```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
```
デーモンをリロード後、自動起動に設定します。

```bash
sudo systemctl --system daemon-reload
sudo systemctl enable home-assistant
```
サービス起動方法は以下の通りです。

```bash
sudo systemctl start home-assistant
```
サービス停止方法は以下の通りです。

```bash
sudo systemctl stop home-assistant
```

サービス再起動方法は以下の通りです。

```bash
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を使用しているサービスは停止してください。

```bash
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でサービスを起動します。

```/home/homeassistant/.homeassistant/configuration.yaml
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
```

サービス再起動します。

```bash
sudo systemctl restart home-assistant
```
ブラウザで`https://[ドメイン名]:443`にアクセスしてHomeAssistantの起動を確認します。

## 2.9.HomeAssistant アクセスパスワード設定
HomeAssistant アクセスパスワードを設定します。

```/home/homeassistant/.homeassistant/secrets.yaml
http_password: [パスワード]
```
パスワードに「#」をいれたら認証できなかったというQAを何処かで見ましたので、記号は使わないほうがいいと思います。

# 3.HomeAssistant 設定
## 3.1.Switch 作成

赤外線送信するSwitchを作成します。以下は例です。コマンドは各自変更してください。

```/home/homeassistant/.homeassistant/configuration.yaml
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コマンドの引数は各自変更してください)

```/home/pi/volume.sh
for i in `seq 1 $2`
do
  irsend SEND_ONCE "tv" $1;
  perl -e 'select(undef, undef, undef, 0.05);'
done
```
作成したshellに実行権限を付与します。

```bash
chmod a+x /home/pi/volume.sh
```

ブラウザで`https://[ドメイン名]:443`にアクセスして作成したSwitchが動作することを確認してください。

複数コマンドを実行したい場合は、shellを作るか、sceneを使用してください。以下は例です。

```/home/homeassistant/.homeassistant/configuration.yaml
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の設定を行います。

```/home/homeassistant/.homeassistant/configuration.yaml
alexa:
intent_script: !include alexa.yaml
```

```/home/homeassistant/.homeassistant/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.スキル情報設定

![alexa1.png](https://qiita-image-store.s3.amazonaws.com/0/215538/0302dbf6-881a-fd88-44a6-bf82ecba22f3.png)

呼び出し名は各自変更してください。
呼び出し名が「リモコン」だと、「アレクサ、リモコンでライトをオンにして」のような呼び出しになります。

## 4.2.対話モデル

```Intents
{
  "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.設定
![alexa2.png](https://qiita-image-store.s3.amazonaws.com/0/215538/739196e2-b02b-6ee2-3d68-b7aab0979ccf.png)
デフォルト欄には「https://[ドメイン名]/api/alexa?api_password=[パスワード]」を設定してください。

備考：HomeAssistantはリクエストをPOSTでしか受け付けていませんので「https://[ドメイン名]/api/alexa?api_password=[パスワード]」のアドレスにブラウザからアクセスしてもエラーとなります。


## 4.4.SSL証明書
![alexa3.png](https://qiita-image-store.s3.amazonaws.com/0/215538/399c4da5-fa60-6e58-f5e4-6b01bbfd12a1.png)

## 4.6.テスト
サービスシミュレーターに発話を入力して動作を確認してください。

## 4.7.公開情報 & プライバシーとコンプライアンス
公開はしないので適当に入力してください。
「申請」を行うと公開されますので、「申請」はしないようにしてください。

# 5.AlexaSkill有効化
あとは、スマホのAlexaアプリでスキルを有効化してください。

お疲れ様でした。

## 6.その他
HomeAssistant Debugログを出力するには以下を追加して再起動してください。

```/home/homeassistant/.homeassistant/configuration.yaml
logger:
  default: debug
```

HomeAssistant Debugログ出力場所は``/home/homeassistant/.homeassistant/home-assistant.log``です。


# 参考
* [Raspbian Stretchで LIRC機能を使った学習リモコン、赤外線リモコンを動かす方法](http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_stretch_lirc_ir_remote_control_2017/)
* [メモ：Home Assistant + Raspberry Pi + センサー でホームオートメーションしたい #1](https://qiita.com/spicemanjp/items/59032bad6c93c5ac28ab)
* [Home Assistant - Installation in Python virtual environment](https://home-assistant.io/docs/installation/virtualenv/)
* [Home Assistant - Autostart using systemd](https://home-assistant.io/docs/autostart/systemd/)
* [Let’s Encryptの無料SSL証明書で、ウェブサイトを安全に公開する](https://koron0902.ddns.net/index.php/2016/09/17/lets-encryptssl/)