Google Home Miniでの家電コントロールとiPhoneの呼び出し

homebridgeとIRKitの組み合わせ、Philips Hue、Koogeekのおかげで、多くの家電をiPhoneでコントロールできるようになりました。
操作はほぼホームアプリを使用しているのでさほど気にはならなかったのですが、私の滑舌の悪さでしょうか、音声コントロールをしようとするとSiriが反応してくれないこともままあり、音声コントロールに不便さを感じることがありました。
試しにGoogle Home Miniを導入してみると、聞き取りの間違いもあまりなく、音声コントロールが非常に快適になりましたので、今回はその話題を取り上げてみたいと思います。


※IRKitは生産が終了していて、現在はNature Remoという温湿度センサーが搭載された機能増強版が発売されています。Nature Remoだと、IFTTTとの連携なしでGoogle Home Miniから赤外線リモコン家電の音声コントロールが可能になるとのこと。

Nature Remo

Nature Remo

1.Google Home Miniでできるようにしたこと

スマートスピーカー元年とも言われる2017年、発売されて一ヶ月後にGoogle Home Miniを購入しました。
当初はHueとの連携のみしていましたが、IFTTTを使用することで、IRKitと連携できることがわかりました。

https://men-bou.net/googlehome_irkit_ifttt/

また、iPhoneが見つからないときに、Google Home MiniからiPhoneを呼び出せることもわかりました。

http://defmementomori.hateblo.jp/entry/2017/12/18/005729

これらのサイトを参考に、IFTTTとの連携によって下記をGoogle Home Miniで実行できるようにしています。

  • 暖房のON/OFF
  • エアコンのON/OFF
  • ドライのON/OFF
  • デスクライトのON/OFF
  • プロジェクターのON/OFF
  • 室温を25度に上げる
  • iPhoneを呼び出す

2.IRKitとの連携

まずはIRKitとの連携についてです。

clientkeyとdeviceidの取得

上記サイトに従い、IRKitの公式サイトの POST /keys と POST /1/keys の項目にある通りに clientkey と deviceid を取得します。
■IRKit公式サイト
http://getirkit.com/

赤外線情報を取得

こちらも公式サイトに従い、IRKitに赤外線リモコンを向け、リモコンのボタンを押し、 GET /messages の項目に従って赤外線情報を取得します。
■参考
http://yorino.hatenablog.com/entry/2017/09/02/180440
「2.IRKitのセットアップと赤外線情報の取得」

既にhomebridgeにIRKitで取得した赤外線情報が実装されている場合は、その情報を流用できますので、新たに取得する必要はありません。

IFTTTの設定

iPhoneでIFTTTを起動し、[My Applets]の右上にある+をタップ、[+this]には Google Assistant を選択し、[Say a simple phrase]をタップします。
[What do you want say?]には「暖房をつけて」など、Google Home Miniに聞かせる言葉を入れます。
別の言い方を設定する場合はその下のoptionalにも入力します。
[What do you want the Assistant to say in response?]にはGoogle Home Miniに言わせたい回答を入れ、[Language]は Japanese を選択します。

[Next]をタップして最初の画面に戻り、[+that]には Webhooks を選択します。

Webhooksの画面では下記のように入力/選択します。

  • URL: https://api.getirkit.com/1/messages
  • Method: POST
  • Content Type: text/plain
  • Body: clientkey=取得したクライアントキー&deviceid=取得したデバイスキー&message={"format": "raw","freq": 38,"data": [(赤外線情報中略)]}

[Next]をタップし、次の画面でtitleを編集して[Finish]をタップして終了です。
これをON/OFF一組で作成していきます。

稼働テスト

IFTTTの設定が完了したら、テストを行います。
Google Home Miniに向かって「オーケーグーグル、暖房をつけて」など、登録した言葉で指示して、実際に動作すればテスト終了です。

3.Google Home Miniを使ってiPhoneを呼び出す

たまにiPhoneをどこに置いたかわからなくなるときがあります。そんなときには、いつも2台あるどちらかのiPhoneiPadの「iPhoneを探す」を使って音を鳴らしていましたが、Google Home Miniに「iPhoneを探して」と言って鳴らしてもらう方が便利です。
方法は、IRKitとの連携と同じく、IFTTTを使用します。

IFTTTの設定

iPhoneでIFTTTを起動し、[My Applets]の右上にある+をタップ、[+this]には Google Assistant を選択し、[Say a simple phrase]をタップします。
[What do you want say?]には「アイフォンを探して」などとしておきます。
※私の環境では「iPhoneを探して」だとうまくいきませんでした。

「アイフォンを鳴らして」など、別の言い方を設定する場合はその下のoptionalにも入力します。
[What do you want the Assistant to say in response?]には「携帯に電話をかけます」など、Google Home Miniに言わせたい回答を入れ、[Language]は Japanese を選択します。

