Smart HomeをDIYする

Apple HomeKit は対応製品が少なくて高価なのでHomebridgeでがんばります

Intel NUCにHome Assistantをインストールする

普通のWindows用小型デスクトップPCであるIntel NUCに、Home Assistantをインストールしました。初めて使うHome Assistantなので、いまだに使い方が良くわからないのですが、とりあえずはESPHome使ってLチカしました。Home AssistantはHomeKitブリッジとして使えるので、ESPHomeで作ったデバイスiPhone/Macのホームからも利用できました。

Intel NUCをサーバにする

Home AssistantはRaspberry Pi 4をサーバにしての動作例が多いです。でも手持ちのRaspberry Pi 4が故障してしまい、予備も無く、昨今の品不足で手に入らなくなってしまいました。それでお蔵入りだった初代Intel NUC DC3217IYEを引っ張り出しました。メモリは8GB、SSDはmSATAの64GB、CPUはCore i3-3217Uを搭載してます。現在、Homebridgeを動かしているマシンも同じ機種で、さらに1台予備があったのでそれを使いました。

ケースや冷却がしっかり作られた汎用コンピュータは、常時電源入れっぱなしのサーバーとして、Raspberry Piよりも適しているのではと思い始めてます。昔のCore i3ですが、それでも処理速度はRaspberry Pi 4の2倍くらいはありますし、mSATA SSDはSDカードより堅牢です。消費電力は多少多いですが、Macbook Airなどに搭載されているモバイルCPUシリーズなので省電力です。Raspberry Pi 4と比較すると、2.5倍程度の消費電力になります。具体的には、Raspberry Pi 4だと年間400円くらいの電気代が、1000円になる程度の差です。

初代Intel NUCは、中古でしか入手できませんが(7000円くらい)、品不足のRaspberry Piよりも入手容易かもしれないです。この機種以外にも、似たようなスペックの小型省電力中古デスクトップPCはたくさんあるので選択肢も多いです。Intel NUC以外にも、HPのEliteDesk、DellのOptiPlex、LenovoのThinkCentreなどの小型モデルが、スマートホームサーバーに向いていると思います。中古と新品の価格を比較するのはフェアでは無いですが、古い中古ならばRaspberry Pi 4の8GBモデルとあまり変わらない価格で入手できます。

汎用x86-64版を導入

汎用PCを使うので、Home Assistantも汎用x86-64版を使います。home-assistant.ioのサイトから、Generic x86-64のページに行き、その内容に従ってインストールします。

Home Assistantは、Linuxからaptコマンドなどを使ってコツコツインストールするのではなく、イメージを使ってインストールする方法を推奨しているようです。その方が問題が発生しにくいのは確かです。なので、

  1. OS込みのディスクイメージをボリュームに書き込む
  2. イメージをKVM, VirtualBox, Vmwareなどの仮想マシンで使う
  3. イメージをDockerなどで使う

などの方法が最初に書かれてます。WindowsMacで可能なのは2の方法だけです。3の方法は、主にQNAPなどのNASで使うことを想定しているようです。WindowsMacでネイティブに動くバージョンも配布しているHomebridgeに比べると割り切った実装です。今回は、休眠マシンを使うこともあり、ハードウェアを贅沢に使う感じの、1の方法でインストールしました。

まずは、Intel NUCのSSD (容量は64GB) をmSATAソケットから取り外し、mSATA - SATA変換基板に取り付け2.5インチSSDの形状にして、USB接続HDDケースに入れて、これをMacに取り付けました。MacからはUSB接続SSDとして認識されました。

次に、Home Assistantのページの記述に従って、Balena EtcherソフトウェアMac版をダウンロードして起動します。そして、Flash from URLを選んでページに書いてある最新のイメージのURLを指定します。

https://github.com/home-assistant/operating-system/releases/download/8.5/haos_generic-x86-64-8.5.img.xz

最後に書き込み先のドライブとして、USB接続したmSATA SSDを指定して、Flash!ボタンを押します。

この結果をディスクユーティリティで確認すると以下のようになってました。

このSSDを、元のIntel NUCのmSATAソケットに戻して、電源を入れればHome Assistantが起動します。この先はNUCをディスプレイ無しで運用する予定ですが、最初の起動だけはディスプレイに接続して動作を確認しました。

ここに書かれているように、http://homeassistant.local:8123に接続すれば、webページが開き、設定と操作が全てできるようになります。初めて使うHome Assistantでしたし、機能が豊富で複雑なので、色々試行錯誤しながら設定していきました。正直なところとても難しいです。

ESPHomeを使ってLチカする

まずは初心者向けに、LEDの点滅(Lチカ)でもやってみようと思いました。以前にコマンドラインから使ったESPHomeを、

