久しぶりの更新。まだ生きてます。

唐突ですが、時代はいまやスマートホーム()! 常時起動させているNAS、DS216jにhomebridgeを入れて、Siriから格安Wi-Fi対応学習リモコン経由で家電を音声操作しちゃおう!と思い立ちました。

超ざっくり処理の流れを説明すると、

iPhone(Siri) → homebridge(DS216j) → Wi-fi対応リモコン(RM mini3(eRemote mini)など) → 家電機器

となります。homebridgeはnode.jsで動くプログラムで、node.jsがパッケージセンターに公式に用意されていることから、さくっと30分くらいでインストール終わるんじゃね?と最初は思っていましたがhomebridgeがエラーを吐いて動かない。てこでも動かない。opkg環境を構築してソースからビルドしても動かない。dockerコンテナなら超さくっとインストールできるぜ?なんて情報もありましたが、上位機種じゃないとだめ。というわけでdocker全盛?の2018年にchroot監獄です。この記事を書くのも含めて結局トータル12時間くらいかかったという・・・。こんなに苦労するなら転がってるラズパイに環境構築すればよかったと後悔していなくもないです。

というわけで、homebridgeと学習リモコンの設定はぶっちゃけチョロなので、苦労したhomebridgeのインストール手順のみとなりますがまとめました。ここ↓
Setup Homebridge on Synology NAS without Docker
の手順を参考にしましたが結構アレンジしてます。というかせざるを得なかった。 同じCPUアーキテクチャの後継機種DS218jでも同じ手順が使えそうですね。

とここで注意事項。以下の手順でNASに入れるdebian-chrootパッケージは、DSM6.0以降のDiskStation(以降DS)に入れてアンインストールすると、DSが”brick(煉瓦化)”(日本でいうところの文鎮)する致命的な不具合が報告されています。対処方法は2018年10月19日現在、完全に確立されていないようです。したがって、

以下の手順を実施してもたらされる全ての結果の責任は手順実施者が負うことを認識してください。
責任を自分で負えないのであれば以下の手順を絶対に行わないでください。
実施する場合も必ずのNAS上にあるデータのバックアップを取ってください。

それではスタート

0. administratorsグループに所属するユーザをNAS上に作成しておく

1. Enable SSH your NAS. (いきなり英語でびっくりした?調査中英語ばっかりで疲れたのでこの疲れをおすそ分け)
なお、22番ポート以外のポートを使うように設定しておく。(10022など。以降、10022番ポートに設定した前提で手順を記載する)

2. コントロールパネル→ファイルサービス→詳細→「Bonjourサービスの検出を有効にする」のチェックを外して適用する

(chroot環境のmDNSを有効化するためDS側は無効にする)

3. パッケージセンター→設定→全般→トラストレベルを「Synology Inc.および信用された製造元」に変更、パッケージソースタブで場所「http://packages.synocommunity.com/」、名前は適当にsynocommunityとかにして追加してOK

4. パッケージセンターの検索バーに「python」と入力してエンターを押す。コミュニティカテゴリのPythonをインストール

5. ここにアクセスし、「5.2 armada38x」をクリックしてdebian-chroot.v7.f5644[armada38x].spkをダウンロードする。

6. 5.でダウンロードしたファイルをパッケージセンターから手動インストールする。

7. teratermなどでNASにsshログイン(10022番ポート)する。ログインユーザは0.で作成したユーザ

8. rootになる

【ネイティブDS環境】$ sudo -i

9. debian chrootを発動する

【ネイティブDS環境】# /var/packages/debian-chroot/scripts/start-stop-status chroot

10. aptデータベースを更新

【chroot環境】# apt-get update

11. 必要なツール類をインストール

【chroot環境】# apt-get install build-essential
【chroot環境】# apt-get install chkconfig
【chroot環境】# apt-get install python2.7
【ネイティブDS環境】$ sudo -i
【ネイティブDS環境】# cd /volume1/@appstore/python/lib/python2.7/site-packages
【ネイティブDS環境】# pip install --upgrade pip
【ネイティブDS環境】# pip install --upgrade setuptools
【ネイティブDS環境】# pip install pyextdirect
【ネイティブDS環境】# cd /usr/lib/python2.7/site-packages/
【ネイティブDS環境】# cp -pR pyextdirect /volume1/@appstore/python/lib/python2.7/site-packages/