[Next]をタップして最初の画面に戻り、[+that]には VoIP Calls を選択します。

VoIP Callsの画面が表示されたら[Voice message]には「by Google Home」など、Google Home Miniからの呼び出しを受けたときに流れるメッセージを入力します。
(日本語も可)

稼働テスト

IFTTTの設定が完了したら、テストを行います。
Google Home Miniに向かって「オーケーグーグル、アイフォンを探して」など、登録した言葉で指示して、実際に動作すればテスト終了です。
※同じIFTTTアカウントでログインしているiPhoneが複数ある場合は、同時に呼び出されます。

4.最後に

寝る前や朝などは音声で家電コントロールできてとても便利に感じています。
ただ、IRKitを使った家電コントロールの場合、Google Home Miniを使って行った家電コントロールの状態はiPhoneのホームアプリに連携されないので、エアコンはついているけど、ホームアプリではOFFの表示になっている、ということが当然ありえます。
※Hueは連携します。
それを除けば、使用感もよく、快適な生活を送ることができていると言えます。

homebridgeがネットワークに接続できない時に自動でリブート

前回の記事では、homebridgeサーバを別のサーバからノード監視し、ノードダウンしたらLINEで知らせてくれるようにしました。
今回はhomebridge自体がデフォルトゲートウェイに通信できなくなったとき、自動的にリブートし、起動したことをLINEで通知してくれるようにしました。そのときの記録です。

参考サイトは前回と同様にこちらと
www.tapun.net

下記になります。
www.asahi-net.or.jp

1.概要

今回の要件を満たすために2つのスクリプトを用意しました。

No. スクリプト 用途 設置場所 自動実行の方法
1 nodedownreboot.sh homebridgeサーバからデフォルトゲートウェイpingしたときに応答しなかった≒ネットワークから切断されていたらリブートを行う /usr/local/bin/ crontab ※10分に1回実行
2 notify-reboot.sh homebridgeサーバが起動したときにLINEで通知する /usr/local/bin/ systemd ※起動時に1回だけ実行

2.スクリプトの準備

2つのスクリプトをそれぞれ準備します。

$ sudo vim /usr/local/bin/nodedownreboot.sh
#!/bin/bash

NUM01=3
IPLIST="デフォルトゲートウェイのIPアドレス"

### PING check
for IPL in ${IPLIST}
do
   ping ${IPL} -c ${NUM01}
   if [ $? -eq 1 ];then
      if [ -e /tmp/pingfile${IPL}.tmp ];then
         echo "TMP file already exsists"
      else
         touch /tmp/pingfile${IPL}.tmp
         sudo shutdown -r now
      fi
   else
      rm -f /tmp/pingfile${IPL}.tmp
   fi
done

exit 0
$ sudo vim /usr/local/bin/notify-reboot.sh
#!/bin/bash

sleep 45
curl -XPOST -H 'Authorization: Bearer LINEのトークンを記入' -F 'message=通知メッセージを記入' https://notify-api.line.me/api/notify
$ sudo chmod 744 /usr/local/bin/nodedownreboot.sh
$ sudo chmod 744 /usr/local/bin/notify-reboot.sh

3.自動実行の設定

スクリプトを作成したところで、自動起動の設定を行います。
まずは、nodedownreboot.sh を crontab に登録し、定期的に起動するように設定します。

$ sudo crontab -e

スクリプトに含まれる ping を実行する為にroot権限が必要となる為、sudo をつけて crontab を起動します。
最終行に下記を記述し、10分に1回スクリプトを実行するように設定します。

*/10 * * * * nodedownreboot.sh

次に notify-reboot.sh を systemd に登録し、homebridgeサーバの起動時に1回だけ実行するようにします。
.serviceのファイルを下記のように作成します。

$ sudo vim /etc/systemd/system/notify-reboot.service
[Unit]
Description = notify reboot

[Service]
Type=simple
ExecStart=/usr/local/bin/notify-reboot.sh

[Install]
WantedBy=multi-user.target

作成が完了したら、systemd への登録と enable、 start を行います。

$ sudo systemctl daemon-reload
$ sudo systemctl enable notify-reboot.service
$ sudo systemctl start notify-reboot.service

enableになっていることを確認します。

$ sudo systemctl status notify-reboot.service
● notify-reboot.service - notify reboot
   Loaded: loaded (/etc/systemd/system/notify-reboot.service; enabled)
   Active: active (running) since Thu 2018-01-04 20:57:45 JST; 3s ago
 Main PID: 13840 (notify-reboot.s)
   CGroup: /system.slice/notify-reboot.service
           ├─13840 /bin/bash /usr/local/bin/notify-reboot.sh
           └─13841 sleep 45

以上です。

サーバのノードダウンをLINEで通知