diysmarthome.hatenablog.com

ご本家のHome Assistantで使ってみます。前回と同様にGPIO 13番ピンにLEDを取り付けたESP32開発基板を用意しました。これをHome Assistantが動いているIntel NUCのUSBポートに接続します。「設定」「アドオン」から「アドオンストア」に行ってESPHomeの通常版を導入します(他にベータ版や開発版がありました)。すると、「設定」「アドオン」にESPHomeが現れるので、開きます。

ここで「WEB UIを開く」を押したら、ESP32にプログラムをダウンロードできるようになりました。USBに接続したESP32に名前をつけて、以下のようなyamlファイルを作りました。内容は前回の記事のyamlとほぼ同じですが、今回はHome Assistantからも使えるように、apiを有効にしてあります。MQTTの設定は残してありますので、MQTTメッセージも流れます。

apiのkeyは自動的に作成されました。WiFiやMQTTのIDとパスワードなどは動かす環境に合わせて設定します。

esphome:
  name: espled

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

ota:
  password: "xxxxxxxxxxxxxxxxxx"

wifi:
  ssid: "xxxxxxxxx"
  password: "xxxxxxxx"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "espled Fallback Hotspot"
    password: "xxxxxxxx"

mqtt: 
  broker: 192.168.xxx.xxx
  username: xxxxxxxx
  password: xxxxxxxx
switch: - platform: gpio pin: 13 name: 'blue_led' captive_portal:

この後、「設定」「デバイスとサービス」のページで、完成したESP32を「ダッシュボードに追加」できます。その結果、「オーバービュー」のページに、このデバイスがスイッチとして現れました。操作するとESP32のLEDが点灯、消灯します。

前回の記事と同じですが、Homebridgeにはmqttthingプラグインが入れてあります。今回のyamlファイルに合わせて設定すると、Homebridgeのconfigファイルのmqttthingプラグインの部分は以下になりました。MQTTブローカーはHomebridgeと同じマシンで動いているので、こちらのIPアドレスlocalhostになってます。topicsはyamlファイルに現れる名前をつなげたものです。topics名が不明な場合は、Home AssistantでESP32を操作しながら、topicsの上階層(例えばespled/#)をサブスクライブすれば、topics名を知ることができます。

{
"type": "lightbulb-OnOff",
"name": "Blue LED",
"url": "mqtt://localhost:1883",
"username": "xxxxxxxx", "password": "xxxxxxxx", "topics": { "getOn": "espled/switch/blue_led/state", "setOn": "espled/switch/blue_led/command"
}, "onValue": "ON", "offValue": "OFF", "accessory": "mqttthing" },

その結果、iPhone/Macのホームに、MQTT連動した電球アクセサリが現れました。これはESP32がパブリッシュするMQTTメッセージに連動して表示が変化します。また、電球アイコンをクリックすれば、HomeKit側からもESP32のLEDを点灯・消灯できます。

HomeKitと連動する

Home Assistantの初期設定の過程で、おそらくHomeKitプロトコルが動いていることが検知された結果だと思いますが、HomeKitブリッジとして機能させるかどうかを聞かれました。設定したところ、HASS Bridge:XXXXXという名前で、Home AssistantがHomeKitのブリッジとして動き始めました。「設定」「デバイスとサービス」を見ると、「統合」のタブの場所にブリッジが現れています。

この後、Home Assistantの「通知」に現れるQRコードを使って、iPhoneのホームからブリッジを追加しました。すると、Home Assistantで作ったデバイスが、HomeKitのアクセサリとして現れるようになりました。ここで作ったESP32も表示されました。この結果、同じESP32が、MQTTブローカー経由と、Home Assistant経由で、それぞれ表示されました。

左がMQTT経由、右がHome Assistant経由のESP32です。違う経路でHomeKitに接続されていますが、同じデバイスなので、どちらかをon/offすると、もう一つも連動してon/offします。

まとめ

Home Assistantを初めて使ってみました。半導体不足の影響でRaspberry Piが入手できないので、お蔵入りしていた小型デスクトップコンピュータにインストールしました。Raspberry Piじゃ無くてもこれで良いように思いました。

慣れていないこともありますが、Home AssistantはHomebridgeに比べて複雑で、使い方がいまだによくわかりません。HomeKitを使う前提ならば、Homebridgeをメインに使っていくのが簡単で良いと思います。一方で、Home Assistantの高機能を活かせる用途では、そちらで設定をして、ブリッジ機能を使ってHomeKitから使用するのも良いと思いました。例えば今回試したESPHomeを使えば、Home Assistantでの開発とテストが容易です。なので、MQTTでも動くように設定しておけば、HomeKitから直接使用できて便利かと思います。