はじめに
Google Homeでの外部APIコールにIFTTTを使っているかたは多いと思いますが
IFTTTが有料になってしまい無料版だと3つまでのため諦めてしまった方も多いと思われます。
代わりに何か無料ですむ方法を探したところHome Assistantを使うことでIFTTTで行っていたことの代用ができそうでした。
Google Homeでの外部APIコールやスマートホーム化に便利そうなことがわかったので概要と赤外線リモコン連携、Google Home連携までを説明していきます。
わかりやすさ重視で画像のスクショ多めでの説明になります。ソフトやクラウドサービス側の更新でUIが一部変わる可能性がある旨はご了承下さい(2020/12/19時点でのスクショになります)
簡単な連携概要
GoogleのHomeアプリのルーティン設定にてHome Assistantのスクリプト(各種外部API実行や様々な操作が可能)がシーンとして実行可能になります。
ルーティンでは任意のキーワードを登録して実行できるため外部APIの実行ができます。
ルーティンの設定画面(シーンの部分でHome Assistant経由で外部APIを実行可能)
Home Assistantとは
- スマートホームを制御するためのホームオートメーション制御システムの中心となるように設計された、無料のオープンソースの ホームオートメーションソフトウェア
- 開発言語はPython。
- 2020年11月の時点でさまざまなIoTテクノロジー用の1700を超えるモジュラープラグインまたはアドオンが付属
- 赤外線リモコンや温湿度計、Google Assistant、HDMI CECなど各種IoTデバイスやハード、クラウドなどと連携可能
- 時間や天気、各種センサーなどをトリガーにして各種デバイスのオートメーション処理なども実行可能
- Webダッシュボード機能もあり各種データのモニタリングや各種実行ボタンを置いたりなど
- Android, iOSアプリもあり
- WEB UIは日本語対応
Wikipedia 英語
https://en.wikipedia.org/wiki/Home_Assistant
Home Assistantセットアップ
英語になりますがオフィシャルのドキュメントをGoogle翻訳して実施が一番参考になりました。
Install Home Assistant - Home Assistant
https://www.home-assistant.io/getting-started/
おすすめはラズパイに用意されたイメージをSDカードに焼き込む方法です。
ハードウェアはラズパイ3以降が推奨になります。
この記事では簡単にセットアップ可能なラズパイを対象に説明します。
(既存のLinuxやDocker, 仮想環境(VirtualBox, VMWare, etc...)などへも可能です。仮想環境はネットワーク周りが少し面倒かもしれません)
サポート環境URL。ラズパイ1,2やzeroものってはいますが非推奨と書いてあります。どんなものか見たいぐらいでの実行等になりそうです。
https://github.com/home-assistant/operating-system/blob/dev/Documentation/boards/README.md
Home Assistant Version 0.118.4にて試しました(今後のVersion UpでUIも色々変わる可能性は高そうです)
インストール
ラズパイ用のイメージは下記URLの
https://www.home-assistant.io/hassio/installation/
>1. Download the appropriate install option:
からラズパイなどの各デバイスに応じたイメージをダウンロードして下さい。圧縮されてxxx.img.gzになっているため解凍してxxx.imgにします。
イメージの書き込みにはbalenaEtcherというソフトを利用します。特に説明不要でイメージファイルと書き込むSDカードを指定するのみで簡単です。
https://www.balena.io/etcher/
ネットワークの公式のおすすめは有線LANなので予めラズパイに差し込んでください。設定も不要で信頼性もあるためになるようです。
Wifiで設定したい場合は下記記事の4を参照ください。USBメモリに設定を書いてラズパイにさすようです。(私は未実施)
https://www.home-assistant.io/getting-started/
ラズパイに書き込んだSDカードと有線LANをつないだら電源を起動します。
最初は最新版へのアップデートで20分ほど待ち時間が発生します。
その後Home Assistantが起動するのでブラウザにて
http://homeassistant.local:8123 にアクセスすると管理画面が見れます!
(またはhttp://homeassistant:8123 or ラズパイのIPアドレスを探してhttp://X.X.X.X:8123)
初期設定
最初にアクセスすると
ユーザー名、パスワードを登録する流れが始まるので入力していきます。
自動認識するようなデバイスはこの初期設定時に登録可能です。Google HomeはCast部分だけ対応しているのですがGoogle Assistant連携まではこの時点ではできないため後ほど行います。
その後下記のようなダッシュボードが表示されます。(一部設定したあとですがまだダッシュボードはそれほどいじってはいません)
ここまでは簡単なのですがここからが概念把握が難しく初めて触った時に戸惑いました。
RM Mini3(赤外線リモコン)連携
(※デバイスを持っていない、Google Home連携のみしたい場合でも軽く目を通してもらえるとHome Assistantの概念が具体例にてわかりやすいかと思います)
まずは簡単に連携できる格安赤外線リモコンのRM Mini3を連携する例を紹介します(1500円ほど)。
setup
- 下記のように [設定] → [インテグレーション] へ移動します。
- [インテグレーション」追加
- インテグレーションの一覧画面になるのでBroadlinkを検索し次へ。
連携先がいっぱいあるのでいろいろできそうですね。
- Host部分にIPアドレスを入力
- デバイス名を入力
- エリア(部屋名)を設定。エリアを新規で作成もできます。これで登録完了です!
この作業でデバイス1つと、エンティティ1つが追加されます。
- デバイス: 機器を表す
- エンティティ: 説明がしずらくはっきり言えないですができることのIDみたいなイメージのようです。デバイスによって単位が違うみたいでエンティティは1つのみでサービスで複数機能を分けたり、エンティティレベルで複数機能(複数センサーなど)をもったりもするようです。デバイスのインスタンスのようでもあります(RM Mini3が2台あるならエンティティも2つ)。また物理デバイスではない概念の後述するスクリプトなどもエンティティIDを持ちます。
次に赤外線の学習をします。
赤外線学習 (開発者ツールのイベント)
デバイスごとにサービスという概念を持っています。
例えばRM Mini3の場合は下記2つの実行サービスを持っています。
- remote.learn_command: 赤外線コマンド学習
- remote.send_command: 学習済みの赤外線コマンド送信
まずは赤外線の学習を行いましょう。
サービスの実行は メニューの[開発者ツール] → [サービス]タブからできます。
画面のフォームに下記を設定します。
サービス: remote.learn_command
エンティティ: remote.RM Mini3のentity_id
サービスデータ(YAML、オプション): 下記YAMLデータ
entity_id: remote.RM Mini3のentity_id(上で設定したエンティティが入力されているはずです)
device: デバイス名(照明ならlightなど)
command: コマンド名(電源ONならonなど)
サービスの呼び出しボタンを押すと学習を開始するのでRM Mini3に学習させたいリモコンで送信しましょう。
学習済みの赤外線送信(サービス実行)
学習した赤外線を送信してみましょう。
学習時と同様にサービスの実行にて行います。
画面のフォームに下記を設定します。学習時の値からサービスをremote.send_commandに変えるのみです。
サービス: remote.send_command
エンティティ: remote.RM Mini3のentity_id
サービスデータ(YAML、オプション): 下記YAMLデータ
entity_id: remote.RM Mini3のentity_id(上で設定したエンティティが入力されているはずです)
device: デバイス名(照明ならlightなど)
command: コマンド名(電源ONならonなど)
サービスの呼び出しボタンを押すと赤外線を送信できます。
学習済みの赤外線送信(スクリプトから実行)
赤外線送信をダッシュボードやGoogle Assistant連携するにはサービスをスクリプトとして登録する必要があります。
サービスデータ(YAML): 下記YAMLデータ
entity_id: remote.RM Mini3のentity_id
device: デバイス名(照明ならlightなど)
command: コマンド名(電源ONならonなど)
保存して一覧に戻ると追加されているのが確認できます。
左側の再生ボタンを押すと赤外線送信が実行されます
ダッシュボードから学習済み赤外線送信
これでダッシュボードを構築できそうです。調べればもっとおしゃれなボタンにもできると思います。
よりRM mini3連携を進めていく場合は公式のRM mini3用インテグレーションのドキュメントが参考になります。
YAMLの詳細等も書かれています。(対応機種にある後継機種のRM4 mini, RM4C mini等が気になりますね。ただ日本での情報はまだ少なそうです)
Broadlink - Home Assistant
https://www.home-assistant.io/integrations/broadlink/
Google Home連携
ここまででHome Assistantの雰囲気も少しはわかってきたと思うので
肝心のGoogle Homeとの連携を進めましょう。
下記のドキュメントを参考に進めていく流れになります。
Google Assistant - Home Assistant
https://www.home-assistant.io/integrations/google_assistant
Home Assistant Cloudという有料のサービスを使うとセットアップが自動で楽ですが
ほとんどの方は無料で使いたいと思うので手動セットアップのほうで進めていきます。
無料のDynamic DNS(Duck DNS)& 無料のSSL(Let’s Encrypt)
Google Assistantを使用するには、Home AssistantにDNS名とSSL証明書を使用して外部からアクセスできる必要があります。
すでに家庭にSSLありのドメインが存在する場合はこの箇所はスキップ可能です。
ない場合は無料Dynamic DNSのDuck DNSと無料SSLのLet’s Encryptを簡単に利用できるAddOnがあるので利用します。
(※注意・Home AssistantにはDuck DNSのインテグレーション機能もありますが、より高機能でLet’s Encrypt対応しているAddOnのほうを利用します)
下記のAddOnを利用します。
addons/DOCS.md at master · home-assistant/addons
https://github.com/home-assistant/addons/blob/master/duckdns/DOCS.md
1. DuckDNSのアカウント登録をします
https://www.duckdns.org/ にアクセスしてサインアップしてください。私はGoogleアカウントでサインアップしました。
サインアップ後に下記のような画面になるためサブドメインを登録してください。またtoken値をコピーしておきます。
2. SupervisorページからAddOnをインストールします。
次のページでINSTALLを押してインストール完了です。
3. Configurationタブに移動してyamlを設定する。
DuckDNSで作成したtoken, ドメインを入力します。
Infoに戻り下記のようになっているか確認してください。もしかするとSTART等押したかもしれないです。あとはStart on bootがONになっているかも確認して下さい。(私はここらへんが後述する5以降で再度RESTART押したり試行錯誤したので順番が違うかもしれません)
4. AddOnでFile editorをインストールする。
Home Assistantのコンフィグファイルのyamlを編集するのにFile editorをインストールします。
5. HTTPサーバーのSSL設定をする
Home Assistantに組み込まれているHTTPサーバーにSSL証明書の設定をします。
File editorを使いconfiguration.yamlを編集します。
DuckDNSのAddONにてLet’s EncryptのSSL証明書が作成されるのでそのファイルパスを追記する形になります。
ちなみにconfiguration.yamlは今後Home Assistantを編集する際に頻繁にでるファイルのようです。
下記を追記します。
http:
ssl_certificate: /ssl/fullchain.pem
ssl_key: /ssl/privkey.pem
Restart HASSを押すことでHome Assistant自体が再起動します。
本当はReload coreとか一部Reloadで済むとよさそうですが、あまり効かないのでRestart HASSになることが多いように思います。
6. 自宅のルーターの設定で443ポートをラズパイのIPの8123ポートに転送してください(ポートフォワーディング)
ここらへんは自宅の環境によって違うため適時行ってください。
スマホなどでWifiを切りモバイルアクセスにて
https://取得したドメイン.duckdns.org
でアクセスして外部環境側からHome Assistantが見れることを確認してください。
SSLの設定をすることで8123ポートがSSLアクセスになってしまうためローカル環境でもhttpsでアクセスする必要があります。
ローカル環境からIPアドレスで見ようとするとSSL警告がでるため無視するか
OSのHOSTSファイルを設定して取得したドメイン.duckdns.orgをラズパイのIPに設定することで
https://取得したドメイン.duckdns.org:8123 などでアクセスできます。
スマホからは警告無視するしかなさそうですね。もしくはローカル用DNS立てるなど。
追記(2021/02/08)
下記記事に書いたのですがNginxリバースプロキシを導入してHTTP+IPでアクセスできるようになりました。おすすめです。
[Google HomeでIFTTT(有料化)の代わりにHome Assistantが便利だったので画像多めで導入解説] (https://qiita.com/odetarou/items/df5bc6d00494ea14f33f#nginx%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%AE%E5%B0%8E%E5%85%A5http%E3%81%A7%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88)
Actions on Google設定
すでにGoogle HomeでSmart Homeアプリを作成したことがあるかたはご存知かもしれませんがダイレクトアクションの設定になります。
Actions on Googleコンソールで新しいプロジェクトを作成します。
https://console.actions.google.com/
表示名を入力します。GoogleのHomeアプリ上でスマートホームデバイスを登録する際のサービス名(Nature Remo, Hue, Regza等が並ぶ)の表示になります。
Fulfillment URLに取得したドメイン+指定のURLを入力します。(Home Assistantが提供します)
https://取得したドメイン.duckdns.org/api/google_assistant
Account linkgを設定
入力内容
Client IDなんたら: https://oauth-redirect.googleusercontent.com/r/プロジェクトID
(※プロジェクトIDは下記画像参考)
Client secret: 使用されないため適当な値を入力
Authorization URL: https://取得したドメイン.duckdns.org/auth/authorize
Token URL: https://取得したドメイン.duckdns.org/auth/token
※プロジェクトIDの探し方(プロジェクト名とは別なので注意)
テストボタンを押してテストを有効にするとSmartHomeアプリがデプロイされ稼働します。
Home Assitant側設定
下記URL(GCPコンソール)にアクセスしサービスアカウントキーを発行します。
https://console.cloud.google.com/apis/credentials/serviceaccountkey
下記URL(GoogleAPIコンソール)にアクセスしHomeGraph APIを有効にします。
https://console.cloud.google.com/apis/api/homegraph.googleapis.com/overview
Home Assistant側でFile editorを開きサービスアカウントキーのjsonファイルをアップロードする
File editorでconfiguration.yamlに下記を追加し再起動します。
google_assistant:
project_id: プロジェクトIDを指定
service_account: !include SERVICE_ACCOUNT.JSON
report_state: true
これでHome Assistant側でGoogle Assistant連携が準備できました。次はスマホのHomeアプリで設定します。
スマホ側のHomeアプリ設定
スマホ側のHomeアプリにてHome Assistantを追加します。
[test] 表示名でHome Assistantが表示されます。タップするとHome Assistantのログイン画面に遷移するのでID, Passを入力しログインするとHome Assitantとの連携が設定完了です。
Rest API連携
Home AssistantからRest APIをコールできます。
Homeアプリ上からシーンとして公開されるためルーティンを利用して任意のキーワードにてRest APIがコール可能になります。
IoT機器(ESP32など)との連携に便利です。
configuration.yamlを編集し下記を追加します。rest_commandを設定する形です。
私は給湯器をESP32で制御するようにしたものを操作したくRest APIを生やしたのでこれと連携させています。
rest_command:
ofuro_on:
url: "http://192.168.1.120/api/on"
ofuro_off:
url: "http://192.168.1.120/api/off"
ofuro_jidou:
url: "http://192.168.1.120/api/jidou"
ofuro_oidaki:
url: "http://192.168.1.120/api/oidaki"
jsonでの詳細なパラメータは公式ドキュメントを参照
RESTful Command - Home Assistant
https://www.home-assistant.io/integrations/rest_command/
Home Assistantを再起動するとサービスとして上記rest_commandが登録されます。
次にスクリプトとして登録します。(スクリプト作成方法は赤外線の説明と同様のため省略します)
スクリプトでのサービスの呼び出し部分でrest_command.各種API名を選択できるようになっています。
スクリプトを登録することでHomeアプリのルーティンでのシーンでスクリプトが選べるようになります。
Homeアプリでのルーティン設定
下記画像のように "給湯器自動" と言った場合にシーンを実行できます。
トリガーワードはorで複数指定できるため言い回しを複数登録すると実行ミスが減ります。
実行時にダイレクトアクションの場合は"ディロン"という効果音のみですがカスタムメッセージを再生するようにするとIFTTTのように返信メッセージを再生可能です。
「給湯器を自動にします。あとのことは任せてね」みたいにするとホットクックのような親しみ感がでてよさげです。
というわけでこれですべての連携が完了になります。お疲れ様でした。
今後
オートメーション機能(時間、各種センサー等のや条件をもとにデバイスの処理実行など)などもあるので調べて使うとまた発展的そうです。
IoT関連だとMQTTもサポートしているようです
MQTT - Home Assistant
https://www.home-assistant.io/docs/mqtt/
他にもいろいろあるので調べていくと楽しそうですね。
下記のその他はおまけ情報です
その他
Google Home(Google Assistant)でのAPI連携模索
2020年でもGoogle側で簡単に実行できるようなのは無さそうです。
未だにActions On Googleでの会話型モード(Conversation Action)だと開発者がプライベートで使いたいだけでも"XXXのテストバージョンです"と言われるのはどうにかならないのでしょうかGoogleさん。
もしくはルーティンにAPI実行などがあればいいのですが。
Google HomeもAlexaも両方もっていてGoogle Homeのほうが賢いと思ってる自分ですがプライベート実行には正直Alexaのほうが充実しているのは認めざるをえません。
海外の模索URL紹介。みんな探しているけど見つからない状況でした。
Private actions 2020 : GoogleAssistantDev
https://www.reddit.com/r/GoogleAssistantDev/comments/g8mzns/private_actions_2020/
Self Hosted IFTTT Alternative That Integrates with Google Assistant? : selfhosted
https://www.reddit.com/r/selfhosted/comments/iqbgu1/self_hosted_ifttt_alternative_that_integrates/
IFTTT Replacement That Integrates with Google Assistant & Allows Web Requests? : homeassistant
https://www.reddit.com/r/homeassistant/comments/iq9c1v/ifttt_replacement_that_integrates_with_google/
Home Assistantでのカスタムコンポーネントについて
今回はrest_apiを実行するだけの簡易的な実行を紹介しましたが
より深く連携して状態等を持つ場合はカスタムコンポーネントを作成することも可能です。
pythonでプラグインを作るようなイメージです。
下記に参考になりそうなURLを記載します。
Hass.io カスタムコンポーネントを作ってみる - Qiita
https://qiita.com/yambal/items/2539dfa989f8347eef46
Hass.io Yahoo 気象情報APIセンサー - Qiita
https://qiita.com/yambal/items/74c4e9d49e7e529955fb
公式ドキュメント
Integration Platforms | Home Assistant Developer Docs
https://developers.home-assistant.io/docs/creating_platform_index/
簡単なカスタムコンポーネントのソース例
example-custom-config/light.py at master · home-assistant/example-custom-config
https://github.com/home-assistant/example-custom-config/blob/master/custom_components/example_light/light.py
Home Assistantのドキュメント
英語の公式ドキュメントがなんだかんだで一番近道かもしれないです。Chromeの翻訳を使えば普通に読めます。
Documentation - Home Assistant
https://www.home-assistant.io/docs/
Architecture | Home Assistant Developer Docs
https://developers.home-assistant.io/docs/architecture_index/
Components Architecture | Home Assistant Developer Docs
https://developers.home-assistant.io/docs/architecture_components/
IFTTTとHome Assinstant+ルーティンの違い
IFTTTのように発話キーワードの一部を引数として取得することはできなそうです。
引数を使う場合はActions On GoogleでのConversin Actionを利用するしかなさそうです(未だにプライベートな開発だとテストバージョンですと言われる欠点が直ってないみたいですが。。)
もしくはダイレクトアクション規定の照明など各デバイス固有のパラメータならとれるとは思います。
ルーティンの登録最大数
不明のようです。結構作れそうとは思いますが。
グーグルルーチンのコマンドの最大数はいくつですか? -GoogleNestコミュニティ
https://support.google.com/googlenest/thread/85816956?hl=en
特に現時点2020/12/13では仕様は公開されていないようです。
Nature Remo連携
日本だけのデバイスのため公式Addonではありませんでした。
しかし有志の方がカスタムコンポーネントを作成されているので利用できそうです。(2020/12/19時点ではエアコンとエネルギーセンサーのみサポート、照明はまだのよう)
Support for Nature Remo - Configuration - Home Assistant Community
https://community.home-assistant.io/t/support-for-nature-remo/116544
yutoyazaki/hass-nature-remo: Nature Remo integration for Home Assistant
https://github.com/yutoyazaki/hass-nature-remo
Xiaomi 温湿度計 LYWSD02
h4/LYWSD02-home-assistant: Home-Assistant sensor for LYWSD02 Thermometer
https://github.com/h4/LYWSD02-home-assistant
こちらの製品はおすすめだったので下記記事で紹介してます
Xiaomiの温湿度計のBLEデータをラズパイで取得。スマートホームプラットフォーム(Home Assistant, Homebridge, ESPHome)の紹介なども。
https://qiita.com/odetarou/items/84b3c31a38d46b0001f6
HDMI CEC
紹介のみ(未確認)
HDMI-CEC - Home Assistant
https://www.home-assistant.io/integrations/hdmi_cec/
addons/cec_scan at master · home-assistant/addons
https://github.com/home-assistant/addons/tree/master/cec_scan
ダッシュボード
ダッシュボードはいろいろカスタマイズ可能でネットで使われているかたのを見るといろいろ華やかなにできそうです。
Home Assistantを使って、様々な情報を表示する『スマートホーム情報パネル』を作ってみた(温度・湿度、電力、NW、カメラ映像) | 育児×家事×IoT
https://dream-soft.mydns.jp/blog/developper/smarthome/2020/05/1218/
スマートホームのダッシュボード的なものが欲しくて、Home AssistantというOSSが良さげだったので色々と弄ってみている。これにNature Remoのプラグインを作ると良さげかも。 pic.twitter.com/e7pjBrm5Cd
— 🈚️ (@yzkiyuto) May 5, 2020
ChromeCast
Home Assistant Cast - Home Assistant
https://www.home-assistant.io/blog/2019/08/06/home-assistant-cast/
Nest HubやChromecastの画面にキャストもできるみたいです。すごい。
WSL2
Home AssistantをWSL2で実行できるっぽいですが、まだネットワーク周りが面倒くさそうな雰囲気が。
[Guide] Hass.IO on Windows 10 WSL2 (No more VMs!) - Home Assistant OS - Home Assistant Community https://community.home-assistant.io/t/guide-hass-io-on-windows-10-wsl2-no-more-vms/166298
TTS (Text-To-Speech)
追記(2021/02/08)
任意のテキストをChromecastでGoogle Homeなどに喋らせることができます。
[Home AssistantでTTS(Text To Speech)を利用する。google-home-notifierの一歩先へ。] (https://qiita.com/odetarou/items/df5bc6d00494ea14f33f)