外出先からiPhoneのホームアプリを使って暖房のスイッチを入れようとすると、homebridgeサーバが何らかの理由でダウンしている、なんてことがたまにあります。今はGoogle Home Miniを併用していて、IRKitがフリーズしていない限りそこまで困ることはありません。そのあたりの話はまた別のエントリで書くとして、Raspberry Piの話に戻ると、ウチの場合はhomebridgeサーバを自ら監視して、自分がネットワークに接続できていなければ再起動をかけるように設定しています。
この話は今回書こうと思っているお話と関係なくはないのですが、これまた別のお話。今回は、homebridgeサーバがダウンしていたら、別の監視用のRaspberry Pi ZeroからLINE通知が来るようにしました、というお話です。

1.LINEのアクセストークンを発行

最初、サーバがダウンしたらメールで通知が来るようにしようと思ったのですが、これだけの為にメールサーバを立てるのも、踏み台にされるリスクがあるし、運用に手を取られるのも現実的ではないでしょう。それに、今どき個人サーバのノードダウンでメールが来るなんて前時代的だしダサい…という勝手な思いもあり、スマホに通知が来る方向で考えました。
そんなこんなでサーバのノードダウンをLINEで通知する方法を検討し、下記のようになりました。

今回はこちらのサイトを参考にさせて頂きました。
www.tapun.net

まずはLINEのアクセストークンを発行します。
下記のサイトにアクセスして、使っているLINEのIDでログインします。
https://notify-bot.line.me/my/


右上のアカウント名から[マイページ]を開き、[トークンを発行する]をクリックします。
f:id:yrn7:20171215031633p:plain
f:id:yrn7:20171215031638p:plain
[トークン名を記入してください (通知の際に表示されます)]には適当に名前をつけ、[1:1でLINE Notifyから通知を受け取る]をクリックして[発行する]をクリックします。
これでトークンが発行されます。
このアクセストークンを監視用のシェルスクリプトに使用します。

2.シェルスクリプトの準備

ウチにはhomebridge用のRaspberry Pi以外にRaspberry Pi Zeroが二つあるので、その片方に下記のシェルスクリプトを仕込みました。
参考はこちらのサイトになります。
inamuu.com

任意の場所に下記のスクリプトを作るのですが、ぼくは /usr/local/bin/ に作成しました。

$ sudo vim /usr/local/bin/notify-serverdown.sh
#!/bin/bash

NUM01=3
IPLIST=“監視サーバのIPアドレスを記入。スペース区切りで複数指定可”

### PING check
for IPL in ${IPLIST}
do
   ping ${IPL} -c ${NUM01}
   if [ $? -eq 1 ];then
      if [ -e /tmp/pingfile${IPL}.tmp ];then
        echo "TMP file already exsists"
      else
         touch /tmp/pingfile${IPL}.tmp
         curl -XPOST -H 'Authorization: Bearer LINEのトークンを入力’ -F 'message=通知メッセージを記入’ https://notify-api.line.me/api/notify
      fi
   else
      rm -f /tmp/pingfile${IPL}.tmp
   fi
done

exit 0

保存したスクリプトの権限を変更します。

sudo chmod 744 /usr/local/bin/notify-serverdown.sh

監視先のサーバをシャットダウンするか、スクリプト内の指定を存在しないIPアドレスに変更してテストします。

$ sudo /usr/local/bin/notify-serverdown.sh

これでLINEに通知が来れば成功です。
f:id:yrn7:20171217185952j:plain

3.crontabへの登録

監視の為の ping にはroot権限が必要なので、crontabにrootで登録します。

$ sudo crontab -e

下記を追加。 ※毎時30分ごとに ping を行い、ノードダウンしていればLINEで通知する

*/30 * * * * /usr/local/bin/notify-serverdown.sh

対象のサーバをシャットダウンしておき、LINE通知が来るのが確認できれば設定は完了です。
お疲れ様でした。

Raspbianでapt-get upgradeが失敗したときの話

Raspberry Pi 3で apt-get upgrade を実行したとき、今までは出なかったこんなメッセージが出て、upgrade ができなくなりました。

E: The value "stable" is for APT::Default-Release is invalid, since such a
release is not available in the package-sources.

ググって行くとやがてこんな情報が出てきました。

unix.stackexchange.com

ややうちとは違う状況ですが(Wheezy から Jessieに upgrade したわけではなく、最初から Jessie を使っています)、「3 Answers」に記載されているファイルをリネームしてから upgrade を実施してみました。

$ sudo mv /etc/apt/apt.conf.d/10defaultRelease
/etc/apt/apt.conf.d/10defaultRelease.old
$ sudo apt-get upgrade

10defaultRelease.old は sources.list ではない、と言われましたが、upgrade は問題なく完了しました。
上記のサイトに従い、10defaultReleaseを編集して恒久対策とします。

