Homebridgeで家電をHomeKit化してみる(前編)

# はじめに

この記事は、[SLP KBIT AdventCalendar2021](https://adventar.org/calendars/6706) 2日目の記事です。
PCや家電、スマートプラグなんかをiPhoneやMacから操作できるようにする試みです。

こんにちは！2021年も残すところあと1ヶ月弱ですね～
少し前にNatureRemo miniというスマートリモコンを購入しました。手元のスマホにリモコン機能が集約されるのはとっても便利。
でも、たまに操作を受け付けなかったり、iPhoneだと専用アプリかSiriショートカットからしか操作できなかったりと少し不便な部分も...
そういうわけで、どうせならHomeKit化して1つのアプリでまとめて使えるようにしちゃえ！と思い、いろいろ試してみたことを紹介します。

前編ではHomebridgeを導入し、手始めにTPLinkのスマートプラグとデスクトップPCをアクセサリ化します。
後編はこちらです。

https://qiita.com/Gomatamago_/items/c11e63d19877268ee261

導入後は、以下のようにiPhoneのホームアプリからデバイスを操作、管理できるようになります。
<img width=45% alt="ホームアプリの画面" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925552/be563e92-82a6-4bc1-0827-34c43d791c16.png>　<img width=45% alt="エアコンの様子" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925552/fb7eef5c-e90b-052e-fd2f-590fbeb6bd94.png>


# 環境
- Raspberry Pi 4B / 4GB
- Raspbian: buster(Debian 10)
- Node v14.18.1
- npm 6.14.15

24時間運用するためにラズパイを使用します。今回は初期設定を飛ばして、Homebridgeのインストールから説明します。

# 前提知識
## HomeKitとは
Appleが開発しているIoTシステムのことです。Apple製品から利用可能で、HomeKit対応製品を`ホーム.app`や`Siri`から操作、管理できます。
オートメーションと組み合わせれば、自分で操作しなくても作動してくれます。

## Homebridgeとは
HomeKitに対応していない製品でもホームアプリから操作したい！という願いを叶えてくれるブリッジソフトウェアです。
HomeKitから非対応製品などにアクセスできるようにしてくれます。
node.jsで作られていて、Raspberry PiだけでなくあらゆるOSで動作します。
以前はCUIで設定していたのですが、WebGUIで操作可能なHomebridge UI Xが今年登場し、さらに便利になりました。
https://homebridge.io/

# Homebridgeをインストール
まずは各種パッケージを更新しておきます。
その後、Node.jsをインストール

```shell
# Node.jsをインストール(安定バージョンである16系か14系)
curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install -y nodejs
```
次に、Homebridgeとそれに関連するものをインストール

```shell
# Avahiのインストール
sudo apt-get install libavahi-compat-libdnssd-dev

# Homebridge本体とHomebridge Config UI X
sudo npm install -g --unsafe-perm homebridge homebridge-config-ui-x

# サービスパッケージ
sudo hb-service install --user homebridge
```
インストール後、`http://[ホストIP]:8581`にアクセスし、初期ユーザIDとパスワードである「admin」でログイン（管理画面から変更可）
すると以下のような管理画面が表示されます。
![homebridge2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925552/a224c87e-9d3d-020a-cf9d-b5b4f111731f.png)
あとはiPhoneのホームアプリから「アクセサリを追加」を選択し、QRコードを読み取ればオーケー
これでHomebridgeのインストールは完了です。

# プラグインのインストール
HomebridgeにはデバイスをHomeKit化するための様々なプラグインがあります。NatureRemoのHomeKit化は長いので後編でするとして、今回はTP-Linkのスマートプラグ「HS105」の操作及び部屋のデスクトップPCをリモートで起動、終了できるようにしてみました。
プラグインの導入は簡単。Webの管理画面から「プラグイン」をクリックし、目的のものを検索で見つけるだけです。

## HS105をHomeKit化
Homebridge Tplink Smarthomeを検索してインストールをクリック。
Web管理画面の「コンフィグ」からconfig.jsonを開き、platforms内に以下を追記、編集します。

```json
{
    "name": "TplinkSmarthome",
    "addCustomCharacteristics": true,
    "discoveryPort": "XXXXX",
    "broadcast": "192.168.0.255",
    "pollingInterval": 5,
    "deviceTypes": [
        "plug"
    ],
    "platform": "TplinkSmarthome"
}
```
なお、`discoveryPort`の値はUDPのポート番号です。値はなんでも良いのですが、ufwなどのファイアウォールで通信を遮断している場合は別途開放する必要があります。

あとはHomebridgeを再起動することで、スマートプラグをホームアプリから操作できるようになっているはずです。

## PCをリモートで起動
PCを外部から起動させるためにWake on Lanを利用します。ここで対象とするのはメインのデスクトップWindows機ですので、Windowsでの利用を前提で話を進めます。
とはいえBIOSやネットワークアダプタの設定をここに書いていると長くなっちゃうので、それについては割愛します。
現在、我が家のネットワークはこんな感じになっています。
![network1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/925552/7b7227f8-107d-05a0-71b6-cfe5b476636d.png)
ラズパイとPCがWifiと有線でそれぞれ繋がっていますが、完全にシャットダウンした状態(S5)から起動させるには、有線でマジックパケットをブロードキャストする必要があるようです。
https://docs.microsoft.com/en-us/windows/win32/power/system-power-states
なので、Homebridgeがeth0とwlan0の両方を認識できるようにconfig.jsonの`bridge`を編集します。

```json
"bridge": {
    "name": "Homebridge",
    "username": "XX:XX:XX:XX:XX:XX",
    "port": "XXXXX",
    "pin": "XXX-XX-XXX",
    "bind": [
        "eth0",
        "wlan0"
    ]
}
```
上記のように、`bind`を追加し、そこに認識させたいインタフェースを書きます。
次に、Homabridge WoLというプラグインをインストールします。インストールしたら、config.jsonの`accessories`セクション(なければ追加)に定義を書き加えます。

```json
{
    "name": "デスクトップ",
    "ip": "192.168.1.101",
    "pingInterval": 3,
    "pingsToChange": 2,
    "pingTimeout": 2,
    "pingCommandTimeout": 0,
    "mac": "XX:XX:XX:XX:XX:XX",
    "broadcastAddress": "192.168.1.255",
    "startCommandTimeout": 0,
    "wakeGraceTime": 30,
    "wakeCommandTimeout": 0,
    "shutdownCommand": "ssh win powershell.exe shutdown /s /t 30 /c \"Homeより通常の停止要求\"",
    "shutdownGraceTime": 45,
    "shutdownCommandTimeout": 0,
    "log": true,
    "logPinger": false,
    "debugLog": false,
    "returnEarly": true,
    "accessory": "NetworkDevice"
}
```
主要な設定項目は以下のような感じでしょうか

- `name` : ホームアプリで使用される名前
- `ip` : 対象のIPアドレス。pingを送信して起動状況を監視するために使用
- `pingInterval` : pingを送る間隔（秒）
- `pingToChange` : 対象の状態が切り替わったと判断するまでのping数
- `mac` : 対象のMACアドレス。必須
- `broadcastAddress` : マジックパケットのブロードキャスト先を指定
- `wakeGraceTime` : マジックパケットを送信してから対象が起動したと判断するまでの猶予時間（秒）
- `shutdownCommand` : 対象をシャットダウンさせるときに送信するコマンドを指定
- `shutdownGraceTime` : シャットダウンコマンドを送ってから対象が終了したと判断するまでの猶予時間（秒）
- `returnEarly` : 起動、終了の指示をSiriからした時に応答がタイムアウトしてしまう問題を軽減するオプション

上記の設定で、起動、終了、電源がついているかどうかの確認をホームアプリから行えるようになります。シャットダウンはsshでwindows機に接続し、powershellでシャットダウンコマンドを直接打ち込みます。私の環境ではssh接続した時にwslが起動するようになっているためこのようになっていますが、通常は`"ssh ユーザ名@ホストIPアドレス shutdown /s /t 30 /c \"コメント\""`みたいな感じにすれば動作します。

# 外出先からのアクセス
ここまででHomebridgeを使った基本的なデバイスのHomeKit化には成功しましたが、そもそもホームアプリが動作するのはお家の中、同一のネットワーク内にいる時だけです。外出先から操作できるようにするにはHomePodやAppleTV、ハブに設定したiPadが必要です。まあ、VPNサーバーとか立ててiPhoneから接続する方法でも可能だとは思いますが、我が家にはちょうどHomePod miniがあったので、それをハブに設定して使っています。

# 所感
今まで製品ごとに分かれていた操作アプリを1つにまとめることができ、PCの操作も可能ということで結構便利です。
Siriも柔軟に応答してくれますし、iPhoneだけでなく、AppleWatchやMacからも簡単に操作できるのでもう後戻りはできませんね（笑）

日本ではHomeKit対応製品はまだまだ少ない上、高価なので手が出しづらい...
そんなときはHomebridgeを使うことで、比較的簡単にスマートハウス、スマートルームが作れるのではないでしょうか。

肝心のNatureRemo miniの方は長くなりそうなので[後編](https://qiita.com/Gomatamago_/items/c11e63d19877268ee261)に分けました。