12. 作業用ディレクトリを作成して移動する

【chroot環境】# mkdir ~/work
【chroot環境】# cd ~/work

13. node.jsのソースをhttp://nodejs.org/dist/からダウンロードして展開(お好きなバージョンをどうぞ。動かなくても知らんけどne)

【chroot環境】# wget http://nodejs.org/dist/latest-v8.x/node-v8.12.0.tar.gz
【chroot環境】# tar xvzf node-v8.12.0.tar.gz

14. node.jsをビルドしてインストール。(2~3時間かかるので昼寝でもしてね)

【chroot環境】# cd node-v8.12.0
【chroot環境】# ./configure
【chroot環境】# make -j2
【chroot環境】# make install

15. homebridgeに必要なマルチキャストDNS関連のパッケージをインストールして起動

【chroot環境】# apt-get install libavahi-compat-libdnssd-dev
【chroot環境】# cd /
【chroot環境】# mount -t proc proc proc/
【chroot環境】# /etc/init.d/dbus start
【chroot環境】# /etc/init.d/avahi-daemon start

16. homebridgeをインストール

【chroot環境】# npm config set python /usr/bin/python2.7
【chroot環境】# npm install -g --unsafe-perm homebridge

あとは自分の学習リモコンに応じて必要なプラグインもここらへんでインストールしておく。私の場合は

【chroot環境】# npm install -g homebridge-broadlink-rm

17. homebridgeをサービスとして起動するように設定

【chroot環境】# useradd -s /bin/false -b /var/run homebridge
【chroot環境】# cd ~/work
【chroot環境】# wget https://gist.githubusercontent.com/gregwym/d7b31606758acfb61896f588d13c3dda/raw/a7350fe13df3f99312bdaea85aca0cc4a1389e8f/init.d.homebridge.sh
【chroot環境】# cp init.d.homebridge.sh /etc/init.d/homebridge
【chroot環境】# chmod 755 /etc/init.d/homebridge

18. homebridge起動確認。1回起動してすぐに停止させる。この操作によりchroot環境の/var/run/homebridge配下に.homebridge/が作成される。せっかちな人向け(for the impatient)が笑いをさそう

【chroot環境】# service homebridge start
[ ok ] Starting HomeKit support for the impatient: homebridge.
【chroot環境】# service homebridge status
[ ok ] homebridge is running.
【chroot環境】# service homebridge stop
[ ok ] Stopping HomeKit support for the impatient: homebridge.

19. いったんログアウトしてchroot環境を抜ける(teratermを閉じる)

20. NASにsshログイン(10022番ポート)する。ログインユーザは0.で作成したユーザ

21. rootになる

【ネイティブDS環境】$ sudo -i

22. /var/packages/debian-chroot/scripts/start-stop-statusのバグ?を修正する。
(start-stop-status start(またはstop)はDSM6.0環境では正常動作はしていない。
しかし、DS起動時に呼ばれ/procや/dev/ptsをchroot環境にマウントする処理をしてくれるので有用)

【ネイティブDS環境】# vi /var/packages/debian-chroot/scripts/start-stop-status

73行目付近のexit 1をexit 3に変更する
(省略)
    status)
        if daemon_status; then
            echo ${DNAME} is running
            exit 0
        else
            echo ${DNAME} is not running
            exit 1 ←←←←←←←←←←←←←←←← ここをexit 3に変更する
        fi
        ;;
(省略)

