自宅IoTのため家にある電子機器をRaspberry Pi+Homebridge使ってSiriの音声認識で繋ぎまくってみた

f:id:karaage:20170210002411j:plain:w640

2017/09/05 参考サイト追加
2017/03/05 homebridgeを自動起動させる方法に関して追記・参考サイトの追加

自宅IoTに挑戦

 引越しを機に家庭内IoTに挑戦しようと思い立ちました。なんせ自宅IoT友の会の部員ですからね!

 というわけで、「家庭内IoT」とか「おうちハック」と名前が付く記事を見かけるとひたすらブクマし続ける日々を過ごしていました。いい加減、これだけ集めれば十分だろと思いやってみたら、案の定色々ハマってしまったところや、自分なりに気づくところがあったので一度まとめて記事にしてみます。

 今回、参考にしたサイトとか参考にしなかったサイトに関しては、本記事の一番最後にまとめています。

家庭内IoTをしてできたこと

 まずは、どんなことができるようになったかを紹介しようと思います。

f:id:karaage:20170210002652j:plain:w640
 暗くて、エアコンのついていない寒い書斎

 ここで、例えばぬくぬくしたお布団の中で、iPhoneのSiriたんに対して喋りかけます「書斎ON」

f:id:karaage:20170210002750j:plain:w640
 Siriタンが何やら反応してくれます

f:id:karaage:20170210002426j:plain:w640
 なんということでしょう!書斎の明かりがついて、エアコンが動作を始めました

 続いて、Siriたんに話しかけます「室温ON」

 BotがTwitter経由で室温を教えてくれました。

 まだ、寒いのでしばらく待ってもう一度話しかけます。

 だいぶあったかくなりましたね。

 これで、重い腰を上げてぬくぬくした布団からホカホカした書斎に移動ができます。

 と、まあこんな感じのことが可能になります。他にも例えば、外から帰ってきたとき、家に近づいたらSiriたん経由で部屋のエアコンを動かして家に帰るまでに適度な温度にしておく、といったようなことも可能になります。

 これ以降、このような仕組みをどうやって実現するかの説明とやってみて感じたこと等になります。例によってわからない人には宇宙語が続きますので興味ある方のみご覧下さい。

自宅IoTのセットアップ方法

 ここから自宅IoTのセットアップを説明していきます。

必要なハードウェア

 Raspberry Pi 3。今回はRaspberry Pi 3でやりましたが、Raspberry Pi2でも多分Raspberry Pi Zeroでもできると思います。必要な周辺機器やセットアップは以下記事を参照ください。

iPhone(iOS10以上が必要)

 iRMagician 赤外線送受信モジュールです。

VIR-USB赤外線学習リモコンセット(iRMagicianで認識できなかったリモコンのために使用)

 秋月電子のBME280モジュール AK-BME280

Apple TV(家の外から制御する場合に必要。無くてもOK)

Raspberry Piセットアップ

 まずは、Raspberry Piをセットアップします。例によって下記記事参照に基本的なセットアップを完了させてください。

 その後、以下コマンドで自宅IoTのために必要なライブラリをインストールしていきます。

$ sudo apt-get install libavahi-compat-libdnssd-dev
$ wget https://nodejs.org/dist/v4.3.2/node-v4.3.2-linux-armv6l.tar.gz 
$ tar -xvf node-v4.3.2-linux-armv6l.tar.gz 
$ cd node-v4.3.2-linux-armv6l
$ sudo cp -R * /usr/local/

 以下コマンドでインストールされていることを確認しましょう。以下のようにバージョン表示されればOKです。

$ node -v
v4.3.2
$ npm -v
2.14.12

 ここでインストールしたのは、この後インストールするhomebridgeに必要なnode.jsというものです。気になる方はnode.jsで調べてみるとよいかと思いますが、特に気にしなくてもOKです。私も気にしてないので、node.jsが何か全然分かっていません。

