Date: 2018.01.09
Home / Android/Google. / Google Home Miniで家電を操作。パート1.とりあえず(?)Hey! Siri!に対応。
先日、Google Home Miniでスマートスピーカーデビューしたわけですが。(しかも2台も。)
使い道を見出すのにやりたい事としてはやっぱり、声で家電操作したいに行き着いたわけで。
とはいえ、大掛かりなスマートホーム構築まではしたくない。

割と簡易に導入できるものとして、Google Homeを公式にサポートしている代表的なところではスマートリモコンの「Nature Remo」とか、ライトだけだけど「Philips Hue」とか。
それでも割とお値段は張ります。




そこで、我が家にはスマートリモコン「eRemote RJ-3」があるので、こちらを「OK, Google」から操作させようと。

とはいってもeRemoteシリーズは現状、Amazon Alexaには対応しているものの、Google Homeには未対応となります。
まあ、AlexaもLinkJapanがリリースしているコントロールアプリ「eHome」が必要になるのですが、現状では対応しているのが今年に入ってからの出荷ロットにのみ適用できるファームウェアのみ。(古いファームは「e-Control」アプリにしか対応していない。)
我が家のはホント出たてでモニター価格で売られてた時に買ったものなのでどの道、正規の方法では使えません。

なので、サーバーを用意して、IFTTT連携で操作する環境構築をやっちゃおうと。
という事で試行錯誤していました。まあ、かなりハマって時間がかかっちゃったんですが。
ネットでは結構同じような事やってる人多いですが、前提条件が分かってて当然だよね的に書かれていなかったり不親切な記事が多すぎて手探りでやるしかなかったので。
また、最終的にはインターネット側から命令が飛ぶ事もあって、LAN内とは切り離した方が安全かなーとサーバーをDMZに置こうしたのが間違いでした。
ファイアウォールで最低限ポート開けとけばいいかとか思ってたけど、どうもマルチキャストで通信してるっぽく、この後の実装した方法ではどうやっても拾えませんでした。
Sophos XG Firewallで相互のDestination NAT入れたり、マルチキャストルート書いてみたり色々やりすぎてよく分からない状態になってしまったので諦めてLAN内に置くことで落ち着いています。

前置きが長くなりましたが、はじめていきます。
と言いつつ、赤外線信号の取得がてら、まずはiOSのHomeKitに対応させてSiriから操作させてみました。

ちなみに、ネットで調べるとRaspberry Piで実装しているのがほとんどでしたが、VM上にCentOS7でサーバ立てて実装しています。

Node.js環境構築

今回導入するモジュール類がNode.js環境で動くものという事でまずはその環境構築です。
Node.jsなんて触った事もなかったのでここから四苦八苦でした。

Node.jsを単体で導入してもいいんですが、バージョン管理が簡単に出来るnodebrewと言うのを入れてそこからNode.jsを導入します。
これは完全に好みです。今後、他に色々したくなった時にあった方がいいかなー程度の考えでうちでは入れました。

まずは必要なパッケージ類をインストール。他にmakeが必要です。
# yum install perl gcc-c++

Node.js動かす用にユーザー作成。既存のユーザーでもOKです。
# useradd xxxxxxx
# passwd xxxxxxx

作ったユーザーにスイッチします。
# su - xxxxxxx

nodebrewのインストール。正常にインストールされたら以下のようにメッセージが続きます。
$ curl -L git.io/nodebrew | perl - setup

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0    89    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
100 24507  100 24507    0     0   2975      0  0:00:08  0:00:08 --:--:--  5626
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

メッセージ内にパスをexportするように書かれているので実施します。これでnode系コマンドにパスが通ります。
$ export PATH=$HOME/.nodebrew/current/bin:$PATH

とは言っても、exportコマンドはログオフすれば消えてしまうのでログイン時にパスが通るように「.bash_profile」にも買いておきます。
$ vi .bash_profile
最後尾に追記。
export PATH=$HOME/.nodebrew/current/bin:$PATH


インストール可能なnodeバージョンの確認。nodeのバージョンはメンテナンスバージョン(3オクテット目)が偶数が安定バージョン、奇数が開発バージョンとなるようです。
$ nodebrew ls-remote

nodeをインストールします。うちではv8の一番新しい安定版にしています。
$ nodebrew install-binary v8.9.2

Fetching: https://nodejs.org/dist/v8.9.2/node-v8.9.2-linux-x64.tar.gz
######################################################################## 100.0%
Installed successfully

使用するnodeバージョンを指定します。1つしかインストールしてなくてもここは必須です。
$ nodebrew use v8.9.2

use v8.9.2

nodeのバージョン確認。
$ node -v

v8.9.2

一緒に導入されるnpm(Node Packaged Modules)のバージョン確認。
$ npm -v

5.5.1

これでNode.js環境の準備は完了です。

Homebridgeの導入

iOSのHomeKitとなるサーバモジュールであるHomebridgeを導入します。

まず、rootユーザーに戻って必要なパッケージを追加します。
CentOS7では以下が必要。
# yum install avahi avahi-compat-libdns_sd avahi-compat-libdns_sd-devel

インストールできたらnode用ユーザーに再度スイッチし、npmでhomebridgeをインストールします。
$ npm install -g --unsafe-perm homebridge

