Check! enebular で mbed cloud 経由で Raspberry Pi へフローをデプロイする

こんにちは、 @dz_ こと大平かづみです。

Prologue - はじめに
====

[enebular developer Meetup Vol.5 - connpass](https://enebular.connpass.com/event/104535/) でお話する枠をいただけたので、 enebular で遊んでみることにしました！

AWS 周りはすでにどなたかがやってそうなので、私は mbed cloud 経由で Raspberry Pi にデプロイする方法を試しました。

なお、 Mbed Cloud は、現在は Pelion Device Management という名称に変わり、組織を意識したポータルになっているようです。ツールの名称は旧名のままだったりと名称が混在しています。適宜読み替えてみてください :bow: 

enebular から Pelion Device Management 経由で Raspberry Pi にフローをデプロイする
====


準備するもの
----
### ハードウェア

- [Raspberry Pi 3 model B+](https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/)
    - OS: [Raspbian](http://raspbian.org/)

### ソフトウェア、パッケージ
- Node.js
- [enebular-agent](https://github.com/enebular/enebular-runtime-agent)
- [enebular/enebular-runtime-agent-mbed-cloud-connector](https://github.com/enebular/enebular-runtime-agent-mbed-cloud-connector)

### Pelion Device Management (旧Mbed Cloud)
- Pelion Device Management または Mbed Cloud のアカウント
    - アカウント取得については後述

手順
----
### Raspberry Pi の下準備

1. Rasprian をインストールしておく
1. インターネット接続ができることを確認しておく
1. 操作しやすくするため、SSHを有効にしておく

### Pelion Device Management ポータルへのログイン

Pelion Device Management ポータルへログインするには、 まず Mbed のアカウントを取得しログインします。

- [Log in / Sign up | Mbed](https://www.mbed.com/login/mbed/)

そして、下記ページを開き、中段の [request access here](https://console.mbed.com/cloud-registration) のリンクがから Pelion Device Management 接続のリクエストをします。簡単なアンケートに答えてリクエストすると、 Trial としてアクセスできるようになります。

- [Pelion Device Management | Quick Connect](https://cloud.mbed.com/guides/connect-device-to-pelion)

```
Before we start, let's make sure you have everything you need:
...
Access to Pelion Device Management - request access here. 
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/076ed5ad-47f0-94d2-c76e-b15752d68125.png)


### Pelion Device Management ポータルからクレデンシャルを取得する

Pelion Device Management ポータルへログインできたら、クレデンシャルを発行します。

1. [Mbed Cloud ポータル](https://portal.mbedcloud.com/) にログインする
2. _Device identity_ > _Certificates_ を開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/43c5a37b-915e-92c2-1039-e024fa38574a.png)

3. 画面右上の _New Certificate_ > _Create a developer certificate_ をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/4540c017-02f3-8dc7-5a54-fc6c4e9ed8af.png)

4. _Name_ と _Description_ (任意) を入力して、 _Create certificate_ をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/e66ec666-f9d9-a784-464e-2260e1adce9f.png)

5. 作成された _certificate_ の名前をクリックすると詳細が表示されるので、 _Download Developer C file_ をクリックして証明書の C ファイルをダウンロードする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/20b96e8a-390f-5b6b-1150-9772f5a2e8e2.png)

Raspberry Pi でのセットアップ時に使うので、このファイルを Raspberry Pi に転送しておきます。

```bash
scp <path-of-the-credential>/mbed_cloud_dev_credentials.c pi@<your-raspberry-pi-ip-address>:~/
```

### Raspberry Pi に enebular-agent をインストールする

次に、Raspberry Pi に _enebular-agent_ をインストールします。

_enebular-agent_ は利用する環境によって _Port_ が異なります。今回は、 _mbed cloud_ と接続するため _Local_ ポートで設定します。

インストールスクリプトは、デフォルトの _Port_ が _AWS IoT_ なので、明示的に _Local_ を指定してインストールします。

- [enebular-runtime-agent/tools/install at master · enebular/enebular-runtime-agent](https://github.com/enebular/enebular-runtime-agent/tree/master/tools/install)

それでは、SSHで Raspberry Pi にログインし、下記コマンドを実行しましょう。

```bash
# Local ポートを指定して enebular-agent をインストールする
wget -qO- https://raw.githubusercontent.com/enebular/enebular-runtime-agent/master/tools/install/install.sh | sudo -E bash -s -- --port=local
```

以下のように表示されたら、インストール完了です。

```bash
...
---------
 enebular-agent has been successfully installed ✔
 Version: 2.2.0
 Location: /home/enebular/enebular-runtime-agent
 User: enebular
 enebular-agent is running as a system service.
 To check the status of agent, run the following command on the target device:
   sudo journalctl -ex -u enebular-agent-enebular.service
---------
```

### Raspberry Pi に enebular-agent - Mbed Cloud Connector をセットアップする

次に、Pelion Device Management に接続するため、 Mbed Cloud Connector をセットアップします。

- [enebular/enebular-runtime-agent-mbed-cloud-connector](https://github.com/enebular/enebular-runtime-agent-mbed-cloud-connector)

ここで必要になる Mbed CLI Tools については、こちらも併せてご参考ください。

- [Mbed Cloud Documentation | Device and tool requirements](https://cloud.mbed.com/docs/current/cloud-requirements/tool-requirements.html)

それでは、SSHで Raspberry Pi にログインしたままで、下記を実施します。

```bash
# Mbed CLI tool をインストールする
sudo apt install cmake
sudo apt install mercurial
sudo pip install --system mbed-cli

# enebular-runtime-agent-mbed-cloud-connector リポジトリを mbed プロジェクトとしてインポートする
mbed import https://github.com/enebular/enebular-runtime-agent-mbed-cloud-connector.git
cd enebular-runtime-agent-mbed-cloud-connector

# 先ほど用意した mbed_cloud_dev_credentials.c をプロジェクト配下に配置する（同名のファイルがあるので上書きする）
mv -f ~/mbed_cloud_dev_credentials.c .

# ビルドする
python pal-platform/pal-platform.py fullbuild --target x86_x64_NativeLinux_mbedtls --toolchain GCC --external ./../define.txt --name enebular-agent-mbed-cloud-connector.elf
```

下記のように表示されれば、ビルド完了です。

```bash
2018-11-17 20:06:20,992 - pal-platform - INFO -
Completed fullBuild running for target = x86_x64_NativeLinux_mbedtls
With toolchain = GCC.
Output directory: enebular-runtime-agent-mbed-cloud-connector/out
```

生成された `<project-directory>/out/Release/enebular-agent-mbed-cloud-connector.elf` を起動することで、 Pelion Device Management にデバイス登録・接続を行います。

```bash
# enebular-agent mbed cloud connector をバックグラウンドで起動する
sudo ./out/Release/enebular-agent-mbed-cloud-connector.elf &
```

この状態で、 Pelion Device Management の _Device directory_ > _Devices_ を開くと、登録したデバイスが _registered_ という _Status_ で表示されていれば成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/d68b39f9-37cf-b87a-3647-1876d30dd3ac.png)


これで、 Raspberry Pi の準備が整いました！

### enebular で Connection を作成する

つぎに、 enebular の設定に移ります。Pelion Device Management(mbed cloud) と接続する Connection を作成しましょう。

1. Pelion Device Management ポータルで、 _Access management_ > _API keys_ を開き、 _+ NEW API KEY_ をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/2a388abc-c808-3006-0f53-7e4b433f25ed.png)
2. _API key name_ に任意の名前を入力し、 _Crate API Key_ ボタンをクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/0bea3e48-f9f1-47a4-d439-205a2b7a9df7.png)
3. 表示された API キーをコピーする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/3fba9d71-e905-d7af-0d7f-90d5cdb69483.png)
4. enebular のポータルで、プロジェクトを作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/27b4f5db-7ace-f60b-1e54-5707e5299893.png)
5. _Mbed_ を選択し、 _Connection Name_ に任意の名前を、 _MBED API Key_ に先ほどコピーしたキー文字列を張り付け、 _Save_ ボタンをクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/e85aaba4-991b-94a5-b4fe-afebd58b1672.png)

これで、 Pelion Device Management (mbed cloud) を利用する Connection 野設定ができました。

### enebular で作成したフローを Pelion Device Management 経由で Raspberry Pi にデプロイする

それではいよいよ、 enebular で作成したフローを、 Pelion Device Management 経由で Raspberry Pi にデプロイしてみましょう！下記ドキュメントを参考に進めます。

- [Example: mbed Cloud · GitBook](https://docs.enebular.com/ja/deploy/deployflow/mbed/)

1. 先ほど作成したプロジェクトで、新規フローを作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/83946b4d-ba5a-fbd2-45d2-2a90f683c743.png)
2. 任意のフローを作成し、 _Deploy_ しておく
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/d8f48442-921c-36ea-bf80-00f7804b51ac.png)
3. _Deploy_ ボタンの横の下矢印▼から _Export to Other Services_ をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/c56f042f-aaaf-c53e-9ad0-5c646ba7c357.png)
4. _Connection_ を選択する画面が開くので、先ほど作成した _Connection_ を選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/9349d737-7408-502f-cd61-2ee81f5c449d.png)
5. 対象の ＿Target_ の _Status_ が _connected_ になっていることを確認し、チェックを付け、 _Deploy_ ボタンをクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/781645c7-7bd8-bce9-e0a3-eb66f95a3a55.png)
6. デプロイされたメッセージが表示されたら、Raspberry Pi でも確認してみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3812/513259b8-4a72-2c06-cc81-6f4b5eb99c86.png)

Raspberry Pi で下記コマンドを実行します。

```bash
# enebular-agent-enebular サービスのログを表示する
sudo journalctl -ex -u enebular-agent-enebular.service
```

_enebular-agent-enebular_ サービスのログに、以下のようにデプロイしたフローが表示されていれば成功です！

```bash
Nov 17 22:57:16 raspberrypi node[1417]: localhost enebular-agent[1417]: info: Updating flow module=node-red, context=internal
Nov 17 22:57:16 raspberrypi node[1417]: localhost enebular-agent[1417]: info: Downloading flow: https://uhuru-enebular-agent-manager.s3.ap-northeast-1.amazonaws.com/production/8d49cdf9-a7f3-4882-9fb0-d4a42a50
Nov 17 22:57:17 raspberrypi node[1417]: localhost enebular-agent[1417]: info: Updating package { flow:
                                           [ { id: 'c60b379f.b5d768', type: 'tab', label: 'Flow 1' },
                                             { id: '69ae8d66.28d3c4',
                                               type: 'inject',
                                               z: 'c60b379f.b5d768',
                                               name: '',
                                               topic: '',
                                               payload: '',
                                               payloadType: 'date',
                                               repeat: '',
                                               crontab: '',
                                               once: false,
                                               x: 129.09896850585938,
                                               y: 102.484375,
                                               wires: [Array] },
                                             { id: '825e2a42.150298',
                                               type: 'debug',
                                               z: 'c60b379f.b5d768',
                                               name: '',
                                               active: true,
                                               console: 'false',
                                               complete: 'false',
                                               x: 293.0963439941406,
                                               y: 102.44270324707031,
                                               wires: [] } ],
                                          cred: {},
                                          packages: {} } module=node-red, context=internal
Nov 17 22:57:18 raspberrypi node[1417]: localhost enebular-agent[1417]: info: Agent state change: unauthenticated => registered context=internal
Nov 17 22:57:18 raspberrypi node[1417]: localhost enebular-agent[1417]: info: Starting authentication... module=device-auth, context=internal
```

以上です。これで Raspberry Pi のフロー開発も楽になりますね！

Epilogue - おわりに
====
無事デプロイできてほっとしております。

実は、当初、mbed cloud に Raspberry Pi を登録せねば！と張り切って Yocto で証明書入りのOSイメージを作成して… とやってみたのですが、登録できてもOSがブートせず「？？？」。meetup の運営スタッフの皆さまにアドバイスをもらい、 agent を使えばいいことを教えてもらってようやくできたのでした！