homebridge/homebridge-cmd インストール

 続いて、homebridgeという、Raspberry PiとAppleの「Home Kit」というネット経由で家電を制御する仕組みとRaspberry Piを橋渡しするソフトをインストールします。必要なライブラリがインストールされていれば、以下コマンドでインストールできます。

$ sudo npm install -g homebridge

 ついでに、homebridgeでコマンドラインを実行させるhomebridge-cmdプラグインをインストールします

$ sudo npm install homebridge-cmd -g

 これで、Raspberry PiにHomebridgeがインストールされました。

irMagician

 続いて、irMagicianという赤外線送受信モジュールを使います。以前、リモコンを使ったシンセサイザを作ったりしました。

 Raspberry Piで以下コマンド実行して必要なライブラリを事前にインストールしてください。私の場合は既にインストール済みでした。

$ sudo apt-get install python-pip
$ sudo pip install pyserial

 以下でirMagician用のクライアントソフトをダウンロード

$ git clone https://github.com/netbuffalo/irmcli.git

これで準備ができたので、リモコンを学習させます。Raspberry PiとIRMagicianを接続して、以下のようにライトのリモコンをIRMagicianに向けます。

f:id:karaage:20170210002411j:plain:w640

 この状態で以下のコマンドをうった直後に、ライトのリモコンをオンにします。

$ sudo python irmcli.py -c
Capturing IR...
... 88

 上記のように表示されたらOK

 続いて、動作確認。irMagicianをライトに向けて以下のコマンドを入力します。

$ sudo python irmcli.py -p
Playing IR...
... Done !

 これでライトが点灯すればOK

 以下コマンドで、学習させたリモコンの信号をファイルに書き出します。

$ sudo python irmcli.py -s -f light_on.json
Saving IR data to light_on.json ...
Done !

 ファイルに書き出しておけば、以下のようにファイルを読み込むことで好きなリモコンの信号を呼び出します。

$ sudo python irmcli.py -p -f light_on.json
Playing IR with light_on.json ...
... Done !

 同じ要領で、制御したい家電(エアコン、テレビ等リモコンで制御できる機器)を好きなだけ学習させてファイルに書き出しておきましょう。

homebridge設定と起動

 ここでいよいよhomebridgeを起動して、iPhoneから家電を制御してみようと思います。設定ファイルを作成するため、Raspberry Piのハードウェアアドレスを調べます。以下コマンドを実行します。

$ ifconfig

 ずらずらずらと表示されますが、ハードウェアアドレスのところをメモってください

wlan0     Link encap:イーサネット  ハードウェアアドレス b8:27:eb:ed:6b:08 
          inetアドレス:192.168.10.105 ブロードキャスト:192.168.10.255  マスク:255.255.255.0

 以下の設定ファイルのusernameのところに、上記のハードウェアアドレスを入力します。また、accessaryのところには、先ほどのリモコン制御に使ったコマンドを入力します。

{
    "bridge": {
        "name": "Raspi3_Jules",
        "username": "B8:27:EB:ED:6B:08",
        "port": 51821,
        "pin": "031-45-155"
    },

    "description": "Living Room",

    "accessories": [
       {
           "accessory": "CMD",
           "name": "照明",
           "on_cmd": "sudo python /home/pi/GitHub/irmcli/irmcli.py -p -f /home/pi/GitHub/irmcli/light_on.json",
           "off_cmd": "sudo python /home/pi/GitHub/irmcli/irmcli.py -p -f /home/pi/GitHub/irmcli/light_on_mid.json"
       }
   ]
 }

 続いて、homebridgeを起動します。homebridgeというコマンドを入力すると、以下のようにずらずら表示されます。

