4
3

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 3 years have passed since last update.

Oracle Cloud Infrastructure 上に Home Assistant を構築する

Posted at

概要

  • 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 を選ぶことにします。

1 インスタンス管理画面へ移動 image.png
2 (既にいろいろ試してますが)インスタンスの作成 image.png
3 こんな感じで設定していきます image.png
4 右上をクリックすると各ペインを開くことができます。まずはイメージの変更から。 image.png
5 普通は Oracle Linux でよさげですが、Home Assistant が Debian系 OS を前提にしているような気もするので、Ubuntu に変えておきます。バージョンやビルドは最新にしておきます。 image.png
6 イメージを選択しおわったら、「シェイプ」ことインスタンスサイズを選んでいきます。 image.png
7 AlwaysFreeで選択可能なものしか選べないとは思います。ARMベースの Ampare から、A1.Flex を選択。CPUコアとメモリも自由選択ですが、枠を超えない範囲で2コア 8GB あたり入力してみます。 image.png
8 VPC と サブネットは適当に新規作成してもらいます(もう作ってたらそれに所属させるで OK)。ネットワーク周りに拘りのある方は自力で設定できるかと思いますので省略。 image.png
9 あとは SSH キー をダウンロード(インスタンス作成より先に落とすのね)。なんとなく暗号化設定を入れてから、作成します。 image.png

2. Home Assistant 構築

Home Assistant の導入方法については、古い導入方法やら不完全な情報やらが溢れており、どの記事も一長一短あるかといったところでした。
構築方法の参考にするうえで、一番過不足なさそうな記事は下記でした。

ですが、もう少々独自アレンジを入れて構築してみたいと思います。

インスタンスへ接続

1 最初のインスタンス画面へ戻って、実行中になったインスタンスを選択します。 image.png
2 パブリックIP と ユーザー名を控えておきます。 image.png
3 控えた情報と ダウンロードしていた SSH キー を使って、SSHログインします。 image.png
4 これでひとまずログイン完了 image.png

ログイン完了したら、ひとまずお決まりコマンドでアップデートを当てておきます。

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 を入力する必要があります。 image.png
完了すると 8123番ポートをリッスンし始めます。 image.png

この時点で権限周りの設定が一部まだ反映されていないらしく、インスタンスをいちど 再起動 しておくのがお勧めです。

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

では、ネットワークセキュリティグループを操作していきましょう。

1 インスタンスの詳細ページから所属サブネットを開きます。(デフォルトではインスタンス単独のセキュリティグループは付いてないみたい。) image.png
2 (別に新規設定を足してもいいですが) デフォルト設定を開いて編集していきます。 image.png
3 デフォルトで SSH 用設定などが入っていますが、「イングレス・ルールの追加」で設定を追加します。 image.png
4 「0.0.0.0/0」(任意の送信元) から 宛先 TCP 8123 へ許可ルールを追加します。 image.png

これで一旦はアクセス可能になりました。
http://<パブリックIP>:8123/ へアクセスしてみます。

1 アカウント登録画面が出るので、流れに沿って設定してしまいます。 image.png
2 ダッシュボードが見えるところまで進めました。 image.png

4. HTTPS 周りの設定

http:8123 でサービス開始できたわけですが..
Google Home などを連携しようとすると https:443 が必須になるので、対応できるよう設定していきます。

ネットワークレベルでの 443 > 8123 リダイレクト

ちょっと大げさですが、せっかくなのでロードバランサでやってみます。

