11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-11-25

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

/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

サービス再起動します。

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に実行権限を付与します。

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

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

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.設定

alexa2.png
デフォルト欄には「https://[ドメイン名]/api/alexa?api_password=[パスワード]」を設定してください。

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

4.4.SSL証明書

alexa3.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です。

参考

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?