$ 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>
[2017-02-08 23:58:37] Loaded plugin: homebridge-cmd
[2017-02-08 23:58:37] Registering accessory 'homebridge-cmd.CMD'
[2017-02-08 23:58:37] ---
[2017-02-08 23:58:37] Loaded config.json with 1 accessories and 0 platforms.
[2017-02-08 23:58:37] ---
[2017-02-08 23:58:37] Loading 1 accessories...
[2017-02-08 23:58:37] [照明] Initializing CMD accessory...
Scan this code with your HomeKit App on your iOS device to pair with Homebridge:
                       
    ┌────────────┐     
    │ 031-45-155 │     
    └────────────┘     
                       
[2017-02-08 23:58:37] Homebridge is running on port 51821.

 Raspberry Piはこの状態でOK。ちなみにここらへんの設定は、ほぼ参考サイトのままです。

homebridge自動起動設定

 Raspberry Piを起動するたびにhomebridgeを起動するのも面倒なので、電源を入れると自動で起動してくれると便利ですね。いくつかやり方があるみたいですが、私は一番簡単な /etc/rc.localを使う方法にしました。

 まずは、以下コマンドでScreenをインストールします(既にインストールされているかもです)

$ sudo apt-get update
$ sudo apt-get install screen

 あとは/etc/rc.localをエディタで開きましょう。下記はvimエディタで開く例です

$ sudo vim /etc/rc.local

 /etc/rc.localexit 0という行の直前に以下を追加すればOKです。

su -c "screen -dmS homebridge homebridge" -s /bin/sh pi

 Raspberry Piの自動起動の仕組み自体は、以下の記事を参考にして見てください。 http://hendigi.karaage.xyz/2016/11/auto-boot/

 また、Homebridgeを自動起動させる他の方法に関しては、以下公式情報を参照しましょう(英語ページになります)。

Running Homebridge on a Raspberry Pi · homebridge/homebridge Wiki · GitHub

Siriと連携

 ここから、いよいよSiriとの連携です。iPhoneでホームアプリを起動します。もしなければ、おそらくiOSのバージョンが古いので、iOS10以上にアップデートしてください。

 起動すると、以下のようにRaspberry Piが見つかります。 f:id:karaage:20170208235501p:plain:w480

 タップすると次のような画面が表示されるので、次へをタップ f:id:karaage:20170208235502p:plain:w480

 次のように表示されたら、完了をタップ f:id:karaage:20170208235503p:plain:w480

 ホームアプリに照明が無事追加されたらOK f:id:karaage:20170208235504p:plain:w480

 ここで、Siriに「照明をオン」もしくは「照明をオフ」と話しかける f:id:karaage:20170208235505p:plain:w480

 正しく連携できていれば、これで照明をSiri経由で制御できるようになります。

 ここで使う「照明」といった機器の名前、参考にしたサイトによっては決められたものしかダメという情報もあったのですが、homebridgeの設定ファイルのnameのところに好きな名前をつければ、私が試した限りでは日本語含むどんな名前でもいけそうでした。ちなみに、私が試したのは「書斎」「室温」という名前をつけて、「書斎をオン」としたら書斎のエアコンと電気をオンすることができました。

VIR-USB赤外線学習リモコンセット

 irMagicianで色々な機器を学習させていたのですが、日立のエアコンが学習できませんでした。ネットで調べたら、日立のエアコンは信号が長く学習が難しいタイプのようです。絶望しかけたのですが、家にたまたま、OMMF2016で購入したVIR-USB赤外線学習リモコンセットが転がっていたので試してみることにしました。基本的には、一般販売はしていないようです。説明書は以下になります。

VIR説明書pdf

f:id:karaage:20170211154943j:plain:w640
 こんなキットで販売していました

f:id:karaage:20170211155023j:plain:w640
 自分で半田付けする必要があります。スイッチが1個足りなかったので手持ちのやつを使いました

f:id:karaage:20170211181237j:plain:w640
 完成!

 ソフトウェアのダウンロードは以下からできます。今回は、Raspberry Pi用のソフトをダウンロード

VIR-USB 接続赤外線学習リモコン - PukiWiki

 ダウンロードしたファイルを、Raspberry Piに移動したら、以下コマンドを実行して、ソフトを使えるようにしましょう。