1 ネットワーキング > ロード・バランサ を開きます。 image.png
2 (もう作ってますが) 「ロード・バランサの作成」を選択します。 image.png
3 ネットワーク・ロード・バランサでいいのですが、実はAlways Free だとネットワーク・ロード・バランサの制限がきつめなので、普通のロード・バランサで行きます。(バックエンドインスタンスをホスト名指定できない。) image.png
4 (どっぢでもいいんですが) ここが最終的なアクセス先となるので、予約IPを作ってしまってもいいかも。 image.png
5 帯域は Free なので最小しか選べません。 image.png
6 ネットワーキングは インスタンスと同じものを選びます。(実用の際はよしなに設計してください。) image.png
7 1台しかいないのでバランシングポリシーはどうでもいいとして、バックエンドを追加します。 image.png
8 作成したインスタンスを選択します。(ネットワーク・ロード...の際、FreeだとここがIP指定しかできない。) image.png
9 追加後に、受付ポートを 8123 へ変更しておきます。 image.png
10 1台なのでヘルスチェックもどうでもいいんですが、一応 TCP:8123 を指定しておきます。 image.png
11 ロードバランサーが受け付けるリスナーポートとして、TCP:443を指定します。HTTPS を指定すると、ロードバランサーが SSL 処理を受け持ってしまうので、あえて TCP を選びます。 image.png
12 ログは無償枠がありそうなので、ひとまず適当に有効化しておきます。 image.png

完了後、
http://<ロードバランサのIP>:443/ へアクセスしてみます。
(証明書設定がまだなので、あえて http)

image.png

ひとまず OK でした。

Duck DNS 登録

IPアドレス経由のアクセスをやめるためにドメインを取りますが、
Home Assistant 公式アドオンが用意されている Duck DNS を使ってみます。
公式アドオンを使うほうが今後の問題が起こらなさそうです。

1 何かしらの手段でログインします。 image.png
2 ドメイン名を決めて 「add domain」すると、5つまで無料でドメインが取れるようです。 image.png
3 ドメインの向け先IPアドレスを手動で編集できます。(あとでアドオンが勝手に編集してくれます。) image.png
4 (アドオンに自動編集を許可するために) token の値を控えます。 image.png

Home Assistant に戻りまして、アドオンの設定を行っていきます。

1 Supervisor > アドオンストア > Duck DNS を開きます。 image.png
2 インストールします。 image.png
3 設定画面へ行きます。 image.png
(ちなみに設定方法はドキュメントに記載されています) image.png
4 accept_terms: true
token:
domains: に 取得した Duck DNS ドメイン
ipv4: <ロードバランサのIP> を追記
編集したら保存します。 image.png
5 アドオンの自動起動をセットしたあと、開始します。 image.pngimage.png
5 ログ画面をのぞいて適当にリフレッシュしていると、letsencrypt の証明書を発行してくれています。(ドメイン認証なので80番ポート開放不要でした。ちなみにフォーラムでは開放が要るのかで意見割れてました...) image.png
6 Duck DNS へ行くと、IPが更新されているはずです。 image.png

最後に、実は発行された証明書を Home Assistant に読ませないといけません。

1 アドオンストアで File editor を開きます。 image.png
2 インストールします。 image.png
3 サイドバーに表示させて開始します。 image.png
4 File editor を開きます。 image.png
5 ファイルメニューを開きます。 image.png
6 configuration.yaml を開きます。 image.png
7 証明書設定を追記して保存します。 image.png
http:
  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem

設定を読ますために一度インスタンスを再起動します。
(Home Assistant プロセスの再起動だけでもたぶん大丈夫)

しばらく待って https でアクセスしてみます。

image.png

完成です。

その後

長くなっているので省略しますが、Home Assistant を使って、Nest Cam からのイベントトリガーを好きなイベントに流せたりします。

image.png
image.png

この辺りまで来れば、あとは公式のドキュメントでも事足りると思います。

※ ちなみに、Google の API 登録料か何かで 1回だけ $5 くらい必要

おわりに

個人的な感想としては、インスタンスタイプの選択から、最終的に LB の構築までしちゃいましたし、 OCI のいいチュートリアルになったかもと思っております。
Nest のトリガーについては...今のところまだ困っていないし、本格運用するなら細かいセキュリティ観点なども確認したいので、まだ発展途上です。
この構成で実際にHome Assistant を使いたい場合、実用に耐える構成かはよくご検討のうえでご利用ください。

4
3
1

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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?