$ sudo mv /etc/apt/apt.conf.d/10defaultRelease.old
/etc/apt/apt.conf.d/10defaultRelease
$ sudo vim /etc/apt/apt.conf.d/10defaultRelease

APT::Default-release \"oldstable";

おしまい。

iOS11導入によるhomebridge不具合と対処法

#2017年9月27日(水)に一部更新しました。

 

昨日、iOS11を導入してiPhoneにいくつか不具合が出ました。


・コントロールセンターのwifiがオフできない → [設定]からオフで対応

・電波強度の数字表示が解除される → 対処法なし

・ホームアプリでhomebridgeの赤外線リモコンを使用する機器が表示されない

 

homebridgeに関する不具合はベータ版からの既知の問題で対処策もいくつか提示されています。

github.com

ウチの環境では、まず、赤外線リモコン対応の電源スイッチがホームアプリに表示されなくなりました。

上記のリンク先に記載されている対処法のうち、homebridgeのconfig.jsonに書いてあるusernameとpinの変更を行いました。iPhoneのホームアプリのhomebridgeを削除後、登録し直すことで電源スイッチは表示されるようになりましたが、今度はRaspberry PiのGPIOに接続している温度・湿度センサーが非対応の機器として表示されるようになりました。

f:id:yrn7:20170927021518p:plain

対処法

github.comこちらに homebridge のバージョン0.4.28の話が出ており、iOS11で使用できているとのことだったので、homebridge をupdateしてみました。

$ sudo su
# npm install -g homebridge
# exit
$ sudo systemctl restart homebridge
$ sudo systemctl status homebridge

● homebridge.service - Node.js HomeKit Server
   Loaded: loaded (/etc/systemd/system/homebridge.service; enabled)
   Active: active (running) since Wed 2017-09-27 02:12:00 JST; 20min ago
 Main PID: 3010 (homebridge)
   CGroup: /system.slice/homebridge.service
           └─3010 homebridge


上記コマンドのうち、installとなっている部分はupgradeでもよいと思うし、homebridgeのrestartはrootのまま行ってもよいと思います。

ウチはGPIOに接続しているセンサーがあり、homebridgeを起動しているユーザーをGPIOグループに入れている関係だと思うのですが、rootでrestartするとセンサーにアクセス権がなくて温度・湿度が取得できなかったので、上記のようにしました。

この後前述のconfig.jsonの対応とホームアプリの再登録で問題なくhomebridgeが動くようになりました。

f:id:yrn7:20170927024422j:plain

Amazon Dash ButtonでHueをON/OFF

#2017年11月11日(土)に一部更新しました。

f:id:yrn7:20170903205719j:plain
Philips Hueというスマートフォンからコントロールできる電球シリーズがあるのですが、なかなかにいいお値段で、最初はあまり手を伸ばすつもりもありませんでした。
それが、価格もお手頃なホワイトグラデーションスターターセットの存在を知り、一気に気が変わりました。使い始めてみると便利で、現在はホワイトグラデーションの電球を2つ買い足して計4つで運用しています。

ホワイトグラデーションスターターセットにはDimmerスイッチという物理スイッチが一つついてくるのですが、うちの場合はこのスイッチを玄関にマグネットで貼っているので、室内ではiPhoneのホームアプリかSiri、Hueの公式アプリでの操作に限られます。寝る前にちょっと電気をつけたいときなど、やはり物理ボタンがもう一つくらいあった方がいいな、と思うのですが、Dimmerスイッチを追加するのも割高だなあ、という気持ちになり、何かいい方法がないか考えていたところ、なんとスイッチを自作されている方がいることを知りました。
Hue Tapスイッチが高いのでESP-WROOM-02で物理スイッチを自作する 前編

※現在はDimmerスイッチも価格がこなれて来ています。

これにはとても興味を惹かれたのですが、むき出しにしておくこともできないし、カバーどうするんだ...などと考え出すと重い腰がなかなか上がらないものです。
ふと、以前こちらを参考にAmazon Dash Buttonを押すとRaspberry Piが再起動するしくみを組み込んだことを思い出し、この機能を拡張すればHueのスイッチにできるんじゃない、と思い至りました。
tane-maki.net

かくして、この記事はAmazon Dash Buttonをアマゾンが望まない形で使用してHueのスイッチに仕立てたときの記録となります。
なお、Hueの基本的な設定はできており、iPhoneのホームアプリ、あるいはHueの公式アプリで操作できるようになっていることが前提です。また、Raspberry PiMacなど、シェルスクリプトが稼働して常時起動できるマシンがあることも前提としています。

1.Hueブリッジの準備