$ unzip V-IR-raspi-27.zip 
$ chmod 755 V-IR

 学習したリモコン信号のファイルへの記録は以下

$ sudo ./V-IR R living_aricon_on.ir

 記録したファイルを読み出すには以下

$ sudo ./V-IR S living_aricon_on.ir

 このモジュールだと、難関だった日立のエアコンでも難なく学習することができました!あとは、iRMagicianと同様の要領でHomebridgeを使ってSiri経由からリモコンを操作できるようになります。

 気をつけることとしては、連続して2つのコマンド実行する(例えば、エアコンをオンした直後にライトを点けようとする)と、デバイスエラーが発生することです。1秒程度間にsleepを挟んでやることで回避しました。

VIR-USBのソフトのライセンスに関して

 VIR-USBのソフトのライセンスが気になっていたので、作者さんとtwitterでやりとりしたところ、なんとソフトの再配布はOKとのことです。これで更に便利に使えますね!早速自分のGitHubのリポジトリにアップしてしまいました。

室内温度・湿度を取得してtwitter経由で通知

 続いて、Siri経由で室内の温度・湿度・気圧を取得してtwitter経由で通知できるようにします。といってもやったことは、ほぼ以下のままです。

 こんな感じになりました。 f:id:karaage:20170212093219j:plain:w640

 記事を参考に、tweet_sensor_data.pyというコマンドで温度・湿度をtweetできるようにしたら、homebridgeの設定ファイルに以下のようにアクセサリを追加するだけでOKです。

"accessory": "CMD",
"name": "室内温度",
"on_cmd": "python ~/home-iot/tweet_sensor_data.py" ,
"off_cmd": "python ~/home-iot/tweet_sensor_data.py"

 これで「室内温度オン」とSiriたんに言うと、室内温度・湿度・気圧をbotがツイートしてくれます。ちなみに「室内温度オフ」とSiriたんに言っても同じようにツイートしてくれます。これはhomebridgeに基本オンとオフのコマンドしかないため、そのような仕様にしています。

 同様の要領で、「室内写真オン」で部屋の写真を撮影してtweetするといったことも簡単にできます。

 今回はtwitterで通知しますが、あまり公開したくないプライベートな内容もあると思いますので、その場合はLINEやSlackなどで通知させるようにすればよいかなと思います(やり方は検索すれば色々出てくると思います)。サービスの連携が面倒くさければ、単純にメールを送るとかでもよいかもしれませんね。

Apple TVを使って家の外から機器操作

 すみません、実はこれはまだ試せていません。家に第三世代の使ってないApple TVがあるのでいずれやってみる予定です。以下を参照にすればできる(はずです!)

Raspberry PiとSiriで家電の音声制御 おまけ Apple TVを使った宅外制御 | MUDAなことをしよう。

 また、試せたら追記します。これで家の外からでもRaspberry Piにつながった機器やセンサの操作が可能になる(はず!)

気づいたこと・問題点

 やはり自分で実際にやってみると気づいたこととか問題点が色々ありました。

  • Siriの音声認識での操作はわりと便利
  • 学習リモコンは使用するモジュールによってうまく学習できない場合もあるから注意
  • 複数機器制御するとき、モジュールの置く位置と電源の引き回しが悩ましい

Siriの音声認識での操作はわりと便利

 iPhoneのSiriは、天気予報とかでたまに使ったりしていたのですが、デバイスが操作できると結構便利ですね。今後音声認識での機器操作はトレンドになってくるかもしれませんね。CEREVOの社長さんによるとAmazon Alexaが来そうとのことですが、日本は取り残されそうな感じですね。