インストールが無事できたら一度homebridgeを起動してみます。これでホームディレクトリに「.homebridge」ディレクトリが作成されるはずです。
$ homebridge
コンソールに色々と表示されたらCtrl+Cで抜けます。

続いてeRemote用のモジュールを導入します。
$ npm install -g homebridge-broadlink-rm

インストールできたらeRemoteのMACアドレスを調べます。すでに分かっている場合は不要です。
homebridge-broadlink-rmに同梱されているgetDevice.jsを使用します。
$ node .nodebrew/current/lib/node_modules/homebridge-broadlink-rm/helpers/getDevice.js
Discovered Broadlink RM device at xx.xx.xx.xx (aa:aa:aa:aa:aa:aa)

homebridge用のコンフィグを作成します。
$ cd .homebridge/
$ vi config.json

コンフィグサンプルです。
nameはHomeKit上に表示されるのでお好みで。
usernameは先程取得したMACアドレスを。ただし、アルファベットは大文字で。
portはデフォルトでいいかと。
pinはiOSのHomeアプリに登録する時に使うものなのでお好みで3-2-3桁で記載します。

accessories内のnameは呼びかける時に使うデバイス名等になります。
typeのswitchはオン/オフのみを定義するタイプの指定になります。
on/offにはこの後赤外線信号を取得して記載するので、ここでは空でOKです。
{
 "bridge":{
  "name":"Homebridge",
  "username": "AA:AA:AA:AA:AA:AA",
  "port":51826,
  "pin":"XXX-XX-XXX"
 },
 "description":"Homebridge",
 "platforms": [
  {
   "platform": "BroadlinkRM",
   "name": "Broadlink RM",
   "accessories": [
    {
     "name": "○○(名前)",
     "type": "switch",
     "data": {
      "on": "",
      "off": ""
     }
    }
   ]
  }
 ]
}

作成できたら改めてhomebridgeを起動します。
$ homebridge

コンソールにQRコードが表示されるのでiPhoneで「ホーム」アプリを起動して読み込み、アクセサリとして登録します。
各項目はデフォルトでOKですが、「よく使う項目に含める」はお好みでオフに。
ホームタブの「よく使うアクセサリ」欄に載せるかどうかになります。
「Learn」と「Scan Frequency」は基本的に普段は使わないですし。(「Scan Frequency」は使い道がそもそも分かってない。)

とは言いつつ、赤外線信号を取得する為にその「Learn」を使います。
「Learn」をタップしてオンにするとeRemote側のランプが光るので、eRemoteに向かって調べたいリモコンのキーを押します。
すると「learned hex code:」に続いて数字とアルファベットの組み合わせの長い文字羅列が表示されるのでそれを記録しておきます。

取得できたら「config.json」の「"on": ""」や「"off": ""」にその取得したコードを記述します。
オン/オフが同一ボタンの場合は両方に同じコードを記述します。
記述したらhomebridgeを起動し直せばオン/オフが操作できるようになっているかと思います。
ボタンが効くのが確認できたら「Hey! Siri! ○○○(accessories内のname)をオン」とか呼びかけると声でも操作できると思います。

注意点は、iOSのHomeKitは対象のデバイスに対して最後に出した命令を覚えていて、同一命令を連続で処理してくれません。
なので、オン/オフが同一コードのボタンを操作する場合でも、オンを2回言ってもそもそも命令を飛ばしてくれません。
そして一番問題になるのは別のリモコンで操作したないようは当たり前ですが知っていないので、HomeKit上のステータスとずれが生じる場合もあり割と面倒です。
(あくまでSiriで音声操作する場合で、ホームアプリ上のボタンから操作する場合はそこまで気にする事ではないですが。)

まあ、これで一旦は目的は達成です。

Homebridgeバックグラウンド起動

が、このままだとhomebridgeがフロントで動作していて、コンソールが占拠されています。
なので、バックグラウンドで動作させるようにします。

バックグラウンド動作にはforeverを使用します。
まずはforeverの導入。
$ npm install -g forever

インストールできたらforeverでhomebridgeを起動します。
$ forever start ~/.nodebrew/current/bin/homebridge
これで起動すればバックグラウンドで動作するので、プロンプトも返ってきます。

動作しているかを確認するにはlistオプションで確認します。
$ forever list

インストールできたらforeverでhomebridgeを起動します。
$ forever stop(restart) id
idはlistオプションで表示されるidで、psコマンドで表示されるpidと同一になります。

注意点は、foreverで起動した場合は内部の認識が変わるからか、「ホーム」アプリで再登録する必要があります。
バックグラウンド起動した事によってQRコードが画面上に出てこないですが、「config.json」に記述したpinを使えば楽に登録しなおせます。

なお、後からリモコン学習したい時でもコードがコンソールに表示されなくなるのですが、listオプションで確認した際に使用しているログファイル「.forever/xxxx.log」が記載されているので、そのファイルを確認すれば対象のコンソールログ等が全て記録されています。(QRコードもここで確認する事も可能です。)

かなり長くなってしまいましたが、次回は本来の目的のGoogle Home Miniで操作を実装したいと思います。
また、今回の方法はiOS環境でしかコード取得できないので、Androidしかない環境でも取得する方法も書こうかなと。

【関連記事】
Google Home 関連記事一覧。


Secret

TrackBackURL
→https://000dandelion000.blog.fc2.com/tb.php/270-a47d3ee4