参考資料は「Philips hueをAPIで制御してみる」です。
Hueシリーズは、電球自体がWiFiを介してスマートフォンと直接やりとりをしているわけではなく、Hueブリッジという親玉にあたる部分が電球とスマートフォンの仲立ちをします。
まずはこのブリッジ上でAmazon Dash Buttonが使用するユーザーを作成します。
そのためにはHueブリッジのIPアドレスを知る必要がありますが、方法はいくつかあります。

  • 自宅ルータにログインしてIPアドレスを調べる
  • パソコンから arp -a コマンドを入力してあたりをつける
  • Hueの公式アプリを使用して調べる(設定 > Hue ブリッジ > i > ネットワーク まで進めてDHCPを一時的にオフするとIPアドレスが表示される)

IPアドレスがわかったら、パソコンもしくはスマートフォンのブラウザからHueブリッジにアクセスします。

http://(HueブリッジのIPアドレス)/debug/clip.html

(例では172.16.1.2)
f:id:yrn7:20170903144101p:plain
参考資料に従い、下記のように入力します。

URL: /api
Message Body: {"devicetype":"dash_hue_app"}

※上記 dash_hue_app の部分は何でもよいようです。
この状態でHueブリッジの上にある大きなボタンを押し、[POST]をクリックします。
するとusernameが返ってきます。

[{"success":{"username":"xxxx〜xxxx"}}]

上記の xxxx〜xxxx の部分を使用することになります。

ここまでできたら、Amazon Dash ButtonでON/OFFしたいHueのIDを確認します。
ホームアプリやSiriで対象のHueだけを消灯しておきましょう。
先ほどの画面に下記のように入力します。

URL: /api/xxxx〜xxxx/lights/
Message Body: なし

これで[GET]をクリックするとHueの情報が出てきます。
f:id:yrn7:20170903150346p:plain
この中で

"on": false,

となっているIDを探します。
※写真の中では 3 が対象のIDです。

念のため、このIDで間違いないか確認をします。
先ほどの画面で下記のように入力します。

URL: /api/xxxx〜xxxx/lights/(先ほどのID)/state
Message Body: {"on": true}

これで[PUT]をクリックし、対象のHueが点灯すればOKです。

2.Amazon Dash Buttonの準備

Hueブリッジの準備が終わったら、次はAmazon Dash Buttonの準備を行います。
こちらのサイトの「ボタンセットアップ」を参考に、スマホのアマゾン公式アプリを使ってAmazon Dash Buttonを単なるIoTボタンとして使用できるようにします。
qiita.com
Amazon Dash Buttonが自宅のWiFiに接続できるようになったら、Amazon Dash ButtonMACアドレスを調べます。
方法はいくつかありますが、今回はRaspberry PiもしくはMactcpdump を使用します。

$ sudo tcpdump -i wlan0 | grep BOOTP/DHCP

※上記はRaspberry Piを使用した場合ですが、Macの場合は wlan0 の部分が en0 などになります。
ifconfig等で確認ください。
この状態でWiFiに接続したAmazon Dash Buttonを押します。

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:20:39.964358 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from fc:a6:xx:xx:xx:yy (oui Unknown), length 261

わかりづらいですが、fc:a6〜yy がMACアドレスになります。
ここまでできれば必要な情報は揃いました。

3.シェルスクリプトの作成

参考資料は「Amazon Dash Button ハックで、コーヒー豆を(人力で)取り寄せる」です。
前置きなしに行きます。Raspberry Piにログインし、下記のとおり、シェルスクリプトを /usr/local/bin/ 配下に作成します。

$ sudo vim /usr/local/bin/dash_button_script.sh

#!/bin/bash

sudo tcpdump udp -nl | while read line; do

  if [[ `echo ${line} | grep "(Amazon Dash ButtonのMACアドレス)"` ]]; then

#hueのブリッジに対象ライトのステータスを取得しに行く
    statesearch=`curl -XGET 'http://(HueブリッジのIPアドレス)/api/(1.で作成したHueのusername)/lights/(1.で確認したHueのID。通常数字一桁)'`

#文字列比較用の変数
    state=\"on\":true\,\"bri\"

#取得したhueのステータスがtrueだった場合
    if [[ ${statesearch:10:15} = ${state} ]]; then

#hueのブリッジに対象ライトをOFFさせに行く
      curl -XPUT 'http://(HueブリッジのIPアドレス)/api/(1.で作成したHueのusername)/lights/(1.で確認したHueのID。通常数字一桁)/state' -d '
      {"on": false}'
    else

#ステータスがtrue以外の場合はONする
      curl -XPUT 'http://(HueブリッジのIPアドレス)/api/(1.で作成したHueのusername)/lights/(1.で確認したHueのID。通常数字一桁)/state' -d '
      {"on": true}'
    fi
  else
    echo "dash_button_script is running."
  fi
done

一旦上記のスクリプトを作成したら、スクリプトのアクセス権を変更します。

