Node-RED Alexa Home Skill Bridgeを設定する（2019/1Q版 その１）[On Onion Omega2+]

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100712/9da645c0-3c47-7650-f1fb-de255804c386.png)

昨年10月（2018/10）の記事「[Node-REDからpython-broadlinkでRM mini3をコントロール【失敗】[on Onion Omega2+]](https://qiita.com/spiderx_jp/items/bb6054470e1c447585b7)」では、**python-broadlink**を**Node-Red**の***exec***ノードで実行しようというものでした。結果的に***75-exec.js***で**TypeError**の例外が発生してしまい、躓いていました。
原因は、使っている**Node.jsが古い（v4.3.1）ことが起因している**ようでした・・・
Node.jsをクロスコンパイルすることもトライしましたが、ハードルが高く断念しました。

あれから約半年、どうも[**Node.js v8.10.0が正式サポート**](https://www.crowdsupply.com/onion/omega2-pro/updates/openwrt-18-06-and-nodejs-8-10-0)されたようです。
また、[Node-REDも公式にサポート](https://docs.onion.io/omega2-docs/node-red-article.html#node-red-article)されました。但し、公式サポートは、最新の**Omega2 Pro**のようです。Omega2+と比較がありましたので、[参照](https://www.crowdsupply.com/onion/omega2-pro)すると以下のようになっておりました。**MemoryがOmega2 Pro=512MBに対し、Omega2 Plus=128MB**となっておりますが、Swapで対応すれば、カバーできそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100712/da93bfd2-fe6f-82a6-06d0-a5ba679a3c6f.png)

#0. 前提条件
- Onion Omega2 Plus
    ※[工場出荷状態にリセット済み](https://docs.onion.io/omega2-docs/factory-reset.html)
- 2GB Micro-SD Card
    - パーティション2分割
        - 512MB=スワップ用、残り=システム領域拡張用
        - 各領域共にext4でフォーマット済み
- Omega2拡張ドック

#1. ファームウェアのアップデート
最初にファームウェアをアップデートします。
詳細は、[公式ページ](https://docs.onion.io/omega2-docs/using-the-omega-updating.html)を参照してください。

```console
$ oupgrade -l
```

更新後のファームウェアの確認は、以下で可能です。

```console
$ oupgrade -v
> Device Firmware Version: 0.3.2 b220
$
```
この時点で以下の構成となります。

- Onion Omega2 Plus
    - BusyBox v1.28.3
    - Ω-ware: 0.3.2 b220
    - Linux 4.14.81 #0 Thu Feb 21 20:59:23 2019 mips GNU/Linux

#2. スワップ領域の確保
[以前の記事](https://qiita.com/spiderx_jp/items/834e325f1109b0f7b4a4)に書いた方法でスワップ領域を作成・設定します。

###必要なパッケージのインストール

```
$ opkg update
$ opkg install swap-utils block-mount
```

###スワップファイルの作成
```
$ dd if=/dev/zero of=/mnt/mmcblk0p1/swap.page bs=1M count=512
```

###スワップ領域として設定・有効化

```
$ mkswap /mnt/mmcblk0p1/swap.page
$ swapon /mnt/mmcblk0p1/swap.page
```

###micro-SD自動マウント有効化

```
$ block detect > /etc/config/fstab
```

**/etc/config/fstab**を開いて、**option  enabled**を**'1'**に設定します。

```file:/etc/config/fstab
config 'mount'
        option  target  '/mnt/mmcblk0p1'
        option  uuid    'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
        option  enabled '1'
```

###スワップファイル自動有効化
**/etc/rc.local** に swapon コマンドを仕込みます。

```file:/etc/rc.local
# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

### activate the swap file on an external SD-Card
SWAP_FILE="/mnt/mmcblk0p1/swap.page"
if [ -e "$SWAP_FILE" ]; then
        swapon $SWAP_FILE
fi

exit 0
```

再起動して、スワップファイルが自動で有効になっているか確認します。

```console
$ free
             total       used       free     shared    buffers     cached
Mem:        124920      93244      31676         44       5760      20828
-/+ buffers/cache:      66656      58264
Swap:       524284        512     523772
```

#3. 外部ストレージからの起動設定
こちらも同じく、[以前の記事](https://qiita.com/spiderx_jp/items/834e325f1109b0f7b4a4)に書いた方法で設定していきます。

###外部ストレージのフォーマット

e2fsprogsをインストールします。

```
$ opkg update
$ opkg install e2fsprogs
```

アンマウント後、ext4でフォーマットします。
フォーマット後、再マウントします。

```
$ umount /mnt/mmcblk0p2
$ mkfs.ext4 /dev/mmcblk0p2
```

###/overlay ディレクトリをコピー
/overlay に格納されているシステム関連ファイルを Micro-SD にコピーします。

```
$ mount /dev/mmcblk0p2 /mnt/mmcblk0p2 ; tar -C /overlay -cvf - . | tar -C /mnt/mmcblk0p2 -xf - ; umount /mnt/mmcblk0p2
```

###/overlay 自動マウント設定

```
$ block detect > /etc/config/fstab
```

/etc/config/fstab の**option  target**を**'/overlay'**に、**option  enabled**を**'1'**に設定します。

```file:/etc/config/fstab
config 'mount'
        option  target  '/overlay'
        option  uuid    'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
        option  enabled '1'
```


設定が終わったら再起動します。

以下、確認結果です。

```console
$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                 7936      7936         0 100% /rom
tmpfs                    62460        92     62368   0% /tmp
/dev/mmcblk0p2         1348020    291676    969816  23% /overlay
overlayfs:/overlay     1348020    291676    969816  23% /
tmpfs                      512         0       512   0% /dev
/dev/mmcblk0p1          564156    524736         0 100% /mnt/mmcblk0p1
```

#4. Node-RED関連インストール
[公式ガイド](https://docs.onion.io/omega2-docs/node-red-article.html#node-red-article)に従い、Node-REDをインストールします。

###Node-Redインストール
公式ガイドを見ると、インストールはブラウザからアクセスするOnionOSのApp Managerで可能との記載があります。
OnionでのNode-RED公式サポートは、**Omega2 Proのみ**で**Omega2+は公式サポートしていない**ようです。App Managerのインストール用アイコンには***"Pro"***と明記されています。インストールに際し、もしかしたらエラーと成り得る可能性も考え、（私的にエラー調査し易い）コマンドラインでインストールすることにしました。

```console
$ opkg update
$ opkg install oos-app-nodered
```

インストール完了後、再起動すると自動的にNode-REDが起動するように**/etc/init.d/nodered**及び、**/etc/rc.d/S99nodered**が作成されるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100712/1fc19cdb-c89a-1116-0896-0d5215bf644c.png)

再起動後、Omega2にブラウザでアクセスすると、Node-REDのアイコンが追加されています。アイコンをクリックすると、Node-REDのフローエディタにアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100712/c0a6eaf9-2fb9-f543-47a4-f5e99b92fc31.png)

ちなみに、起動後停止する場合は、**/etc/init.d/nodered stop**をコンソールから入力します。**stop**のところを**startで再開**となります。

```console
$ /etc/init.d/nodered stop
```

|引数|説明|
|---|---|
|start|サービスを起動する|
|stop|サービスを停止する|
|restart|サービスを再起動する|
|reload|サービスの設定をリロードする（Node-RED未実装？）|
|enable|サービスの自動起動を有効化する|
|disable|サービスの自動起動を無効化する|


サービスを利用せず、nodeコマンドで起動する場合は、以下となります。

```console
$ /usr/bin/node --max-old-space-size=128 /usr/lib/node_modules/node-red/red.js --userDir /root/.node-red
```

以下、上記コマンドで実行した際、コンソール出力されたログに出力されるバージョン情報を記録しておきます。

|Item|Version|
|---|---|
|Node-RED|version: v0.19.5|
|Node.js|version: v8.10.0|
|Linux|4.14.81 mipsel LE|

###関連ツールのインストール
公式ガイドに従い、追加の関連ツールをインストールします。

まずは、npmをインストールします。

```console
$ opkg update
$ opkg install node-npm
```

次にコンパイルが必要なNodeパッケージのインストールに備え、**gccとmakeをインストール**します。インストールにあたり、**node-gypのインストールと設定が必要**です。

```console
$ opkg update ; opkg install python
$ cd /root/.node-red
$ node --max_old_space_size=512 $(which npm) install -g node-gyp
```

**/etc/opkg/distfeeds.conf**のコメントアウトしてある***"src/gz openwrt_base http://....."***、***"src/gz openwrt_packages http://....."***のリポジトリを有効化します。

```diff:/etc/opkg/distfeeds.conf
#src/gz openwrt_core http://downloads.openwrt.org/releases/18.06-SNAPSHOT/targets/ramips/mt76x8/packages
- #src/gz openwrt_base http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/mipsel_24kc/base
+ src/gz openwrt_base http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/mipsel_24kc/base
#src/gz openwrt_luci http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/mipsel_24kc/luci
#src/gz openwrt_onion http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/mipsel_24kc/onion
- #src/gz openwrt_packages http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/mipsel_24kc/packages
+ src/gz openwrt_packages http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/mipsel_24kc/packages
#src/gz openwrt_routing http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/mipsel_24kc/routing
#src/gz openwrt_telephony http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/mipsel_24kc/telephony
src/gz omega2_core http://repo.onioniot.com/omega2/packages/core
src/gz omega2_base http://repo.onioniot.com/omega2/packages/base
src/gz omega2_packages http://repo.onioniot.com/omega2/packages/packages
src/gz omega2_routing http://repo.onioniot.com/omega2/packages/routing
src/gz omega2_onion http://repo.onioniot.com/omega2/packages/onion
```

/etc/opkg/distfeeds.confを保存後、以下を実行します。

```console
$ opkg update
$ opkg install make gcc
$ ar -rc /usr/lib/libpthread.a
```

###Node-RED認証有効化

Node-REDの認証を有効化します。
**<font color="Red">【2019/04/29時点】
　有効化できますが、bcryptjsが遅いためか（？）認証が上手くいきませんでした。
　現状、無効化してます。</font>**

**/root/.node-red認証時に使用するモジュール（bcryptjs）をインストールします。

```console:/root/.node-red
$ cd /root/.node-red
$ node --max_old_space_size=512 $(which npm) install bcryptjs
```

認証用パスワードのハッシュコードを得ます。
**<font color="Red">（ハッシュコードが得られるまで約3分かかります）</font>**

```console:/root/.node-red
$ cd /root/.node-red
$ node -e "console.log(require('bcryptjs').hashSync(process.argv[1], 8));" your-passwd
$2a$08$8KgbG3bxk9Dg0cJUw/i2oOQf72zhcn9nUzqp6m.jJ8DF4X/b6cU82
```

ハッシュコードが得られたら、**/root/.node-red/settings.js**の122行目あたりにある**adminAuth**部分を有効化（コメントアウトを削除）して**password**の部分に取得したハッシュコードを定義します。

```javascript:/root/.node-red/settings.js
   adminAuth: {
        type: "credentials",
        users: [{
            username: "admin",
            password: "$2a$08$8KgbG3bxk9Dg0cJUw/i2oOQf72zhcn9nUzqp6m.jJ8DF4X/b6cU82",
            permissions: "*"
        }]
    },
```

Node-REDを再起動し、ブラウザでアクセスすると、以下のようにユーザ名とパスワードを入力する画面が表示されます。
**<font color="Red">【2019/04/29時点】認証でFailedになっちゃいます。</font>**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100712/9c8b9c9a-ff44-aa80-6c9f-d5e1be791d1a.png)


とりあえず、**一旦休憩！**
Node-REDインストール迄を**「その1」**とします。

次回は、

-  broadlink RM mini3の設定
-  Alexa Home Skill Bridgeの設定

を行っていく予定です。