iOS10「ホーム」アプリと「Raspberry Pi + irMagician」でお手軽家電操作。

iOS10の「ホーム」アプリを使って家電を操作出来る様にしてみました。Node.js(一部Python)でサーバーを立てるだけで外出先からエアコンを点けたり消したり出来る様になりましたのでまとめてみます。

![home.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/51ff4d77-3641-466e-3d35-5c70dd0f2596.gif)

![IMG_8513.jpg](https://qiita-image-store.s3.amazonaws.com/0/47128/6f621f95-f4bd-09c4-1e0c-9d56eb854c62.jpeg)

## 環境

- Raspberry Pi3 と Raspberry Pi2
 - raspbian-jessie(4.4)
 - Node.js(6.6.0)
 - Python(2.7.9)
 - git(2.2.2)
- irMagician
 - 大宮技研の赤外線リモコンシステム
 - Swich Scienceで購入
- Appleの機器
 - iPhone6S(iOS10.0.1)
 - AppleTV第３世代(7.2.1)

## 仕組み

Appleが推奨するHomekit対応のホームオートメション家電（Philips Hueなど）をiOSの「ホーム」アプリに登録することで、同じWifi内のiOS端末から電源のオンオフなどを操作することができる様になります。

更に、AppleTVやiPadのiCloudアカウントを利用して外部の回線からそれらの家電を操作することが出来ます。

Homekitを利用してそれらは開発されているのですが、Node.jsを利用したAPIライブラリが公開されています。

[homebridge - GitHub](https://github.com/nfarina/homebridge)

これを利用してRaspberry PiにNode.jsでサーバーを立て、iOSからのリクエストに対して実行処理を行うことが出来ます。

「irKit」などの学習リモコンに実効処理を行う際はHTTPリクエストが必要になりますが、今回はRaspberry Piに接続した赤外線リモコンシステム「irMagician」を利用するのでコマンドラインから直接家電を操作することが出来ます。

「irMagician」の接続が出来れば記述はシンプルに行えます。homebridgeからコマンドラインを操作するプラグインを作ってくれた方がいますのでそちらを使わせていただきます。

[homebridge-cmd - GitHub](https://github.com/senyoltw/homebridge-cmd)

では早速取り掛かります。

## irMagician

登録したいリモコンの赤外線をスキャンして、その赤外線データをjsonデータに書き出すことが出来ます。コマンドラインからjsonデータを照射することができる様になります。

[irmcli - GitHub](https://github.com/netbuffalo/irmcli)

こちらを利用します。RaspberryPiのデフォルトで入っている2系で動作します。適当なディレクトリを作り、以下をインストール。

```bash:ssh
$ git clone https://github.com/netbuffalo/irmcli.git
```

必要なライブラリをインストールします。

```bash:ssh
 $ sudo apt-get install python-pip
 $ sudo pip install pyserial
```

これでスキャン・照射が可能になります。

![IMG_8488 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/47128/b689be05-df08-a437-6ebc-fa68a20f777d.jpeg)

これはおもちゃのR２D２のリモコンをスキャンしているところなのですが、コマンドラインで以下の様にしてスキャンします。（`irmcli.py`を`irm.py`へ名前を変更しています。）

```bash:ssh
 $ sudo python irm.py -c
```

これをjsonファイルとして書き出します。

```bash:ssh
 $ sudo python irm.py -s -f r2d2_on.json
```

こんな感じでjsonファイルが生成されます。

```json:r2d2_on.json
{"postscale": 100, "freq": 38, "data": [51, 1, 29, 31, 6, 9, 5, 9, 6, 9, 6, 16, 6, 8, 6, 16, 168, 31, 6, 9, 5, 8, 5, 9, 6, 16, 5, 9, 5, 16, 194, 32, 6, 9, 6, 9, 6, 9, 6, 16, 6, 9, 6, 16, 168, 31, 5, 9, 6, 9, 6, 9, 6, 16, 6, 9, 6, 16, 194, 32, 5, 9, 5, 9, 6, 9, 5, 16, 5, 8, 6, 16, 167, 32, 5, 9, 5, 9, 5, 9, 6, 16, 6, 9, 5, 16, 194, 32, 5, 9, 5, 9, 5, 9, 5, 16, 5, 9, 6, 16, 168, 31, 5, 9, 6, 9, 6, 9, 6, 16, 6, 9, 5, 16, 193, 31, 6, 9, 5, 9, 6, 9, 5, 16, 6, 8, 6, 16, 168, 31, 6, 9, 6, 8, 6, 8, 6, 16, 6, 8, 6, 16, 192, 31, 6, 8, 6, 8, 6, 8, 6, 15, 6, 8, 6, 16, 168, 30, 6, 8, 6, 8, 6, 8, 7, 16, 6, 8, 6, 16, 193, 31, 6, 8, 6, 8, 6, 8, 6, 16, 6, 8, 6, 15, 169, 30, 6, 8, 6, 8, 6, 8, 6, 16, 6, 8, 6, 16, 194, 31, 6, 8, 6, 8, 6, 8, 7, 15, 6, 8, 6, 16, 169, 29, 7, 8, 7, 7, 7, 8, 6, 16, 6, 8, 6, 15, 154, 31, 6, 8, 6, 8, 6, 15, 6, 15, 6, 16, 7, 15, 168, 30, 7, 7, 7, 7, 7, 15, 7, 15, 7, 16, 6, 15, 196, 29, 7, 7, 7, 7, 6, 16, 6, 15, 7, 15, 6, 16, 169, 30, 7, 8, 6, 8, 6, 16, 6, 15, 7, 15, 6, 16], "format": "raw"}
```
このファイルはこの様に実行します。

```bash:ssh
 $ sudo python irm.py -p -f r2d2_on.json
```
必要なリモコンな情報はこの段階でまとめてjsonファイルにしてしまいます。

さて、このコマンドラインを「ホーム」経由で実行できる様にします。

## homebridge

必要なライブラリを入れます。

```bash:ssh
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
```

```bash:ssh
$ sudo apt-get install libavahi-compat-libdnssd-dev screen
```

グローバル領域にインストール後、実行します。

```bash:ssh
$ sudo npm install -g homebridge
```
```bash:ssh
$ homebridge
```
ここでは設定ファイル`config.json`が設定されていませんが、実行することで、`.homebridge`フォルダが生成されるので、ここに`config.json`を設置します。

## homebridge-cmd

`config.json`を設置する前にコマンドラインを実行させるプラグインをインストールします。

```bash:ssh
$ sudo npm install homebridge-cmd -g
```

プラグインもグローバル領域にインストールします。プラグインのサンプルを基に設定をしていきます。

`username`でIPアドレスを設定するので、`ifconfig`で調べておくと良いでしょう。

```json:.homebridge/config.json
{
    "bridge": {
        "name": "Raspi3_Jules",
        "username": "B8:27:EB:9C:0D:20",
        "port": 51821,
        "pin": "031-45-155"
    },

    "description": "papa's Room",

    "accessories": [
       {
           "accessory": "CMD",
           "name": "電気",
           "on_cmd": "sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/stand_on.json && sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/light_on.json",
           "off_cmd": "sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/stand_off.json && sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/light_off.json"
       },
       {
           "accessory": "CMD",
           "name": "ドロイド",
           "on_cmd": "sudo mpg321 /home/pi/irm/sounds/r2d2_1.mp3 && sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/r2d2_on.json",
           "off_cmd": "sudo mpg321 /home/pi/irm/sounds/r2d2_2.mp3 && sudo python /home/pi/irm/irm.py -p -f /home/pi/irm/r2d2_off.json"
       }
   ]
 }
```
テンプレートに沿って設定すれば良いのですが、ポイントがいくつかあります。`bridge`にある`username`は上述のようにIPアドレスを入力します。その他は任意で入力すれば良いでしょう。

`accessories`の中にある、`accessory`のみ注意が必要です。プラグイン毎に指定するワードが異なります。（ここでは`CMD`）

Node.jsの`child_process`を利用するのでパイプでコマンドをつなげることも可能です。「ホーム」側でアクセサリのグループ化は行えるのですが、一緒に実行したいこと（ここではR2D２のおもちゃを動かすのと音声の再生をパイプでつないでいます）はこの時点でまとめることも可能です。

赤外線受信のタイミングによってはエラーになることもあるので、パイプを使って、時間差を考えて処理をするのもアリだと思います。（ここでは時間の掛かる電気スタンドを先に、照明を後に点灯させています。）

実行後こんな表示がされれば成功です。

```bsah:ssh
$ homebridge
*** WARNING *** The program 'node' uses the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node>
*** WARNING *** The program 'node' called 'DNSServiceRegister()' which is not supported (or only supported partially) in the Apple Bonjour compatibility layer of Avahi.
*** WARNING *** Please fix your application to use the native API of Avahi!
*** WARNING *** For more information see <http://0pointer.de/avahi-compat?s=libdns_sd&e=node&f=DNSServiceRegister>
[9/19/2016, 12:09:20 AM] Loaded plugin: homebridge-cmd
[9/19/2016, 12:09:20 AM] Registering accessory 'homebridge-cmd.CMD'
[9/19/2016, 12:09:20 AM] ---
[9/19/2016, 12:09:20 AM] Loaded config.json with 2 accessories and 0 platforms.
[9/19/2016, 12:09:20 AM] ---
[9/19/2016, 12:09:20 AM] Loading 2 accessories...
[9/19/2016, 12:09:20 AM] [電気] Initializing CMD accessory...
[9/19/2016, 12:09:20 AM] [ドロイド] Initializing CMD accessory...
Scan this code with your HomeKit App on your iOS device to pair with Homebridge:
                       
    ┌────────────┐     
    │ 031-45-155 │     
    └────────────┘     
                       
[9/19/2016, 12:09:20 AM] Homebridge is running on port 51827.
```
iOS側でアクセサリを追加するとこんな画面になると思います。

![IMG_8516 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/47128/e69b1857-bc12-25ed-0a70-9c007a7688c8.jpeg)


これで成功です。

homebridgeのデーモン化はNode.jsのライブラリ`PM2`を利用しました。

## まとめ

ラズパイを２台づつ用意して、１台は居間に・もう一台は自分の部屋に設置してみました。

自室は4畳半ほどの狭い部屋なので赤外線が部屋じゅうに届きますが、居間はテレビ・エアコン・照明全部に赤外線を当てようとすると工夫が必要ですね。（部屋のど真ん中にラズパイを置く羽目になる）

意外と照射角は狭く、距離も短いです。（3m位かな）

この冬にはirKitの後継機種が発売だそうです。温湿度計と連動して操作ができるみたいなんで、湿度に合わせて加湿器をオンオフさせたり出来ると便利だな。と思います。