$ chmod 755 /usr/local/bin/dash_button_script.sh

起動してテストをします。

$ sudo /usr/local/bin/dash_button_script.sh

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlan0, link-type EN10MB (Ethernet), capture size 262144 bytes

上記のような画面が出て止まっていれば、正しく起動しています。
この状態でAmazon Dash Buttonを押して、HueがON/OFFできればOKです。
ON/OFFする間隔は20秒ほど空けないとうまくいきません。
目安は、Amazon Dash ButtonのLEDの点滅が終わってから10秒ほどです。

これで動作すれば、あとはhomebridgeと同様、自動起動の設定をすればOKです。
確認が取れれば、一旦スクリプトはCtrl + Cで終了させておきます。

4.シェルスクリプト自動起動設定

下記のとおり、自動起動用のファイルを作成します。

$ sudo vim /etc/systemd/system/dash_button_script.service

Description=dash_button_script.service
#サービス名を記述
After=syslog.target

[Service]
Type=simple
WorkingDirectory=/usr/local/bin/
#ディレクトリ名
ExecStart=/usr/local/bin/dash_button_script.sh
#スクリプトのパス
Restart=always
TimeoutStopSec=5
StandardOutput=null
RestartSec=10

[Install]
WantedBy = multi-user.target

ファイルが作成できたら、homebridgeのときと同様に下記コマンドを実行してsystemdに登録し、Raspberry Pi起動時にスクリプト自動起動するようにします。

$ sudo systemctl daemon-reload
$ sudo systemctl enable dash_button_script
$ sudo systemctl start dash_button_script

Raspberry Piを再起動します。

$ sudo shutdown -r now

再起動後、下記コマンドでスクリプトが起動しているか確認します。

$ sudo systemctl status dash_button_script

● dash_button_script.service
   Loaded: loaded (/etc/systemd/system/dash_button_script.service; enabled)
   Active: active (running) since Sun 2017-09-03 20:47:26 JST; 6min ago
 Main PID: 2447 (dash_button_scr)
   CGroup: /system.slice/dash_button_script.service
           ├─2447 /bin/bash /usr/local/bin/dash_button_script.sh
           ├─2450 sudo tcpdump udp -nl
           ├─2451 /bin/bash /usr/local/bin/dash_button_script.sh
           └─2456 tcpdump udp -nl

二行目の最後が enable となっていて、三行目が active (running) となっていればOKです。
Amazon Dash Buttonを押してHueがON/OFFされるか確認してください。
これで問題なければ設定は完了です。
お疲れ様でした。

#2017年11月11日(土)に下記追加

Amazon Dash Buttonを運用していると、正しく動作するときとしないときがあり、systemctl status を確認しても、とくに落ちているということもなさそうです。
仕方がないので、crontabで15分に一度 systemctl restartするようにしましたが、とりあえず今は問題なく動作しています。

homebridge on Raspberry Pi + Siriで家電コントロール

f:id:yrn7:20170831002927p:plain
いつか赤外線リモコン対応機器をホームアプリでコントロールできたらなあ、と思っていたのが昨年のこと。

ワタナベ書店さんの「赤外線リモコンで操作する家電をHomekit対応にする、homebridge-irkitの使い方」を読んでからいてもたってもいられなくなり、Raspberry Pi 3とIRKitを購入し、エアコンとプロジェクターをSiriでコントロールできるようにしたのが今年はじめ。

今は冒頭の写真のように赤外線受信機をつけたデスクライト、Raspberry Pi 3のGPIOに取り付けた温度・湿度センサー、Hue、KooGeekを導入して、いろいろな家電をiPhoneからコントロールできる環境になりました。Apple TVとの組み合わせで家の外から操作できるのもとても便利です。

この記事はRaspberry Pi 3にHomeKit APIをエミュレートするhomebridgeを導入し、IRKitを操作できるようにした際のメモです。
参考サイトは都度記載しています。
なお、Raspberry Pi 3の基本的な設定は割愛しています。

1.homebridgeのインストール

参考資料は「Raspberry Pi + HomeKit + IRKit = Siriで家電を音声操作できるようにする」です。

まず、Raspberry Pi 3にログインし、avashiをインストールします。

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

次にnode.jsをインストール。

$ wget https://nodejs.org/dist/v6.11.2/node-v6.11.2-linux-armv7l.tar.xz

※最新版は公式のここを見てリンク先を確認してください。
 Raspberry Pi 3のCPUはARM8だけど、まだRaspbianが32bitなのでARM7が正しいそうです
 CPUの確認は下記コマンドで。

$ lscpu

ダウンロードしたnode.jsをインストールします。

$ tar -xvf node-v6.11.2-linux-armv7l.tar.xz
cd node-v6.11.2-linux-armv7l
$ sudo cp -R * /usr/local/

インストールしたnode.jsのバージョン確認して、正しく表示されれば問題ありません。

