概要
- Oracle Cloud Infrastructure の無償枠範囲で
- Home Assistant を構築して
- Google Nest と連携できるよう HTTPS:443 で外部公開してみる
はじめに
要約すると上記の概要なのですが、まずは、何をやりたくてこんなことするのが、きっかけをご説明します。
さっそく本題へ行きたいという方は「実践」の章まで飛ばしてください。
きっかけ
Google の スマートカメラ 「Nest Cam」が国内発売されました。
人物検知機能とかがあって、スマホの Google Home アプリに通知してくれるんですね。
リモートワークで2階の書斎に籠ったりしていると来客に気づかなかったりするし、これで通知が来るの案外悪くないなと思いました。
というわけで早速購入してみました。
※ドアベルタイプもあります。配線・設置が若干面倒なのでやめときました。
課題
Nest Cam を使った感想ですが、
「Google Homeアプリには通知してくれるけど、ほかの連携が乏しい」
ことに気づきました。
IFTTT にイベント連携できたりするんだろうと思い込んでいましたが、案外何もなかった。
Google 買収以前は IFTTT 連携があったみたいなのですが、Google Home への移行とともに廃止したようです。
日本版は Google Home 移行してからの上陸ですね...
Google Home のプラットフォーム上でこれから展開を計画しているとは思われるのですが...
そこで、(直近は困っていませんが、)何とかイベントを外部連携する方法を探り始めました。
Home Assistant
オープンソースのスマートホーム管理サーバー「Home Assistant」が、Google Home 移行後の Nest に対応していると気づきました。
この Home Assistant ですが、基本的に raspberrypi4 などに構築することが基本のようです。
ですが生憎、手元に raspberrypi が余っていないし、のちのち Nest と連携する際に外部からの疎通を確保しなきゃいけないし、
どうにかクラウド上に構築したりできないかなと思い立ちました。
そこで、Oracle Cloud Infrastructure の Always Free を思い立ちました。
Oracle
Oracle Cloud Infrastructure には Always Free という売り文句で無償枠があり、raspberrypi の代替インスタンスくらいなら無償で行けそうです。
普段は AWS 使いですが、Free という言葉に釣られて個人的に登録していたのでした。
使い道を持て余していたのでちょうどいいです。
ということであらすじをまとめますと、
- Oracle Cloud Infrastructure の無償枠範囲で
- Home Assistant を構築して
- Google Nest と連携できるよう外部公開してみる
ことになったのでした。
ポイント
Home Assistant を raspberrypi のようなアプライアンスでなく VM 上へインストールすることは、公式側お勧めの手順ではないです。
上級者向けという扱いで、そもそもドキュメントも最小限みたい。
さらに、Home Assistant 自体の歴史的経緯などもあって手順が変わったりしたらしく、古い情報が載った記事も見受けられ、その点も踏まえてドキュメントが今一つ散逸している模様でした。
特に、TLS を有効化して外部オープンするあたりが、公式フォーラムでも結構揉めている模様。
なので、そのあたりは独自アレンジも入れながら試行錯誤してみました。
「試してみて使えそうならその後手を加えていこう」程度のマインドですので、セキュリティや可用性などが実用に耐えるかは未検証な点もご留意ください。
実践
1. インスタンス構築
Oracle Cloud Infrastructure を勉強してみる章です。
まず、Always Free の範囲内で構築できるインスタンスを選択して構築してみます。
1/8 OCPUと1 GBメモリをそれぞれ備えた2つのAMDベースのコンピュートVM。
1つのVMまたは最大4つのVMとして使用可能な4つのArmベースのAmpere A1コアと24 GBのメモリ。
x86 インスタンスも選べますが、メモリサイズも結構小さそうだし、Home Assistant の構築には耐えられなさそうです。
ところで、実は ARM インスタンスも選べるらしく、ARM のほうがメモリも積ませてくれる模様です。
もともと Home Assistant は raspberry pi 推奨ですし、ARM でも大丈夫かなと思って ARM を選ぶことにします。
2. Home Assistant 構築
Home Assistant の導入方法については、古い導入方法やら不完全な情報やらが溢れており、どの記事も一長一短あるかといったところでした。
構築方法の参考にするうえで、一番過不足なさそうな記事は下記でした。
ですが、もう少々独自アレンジを入れて構築してみたいと思います。
インスタンスへ接続
1 | 最初のインスタンス画面へ戻って、実行中になったインスタンスを選択します。 | |
2 | パブリックIP と ユーザー名を控えておきます。 | |
3 | 控えた情報と ダウンロードしていた SSH キー を使って、SSHログインします。 | |
4 | これでひとまずログイン完了 |
ログイン完了したら、ひとまずお決まりコマンドでアップデートを当てておきます。
sudo apt-get update
sudo apt-get upgrade
Docker インストール
Home Assistant が Docker 上で動くので、Docker を導入しておきます。
今回 ARM 環境なので、 x86 を使っている記事などを参照して同じ手順を取ってしまうと、行き詰まるケースがありそうです。
確実を期して公式手順に従ってみます。
まず古いバージョンなどがあれば削除
sudo apt-get remove docker docker-engine docker.io containerd runc
依存ライブラリを導入
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
公式リポジトリを登録
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Stable ビルドを参照するように登録
(ここ arm64 の手順を見る)
echo \
"deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Dokcer をインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
Home Assistant インストール
公式における「Home Assistant Supervised」の手順になります。
公式では「初心者に勧めない」と繰り返し謳われていますが、まあ今までの手順からしても玄人向けなのは納得ですね。
公式の推奨は Raspberry pi に OS としてインストールするか、丸ごと入った コンテナを導入するかの2択らしいですが、どちらも今回の目的に合わないので玄人向け手順を使うことにします。
依存ライブラリを導入
sudo apt-get install jq curl avahi-daemon dbus network-manager
ModemManager を無効化する
詳細よく知りませんが、Home Assistant とバッティングするというフォーラム報告があります。
ポートを公開するときに取り合いとかになるのかな?
sudo systemctl disable ModemManager
sudo systemctl stop ModemManager
ルート昇格
あまり褒められる行為ではないですが、ルート昇格しないとインストールスクリプトが動かないらしいので。
sudo su -
インストールスクリプトダウンロード
curl -Lo installer.sh https://raw.githubusercontent.com/home-assistant/supervised-installer/master/installer.sh
インストールスクリプト実行
今回 ARM 環境なこともあって、マシンタイプを自動で選ばせると危険なようです。
あえて「raspberrypi4」を明示的に指定します。
bash installer.sh --machine raspberrypi4
1か所 y を入力する必要があります。 | ||
完了すると 8123番ポートをリッスンし始めます。 |
この時点で権限周りの設定が一部まだ反映されていないらしく、インスタンスをいちど 再起動 しておくのがお勧めです。
3. ネットワーク設定
インストールした Home Assistant へ、ブラウザアクセス可能にします。
ポート開放
OCI のコンソールからセキュリティ設定を触っていきたい、ところですが...
まず、OCI のインスタンスは OS 側もデフォルトでポート閉じているということで、件の TCP 8123 番を先に開いておきましょう。
sudo iptables -I INPUT 5 -p tcp --dport 8123 -j ACCEPT
sudo /etc/init.d/netfilter-persistent save
sudo /etc/init.d/netfilter-persistent reload
では、ネットワークセキュリティグループを操作していきましょう。
これで一旦はアクセス可能になりました。
http://<パブリックIP>:8123/ へアクセスしてみます。
1 | アカウント登録画面が出るので、流れに沿って設定してしまいます。 | |
2 | ダッシュボードが見えるところまで進めました。 |
4. HTTPS 周りの設定
http:8123 でサービス開始できたわけですが..
Google Home などを連携しようとすると https:443 が必須になるので、対応できるよう設定していきます。
ネットワークレベルでの 443 > 8123 リダイレクト
ちょっと大げさですが、せっかくなのでロードバランサでやってみます。
完了後、
http://<ロードバランサのIP>:443/ へアクセスしてみます。
(証明書設定がまだなので、あえて http)
ひとまず OK でした。
Duck DNS 登録
IPアドレス経由のアクセスをやめるためにドメインを取りますが、
Home Assistant 公式アドオンが用意されている Duck DNS を使ってみます。
公式アドオンを使うほうが今後の問題が起こらなさそうです。
1 | 何かしらの手段でログインします。 | |
2 | ドメイン名を決めて 「add domain」すると、5つまで無料でドメインが取れるようです。 | |
3 | ドメインの向け先IPアドレスを手動で編集できます。(あとでアドオンが勝手に編集してくれます。) | |
4 | (アドオンに自動編集を許可するために) token の値を控えます。 |
Home Assistant に戻りまして、アドオンの設定を行っていきます。
最後に、実は発行された証明書を Home Assistant に読ませないといけません。
1 | アドオンストアで File editor を開きます。 | |
2 | インストールします。 | |
3 | サイドバーに表示させて開始します。 | |
4 | File editor を開きます。 | |
5 | ファイルメニューを開きます。 | |
6 | configuration.yaml を開きます。 | |
7 | 証明書設定を追記して保存します。 |
http:
ssl_certificate: /ssl/fullchain.pem
ssl_key: /ssl/privkey.pem
設定を読ますために一度インスタンスを再起動します。
(Home Assistant プロセスの再起動だけでもたぶん大丈夫)
しばらく待って https でアクセスしてみます。
完成です。
その後
長くなっているので省略しますが、Home Assistant を使って、Nest Cam からのイベントトリガーを好きなイベントに流せたりします。
この辺りまで来れば、あとは公式のドキュメントでも事足りると思います。
※ ちなみに、Google の API 登録料か何かで 1回だけ $5 くらい必要
おわりに
個人的な感想としては、インスタンスタイプの選択から、最終的に LB の構築までしちゃいましたし、 OCI のいいチュートリアルになったかもと思っております。
Nest のトリガーについては...今のところまだ困っていないし、本格運用するなら細かいセキュリティ観点なども確認したいので、まだ発展途上です。
この構成で実際にHome Assistant を使いたい場合、実用に耐える構成かはよくご検討のうえでご利用ください。