Raspberry PiとHomebridgeとIRKitを利用してiOS端末からエアコンを操作する

# 実現すること

* 自宅のエアコンのオンオフ操作および状態確認をiOSデバイスからできるようにする。
  * コントロールセンターから手動で
  * 「ホーム」アプリから手動で
  * 「ホーム」アプリからスケジュールを組んで自動で
  * Siriに音声入力で

参考にした記事
[Raspberry Pi に Homebridge をセットアップする ~ UQ Times 開発の記録](https://uqtimes.blogspot.jp/2017/01/raspberry-pi-homebridge.html)
手順自体は上記記事をほぼそのままなぞっているが、過程を自分なりにできる範囲で噛み砕いてみる。

## 使用するもの

* Raspberry Pi 3 Model B
  * OSはRaspbian Stretch
* 持ち歩くiPhone（またはiPad）
* 家に置きっぱなしにするiPad
* [IRKit](http://getirkit.com)

### Raspberry Pi

HomeKitアクセサリとして振る舞うサーバーを常時稼働させるために使用する。Linuxが動いていて常時稼働できるなら、なんでもいいだろう。

### 持ち歩くiPhone

リモコンに代わり操作の起点となる。

### 家に置きっぱなしのiPad

外出中もWANから操作や状態確認がしたい場合は必要。
（Apple TVでもよいが、持っていないので設定手順は書けない）

### IRKit

ネットワークリモコン。元々エアコンに付属していたリモコンの信号をこれが代わって送信することでエアコンを制御する。

今からだと後継機のNature Remoを使用することになる（？）

## Raspberry PiにHomebridgeをセットアップ

### Homebridgeとは

https://github.com/nfarina/homebridge

>Homebridgeは、iOS HomeKit APIをエミュレートするホームネットワーク上で実行できる軽量なNodeJSサーバーです。[Google翻訳]

これをRaspberry Pi上で稼働させ、HomeKitのアクセサリとして登録する。

### RaspbianにNode.jsをインストール

Node.jsは偶数が安定バージョンだそう。また7系ではHomebridgeが動かなかったという例も見受けられたので6系で。

```
$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$ sudo apt install -y nodejs
```

### Avahi headerのインストール

https://packages.debian.org/ja/sid/libavahi-compat-libdnssd-dev

>Avahi は、Multicast DNS Service Discovery を提供する LGPL 完全準拠のフレー ムワークです。これを使うと、ローカルネットワーク上で稼働しているサービスや ホストをプログラムから公開したり検索したりすることが個別の設定なしにできる ようになります。たとえば、ネットワークに接続してすぐに印刷したいプリンタ、 見たいファイル、話したい相手を見つけることができます。[Google翻訳]

Homebridge(Raspberry Pi)からIRKitを見つけられるようにするために必要だと思われる。あるいはiOSデバイスからPiを見つけられるようにするため？

```
$ sudo apt install libavahi-compat-libdnssd-dev
```

### Homebridgeのインストール

<!--
hap-nodejsはhomebridgeのpackage.jsonにdependenciesとして書いてるから明示不要では？
-->

```
$ sudo npm install -g --unsafe-perm homebridge hap-nodejs node-gyp
$ cd /usr/lib/node_modules/homebridge/
$ sudo npm install --unsafe-perm bignum
$ cd /usr/lib/node_modules/hap-nodejs/node_modules/mdns
$ sudo node-gyp BUILDTYPE=Release rebuild
```

一緒にインストールしているものは何か？詳細はあまりよくわかっていない。そもそも全部必要なのか？

https://github.com/KhaosT/HAP-NodeJS

>HAP-NodeJSは、HomeKitアクセサリサーバのNode.js実装です。[Google翻訳]

Homebridge単体でHomeKitアクセサリになれるわけではなく、これに依存しているということか？

https://github.com/nodejs/node-gyp

>node-gypは、Node.js用のネイティブアドオンモジュールをコンパイルするために、Node.jsで書かれたクロスプラットフォームのコマンドラインツールです。[Google翻訳]

https://github.com/justmoon/node-bignum

>OpenSSLを使用したNode.jsの任意の精度の積分演算。[Google翻訳]

### HomebridgeのIRKit用プラグインをインストール

https://github.com/senyoltw/homebridge-irkit

>IRKitをSiri(Homekit)で操作するやつ。オン/オフの切り替えが可能になります。

```
sudo npm -g install homebridge-irkit
```

### Homebridgeのデーモン化

GitHub Gistに雛形を公開してくれている人がいるので、それを使わせてもらいつつ少し編集も加える。

```
$ sudo curl -L -o /etc/default/homebridge https://gist.githubusercontent.com/johannrichard/0ad0de1feb6adb9eb61a/raw/1cf926e63e553c7cbfacf9970042c5ac876fadfa/homebridge
```

`/etc/default/homebridge`を編集する。
以下の行を削除またはコメントアウトし、
`HOMEBRIDGE_OPTS=-U /var/lib/homebridge`
以下の行を追加する。
`HOMEBRIDGE_OPTS=-U /var/homebridge`

```
$ sudo curl -L -o /etc/systemd/system/homebridge.service https://gist.githubusercontent.com/johannrichard/0ad0de1feb6adb9eb61a/raw/1cf926e63e553c7cbfacf9970042c5ac876fadfa/homebridge.service
$ sudo chmod 755 /etc/systemd/system/homebridge.service
```

`/etc/systemd/system/homebridge.service`を編集する。
以下の行を削除またはコメントアウトし、
`ExecStart=/usr/local/bin/homebridge $HOMEBRIDGE_OPTS`
以下の行を追加する。
`ExecStart=/usr/bin/homebridge $HOMEBRIDGE_OPTS`

Homebridge実行役のシステムユーザーを追加する。

```
$ sudo useradd --system homebridge
$ sudo mkdir /var/homebridge
$ sudo chown homebridge:homebridge /var/homebridge
$ sudo su homebridge -s /bin/bash
```

設定ファイルを編集する。
※後に、少なくとも我が家のエアコンでは**「暖房のオン」と「冷房のオン」では赤外線信号が異なる**ことに気が付き、「暖房」「冷房」をそれぞれ1つのアクセサリーとして登録した。

```
homebridge$ vi /var/homebridge/config.json
{
    "bridge": {
        "name": "Homebridge",
        "username": "XX:XX:XX:XX:XX:XX",
        "port": 51826,
        "pin": "[3桁の数]-[2桁の数]-[3桁の数]"
    },

    "accessories": [
        {
            "accessory": "IRKit",
            "name": "エアコン",
            "irkit_host": "IRKitのホスト名",
            "off_form": {エアコンをオフにする赤外線信号},
            "on_form": {エアコンをオンにする赤外線信号}
        }

    ]
}
homebridge$ exit
```

稼働させる。

```
$ sudo systemctl daemon-reload
$ sudo systemctl enable homebridge
$ sudo systemctl start homebridge
```

ちゃんと動いているか確認する。

```
$ sudo journalctl -f -u homebridge
```

## ホームのアクセサリとしてHomebridgeを追加

1. iOS端末で「ホーム」アプリを起動
2. 右上の「＋」から「アクセサリを追加」を選択
3. 「ホームに追加するアクセサリを選択」で「Homebridge」を選択
4. 設定ファイルに記述したPINを入力

「よく使う項目に含める」をオンにすることによりコントロールセンターからも操作可能になる（これがかなり便利）。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195900/8b598313-346b-300f-e8d2-c3605a1c6b96.png)

### ホームハブの設定

外出先などから（WANから）も利用するためにはホームハブの設定が必要になる。
古いiPadをホームハブとして利用する。

設定アプリ＞ホーム＞このiPadをホームハブとして使う、をオン

### オートメーションの設定

自動でオンオフさせることもできる。トリガーとして以下を利用可。

* 家に到着
* 家を出発
* 時刻（何時何分と明確に指定する以外に日の出、日の入を指定可）
* あるアクセサリがコントロールされたとき（連動させられる）

たとえば、冬のオフトゥン出られない問題対策として起床の少し前から部屋を温めておく、など。

~~### iOS11で不安定になる問題~~

~~iOS11に更新直後、コントロールセンターやホームアプリ上で「アップデート中」のまま状態が更新されなくなる症状が起きたり起きなかったりするようになった。アクセサリを一度削除して追加しなおすと直った（原因はよくわからない…）。~~