$ node -v
6.11.2

いよいよhomebridgeのインストールをします。

$ sudo su
# npm install -g homebridge

今回使うIRKit用のプラグインをインストールします。

# npm install -g homebridge-irkit
# exit

ここまでできたらとりあえず起動してみます。

$ 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/1/2017, 1:48:34 PM] ---
[9/1/2017, 1:48:34 PM] Loaded plugin: homebridge-dummy
[9/1/2017, 1:48:34 PM] Registering accessory 'homebridge-dummy.DummySwitch'
[9/1/2017, 1:48:34 PM] ---
[9/1/2017, 1:48:34 PM] Loaded plugin: homebridge-irkit
[9/1/2017, 1:48:34 PM] Registering accessory 'homebridge-irkit.IRKit'
[9/1/2017, 1:48:34 PM] ---
[9/1/2017, 1:48:34 PM] config.json (/home/yorino/.homebridge/config.json) not found.
Scan this code with your HomeKit App on your iOS device to pair with Homebridge:

    ┌────────────┐
    │ 031-45-154 │
    └────────────┘

/usr/local/lib/node_modules/homebridge/node_modules/mdns/lib/advertisement.js:56
  dns_sd.DNSServiceRegister(self.serviceRef, flags, ifaceIdx, name,
         ^

Error: dns service error: name conflict
    at Error (native)
    at new Advertisement (/usr/local/lib/node_modules/homebridge/node_modules/mdns/lib/advertisement.js:56:10)
    at Object.create [as createAdvertisement] (/usr/local/lib/node_modules/homebridge/node_modules/mdns/lib/advertisement.js:64:10)
    at Advertiser.startAdvertising (/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/lib/Advertiser.js:43:30)
    at Bridge.Accessory._onListening (/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/lib/Accessory.js:539:20)
    at emitOne (events.js:96:13)
    at HAPServer.emit (events.js:188:7)
    at HAPServer._onListening (/usr/local/lib/node_modules/homebridge/node_modules/hap-nodejs/lib/HAPServer.js:190:8)
    at emitOne (events.js:96:13)
    at EventedHTTPServer.emit (events.js:188:7)

エラーが出て終了しますが、configファイルがないのが原因なので今はこれで問題ありません。

2.IRKitのセットアップと赤外線情報の取得

一旦homebridgeのインストールが完了したところで、WiFi付き赤外線リモコンであるIRKitのセットアップを行います。
IRKitは本体のみの販売なので、別途Android充電用ケーブルとUSB充電器が必要になります。
電源を入れたら公式アプリを使用して自宅のWiFiネットワークに接続します。
公式アプリを見るとiRKitの名前がわかるので、この名前+.localをつけてMacLinuxからcurlコマンドでアクセスすることができます。
まずは、IRKitの公式サイトに書いてあるとおり、iRKitに赤外線リモコンを向けてボタンを押します。(IRKitのLEDが点滅します)
その後、MacLinux(もちろんRaspberry PiでもOK)からcurlコマンドで今の赤外線情報を取得します。

curl -i "http://(IRKitの名前).local/messages" -H "X-Requested-With: curl"

こんなのが出力されます。

HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain

{"format":"raw","freq":38,"data":[8755,8755,1111,3119,1190,968,(中略)1073,3119,1073,3119,1073,3119,1073]}

このうち必要な部分は {"format": 〜]} です。
これをリモコンごとにON/OFFの2つ分を取得しておきます。
※エアコンの場合はドライや暖房など、機能ごとにON/OFFを取得します。

3.homebridgeの設定

さていよいよhomebridgeの設定を行います。
Raspberry Piにログインして、homebridgeのconfigファイルを作成します。

$ vim ~/.homebridge/config.json

{
    "bridge": {
        "name": "Homebridge",
        "username": "xx:xx:xx:xx:xx:xx",  #usernameはRaspberry PiのMACアドレスを入れます。間違っていても問題ないようです。
        "port": 51826,
        "pin": "031-45-154"               #PINコードも変更可能
    },
    "description": "IRKit Control",
    "accessories": [
        {
            "accessory": "IRKit",
            "name": "ドライ",
            "irkit_host": "irkit1ac5.local",
            "on_form": {"format": "raw","freq": 38,"data": [(ONの赤外線情報)]
            },
            "off_form": {"format": "raw","freq": 38,"data": [(OFFの赤外線情報)]
            }
        },
        {
            "accessory": "IRKit",
            "name": "クーラー",
            "irkit_host": "irkit1ac5.local","freq": 38,"data": [(ONの赤外線情報)]
            },
            "off_form": {"format": "raw","freq": 38,"data": [(OFFの赤外線情報)]
            }
        },
        {
            "accessory": "IRKit",
            "name": "暖房",
            "irkit_host": "irkit1ac5.local",
            "on_form": {"format": "raw","freq": 38,"data": [(ONの赤外線情報)]
            },
            "off_form": {"format": "raw","freq": 38,"data": [(OFFの赤外線情報)]
            }
        },
        {
            "accessory": "IRKit",
            "name": "プロジェクター",
            "irkit_host": "irkit1ac5.local",
            "on_form": {"format": "raw","freq": 38,"data": [(ONの赤外線情報)]
            },
            "off_form": {"format": "raw","freq": 38,"data": [(OFFの赤外線情報)]
            }
        }
    ]
}