23. パッケージセンターからDebian Chrootを開き、「実行」をクリックする。(間違ってもアンインストールを選んでクリックしないこと!

24. chroot環境に直接sshできる環境を構築する。(chroot環境に直接sshする場合は22番ポートで接続する環境となる)

【ネイティブDS環境】# /var/packages/debian-chroot/scripts/start-stop-status chroot
【chroot環境】# apt-get install ssh

25. chroot環境にsshログインするためのユーザ(例:mainte)を作成する

【chroot環境】# useradd mainte -m
【chroot環境】# passwd mainte

26. chroot環境でsshしたユーザがrootにsuできるように、rootのパスワードを設定する

【chroot環境】# passwd

27. いったんログアウトしてchroot環境を抜ける(teratermを閉じる)

28. NASにsshログイン(10022番ポート)する。ログインユーザは0.で作成したユーザ

29. rootになる

【ネイティブDS環境】$ sudo -i

30. chroot後にchroot環境で各種サービスが自動起動するように設定する

サービス起動スクリプトを作成

【ネイティブDS環境】# vi /usr/local/debian-chroot/var/chroottarget/root/service_start.sh

以下の内容で作成
#!/bin/sh
service dbus start
service avahi-daemon start
service homebridge start
service ssh start

作成したスクリプトに実行権を付与

【ネイティブDS環境】# chmod 755 /usr/local/debian-chroot/var/chroottarget/root/service_start.sh

「/var/packages/debian-chroot/scripts/start-stop-status chroot」実行時に上記スクリプトを実行するように修正する

【ネイティブDS環境】# vi /var/packages/debian-chroot/scripts/start-stop-status

78行目付近の「chroot ${CHROOTTARGET}/ /bin/bash」行をコメントアウトし、
下記のように「chroot ${CHROOTTARGET}/ /bin/bash -c "/root/service_start.sh"」行を追加する
(省略)
    chroot)
#        chroot ${CHROOTTARGET}/ /bin/bash ←←←←←←←←←←←←←←←←←←←← コメントアウト
        chroot ${CHROOTTARGET}/ /bin/bash -c "/root/service_start.sh" ←←←←←←←← 追加
(省略)

31. NAS起動時に自動的にchrootするようにする

【ネイティブDS環境】# vi /etc/rc.local

以下の内容で作成。/bin/sleep 60はいらないかも
#!/bin/sh
/bin/sleep 60
/var/packages/debian-chroot/scripts/start-stop-status chroot

作成したファイルに実行権を付与

【ネイティブDS環境】# chmod 755 /etc/rc.local

32. NASを再起動する

【ネイティブDS環境】# reboot

33. NAS起動後chroot環境が自動で出来上がっているので、sshログイン(22番ポート)する。ログインユーザは25.で作成したユーザ

32. rootになる

【chroot環境】$ su -

34. あとはネット上にごろごろしているhomebridgeの設定方法を参考にしてconfig.jsonをがしがし書く。config.jsonは/var/run/homebridge/.homebridge/に配置。homebridgeの停止・起動・再起動は、以下のようにserviceコマンドで。

【chroot環境】# service homebridge stop
【chroot環境】# service homebridge start
【chroot環境】# service homebridge restart

補足. homebridge-broadlink-rmでリモコンを学習させる(サービス起動時に標準出力の内容を確認する方法を確立するのが面倒くさかったのでrootで通常起動する方法)

【ネイティブDS環境】$ su -
【chroot環境】# service homebridge stop
【chroot環境】# cp -R /var/run/homebridge/.homebridge /root/
【chroot環境】# chown -R root:root /root/.homebridge

/root/.homebridge/config.jsonは起動に必要な最低限の内容にする

【chroot環境】# vi /root/.homebridge/config.json
{
        "bridge": {
                "name": "Homebridge",
                "username":"34:EA:34:AA:AA:AA", ←自分の環境にあわせる
                "port": 51826,
                "pin": "999-99-999"
        },
        "description": "Homebridge",
        "platforms": [
                {
                        "platform": "BroadlinkRM",
                        "name": "Broadlink RM",
                        "accessories": [
                                {
                                        "name": "テレビ",
                                        "type": "switch",
                                        "data": {
                                                "on": "",
                                                "off": ""
                                        }
                                }
                        ]
                }
        ]
}

rootでhomebridgeを起動する。ホームアプリからbridgeが認識されない場合は一度bridgeを削除してもういちど登録する。ホームアプリから学習モードをONにして学習させれば結果が標準出力に表示される。学習したデータを控えたらCTRC+Cで終了する

【chroot環境】# homebridge

おわり。長いねw