学習リモコンは使用するモジュールによってうまく学習できない場合もあるから注意

 学習リモコン学習できなかったときは、かなりテンション下がって挫折しそうになりました。ネットで情報多いのはIRKitというデバイスを使う例です。

 このデバイスの方式は、ほとんどのリモコンを学習できるようなので良さそうです。きちんとパッケージングされているのも使いやすくてよいですね。Raspberry Pi+Homebridgeにも対応しているので、Siri連携も簡単にできる(ようです)。私は、手持ちにデバイスがあったので今回は購入しませんでしたが、0からやるならこちらの方がよいかなと思います。

複数機器制御するとき、モジュールの置く位置と電源の引き回しが悩ましい

 つらいなと感じたのは、Raspberry Piでリモコンを制御するときの電源の引き回しです。複数の機器を制御する場合、リモコンの指向性の関係で置ける場所が制限されてしまいます(理想的には部屋の真ん中になる)。家電機器の方がHomekitなり、Amazon Alexaなりのプラットフォームに対応してくれれば一番良いのですが、そうそう家電を買い換えるものでもないですし、日本だと機器が対応するのに何年かかるやら…なので、当分(10年くらい?)は、こうやってハックするしかないのかなと思っています。

 単三電池2個くらいで2年くらいもつIRKitみたいなデバイスで、小さくて安いやつがあれば最高なんだけどと思ったり。BLEとか使えば技術的にはできそうな気はしますが…悩ましいです。

まとめ

 というわけで何番煎じか分かりませんが、自宅IoTやってみました。Raspberry Piの設定から含めて1から説明して、センサ情報の取得までやっている記事はそこまでないようだったので、多少は意味ある記事になった(と思いたいです)。

 今回作成したもの(といっても学習したデータや、設定ファイルがほとんどですが)は、GitHubにアップします。

 リモコンの学習データは、それぞれの家庭の機器に合わせて作成し直さないと意味ないと思いますが、設定ファイルに関しては参考になることもあるのではないかなと思います。こうやって自分の家庭に合わせて1家庭に1リポジトリあると便利そうですね。

 で、実際のところ使っているかというと、前述の電源をどう引き回すかの悩みなどがあり、実は今のところ使っていません。正直やることに対してセットアップも大変ですし、自分でスイッチ押すかタイマーかければ良いじゃんという話もあります(それを言ってしまうと身も蓋もないですが)。

 ただ、Siri経由でRaspberry Piをどこからでも操作できるRaspberry Pi+Homebridgeの組み合わせは色々できそうな可能性を感じたので、何か思いついたら家電制御に限らず色々試していきたいなと思います。

リンク:Raspberry Pi 3
リンク:irMagician
リンク:BME280使用センサモジュール
リンク:IRKit

参考リンク

node.js関連

Installing Node.js on a Raspberry Pi 3

Installing Node.js v4.0.0 on a Raspberry Pi (All Models)

irMagician単体

irMagicianで家電制御に挑戦してみた | がじノート | gaji's notebook, gadget & PC & Photo

irMagician + Raspberry Pi + homebridge

irMagician + Raspberry Pi + HomeKitで家電を遠隔&音声制御する - YSNHatenaBlog

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

IRKit + Raspberry Pi + homebridge

Siri - Raspberry Pi - iRKit でエアコン操作 - rochefort's blog

Siri + IRKit + Homebridge でエアコンを操作すると快適 - rochefort's blog

https://datahotel.io/archives/725

homebridge

Running Homebridge on a Raspberry Pi · homebridge/homebridge Wiki · GitHub

Raspberry Piで先取りHomekit Vol.3 | ウダ2Blog

おうちハック

おうちハックはどこから来て、どこへ行くのか - yumulog

おうちハック Advent Calendar 2016 - Qiita

子どもがいる家庭で使うRaspberryPi&Slack | もやし工房

おうちで使っているhomebridgeプラグイン一覧 - ワタナベ書店

[おうちハック]Amazon Dash Button をお風呂場で使う呼び出しボタンとして使う - たるこすの日記

GOROmanさんのおうちハック #おうちハック - Togetter

ESPrIR

ESPr IR 赤外線リモコンでエアコンの電源を操作してみました。 – スイッチサイエンス マガジン