config.jsonを作成したらhomebridgeを起動します。

$ homebridge

homebridgeが起動し、最後に先ほどのconfig.jsonに書かれたpinが表示されて止まればconfig.jsonは正しく記述されています。

    ┌────────────┐
    │ 031-45-154 │
    └────────────┘

正しく起動しない場合はjsonの構文チェッカー等を通して修正してください。

4.iPhoneでの動作テスト

homebridgeを起動した状態でiPhoneの設定を行います。
iPhoneのホーム画面にある「ホーム」をタップして起動します。
f:id:yrn7:20170902165417p:plain
「アクセサリを追加」をタップし、「homebridge」を選択し、「このまま追加」をタップします。

「コードを手動で入力」をタップし、homebridgeのconfig.jsonのpinに入力した数字(今回の例では「031-45-154」)を入力します。
正しく入力するとhomebridgeが登録されます。
場所を変更することができるので、変更する場合は適宜変更し、「次へ」をタップします。

するとhomebridgeに登録されているアクセサリが表示されるので、それぞれ「場所」と「タイプ」を選択して「次へ」をタップします。

これでiPhoneのホームの設定は終了です。
登録したアクセサリをタップしてON/OFFできることを確認します。
確認が取れれば、一旦homebridgeはCtrl + Cで終了させておきます。

5.homebridgeの自動起動設定

参考資料は「Raspberry PiとSiriで家電の音声制御 後編 Siriでの家電制御」の『さて、期待通りのものができたので満足しているのですが・・・』以降です。

まずはhomebridgeの起動専用のユーザーを作成します。

$ sudo useradd --system homebridge

次に、ホームディレクトにあるhomebridgeのconfig.jsonを新しく作成する /var/homebridge ディレクトリに移し、ディレクトリの所有者をhomebridge起動専用ユーザーに変更します。

$ sudo mkdir /var/homebridge
$ sudo cp ~/.homebridge/config.json /var/homebridge/.
$ sudo chown -R homebridge:homebridge /var/homebridge

上記参考リンクに従い、 /etc/default/homebridge と /etc/systemd/system/homebridge.service の二つのファイルを作成します。

$ sudo vim /etc/default/homebridge

# Defaults / Configuration options for homebridge
# The following settings tells homebridge where to find the config.json file and
 where to persist the data (i.e. pairing and others)
HOMEBRIDGE_OPTS=-U /var/homebridge

# If you uncomment the following line, homebridge will log more
# You can display this via systemd's journalctl: journalctl -f -u homebridge
# DEBUG=*
$ sudo vim /etc/systemd/system/homebridge.service

[Unit]
Description=Node.js HomeKit Server
After=syslog.target

[Service]
Type=simple
User=homebridge
EnvironmentFile=/etc/default/homebridge
ExecStart=/usr/local/bin/homebridge $HOMEBRIDGE_OPTS
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

ファイルを作成したら下記コマンドを実行してsystemdに登録し、Raspberry Pi起動時にhomebridgeが自動起動するようにします。

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

Raspberry Piを再起動します。

$ sudo shutdown -r now

再起動後、下記コマンドでhomebridgeが起動しているか確認します。

$ sudo systemctl status homebridge

● homebridge.service - Node.js HomeKit Server
   Loaded: loaded (/etc/systemd/system/homebridge.service; enabled)
   Active: active (running) since Tue 2017-08-29 02:03:38 JST; 4 days ago
 Main PID: 465 (homebridge)
   CGroup: /system.slice/homebridge.service
           └─465 homebridge

二行目の最後が enable となっていて、三行目が active (running) となっていればOKです。

「4.iPhoneでの動作テスト」で設定したホームの設定は自動起動設定後は使用できませんので、一度設定を削除し、再度設定してください。
これでhomebridgeの設定は完了です。
お疲れ様でした。

赤外線リモコン対応機器を増やす場合は、基本的には /var/homebridge/config.json の設定変更(手順としては「3.homebridgeの設定」と同様ですが、自動起動設定後は使用するconfig.jsonの場所が異なりますので注意)した後、下記コマンドで homebridge を再起動すればOKです。

$ sudo systemctl restart homebridge

このあと、iPhoneのホームに追加したアクセサリを登録します。