enebularでNefryクラウドつくってみる

こんにちは、わみです！
今回は、Nefryでつかったことのある人もいるかも…しれないNefryクラウドを自分で作ってみようと思います。

これを応用するとNefryにライブラリがないサービスとの連携も簡単にできるはずなのでぜひ試してみてください。

# enebularとは
![](https://qiita-image-store.s3.amazonaws.com/0/97208/e7da8498-a0bc-e6bf-5bbc-b6fc00b69c00.png)

https://enebular.com/
> enebular（エネブラー）は、IoT製品・サービスづくりを包括的に支援する、開発・運用サービスです。エッジとクラウドにまたがるIoTアプリケーションを開発し、様々なデバイスへ迅速にデプロイ、さらに膨大な量のデータを可視化やAIにより利活用することで、IoTアプリケーションの最適な運用を支援します。
enebularの名前は、星の数（nebular）ほどあるデバイスを、アップデートにより賢くし（enable）、分散しながら協調するアプリケーションの開発から由来しています。

Node-Redが動いており、今回はそれを使ってNefryクラウドを作ります。
個人的にはenebularは可視化がすぐれているのでまた別の機会に紹介したいと思います。

可視化のところについてはドキュメントもあるのでぜひ触ってみてください。
（他にドキュメントあれば教えてください。）
https://docs.enebular.com/ja/infomotion/sampleinfotypes
https://qiita.com/kitazaki/items/3919673acfd9bf7ac193

# MQTTブローカー

今回、MQTTを使ってNefryとenebularを繋ぎます。
（NodeRedにMQTTブローカーを立てられるNodeがあるのですが、使えないのでこの方法で説明します。）

いろんなMQTTブローカーサービスがありますが今回はCloudMQTTというサービスを使います。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/b6ff5619-6d3b-606c-658b-7c326d5baf7d.png)

https://www.cloudmqtt.com/

# MQTTブローカーの準備
https://www.cloudmqtt.com/

CloudMQTTにGoogleアカウントなどでログインすると、この画面に移動します。
「Create New Instance」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/24eaa3a2-7da3-9b8b-b7c7-f40e0ed01d1d.png)

名前に「Nefry」と入力して、Planは無料の「Cute Cat（Free）」を選びます。
選んだら「Select Region」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/e23b783f-9e2f-ad65-0325-5244fcf53c9e.png)

ここのサーバはデフォルトのままで大丈夫です。
「Confirm」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/f7435624-92e0-b1e2-ae0a-1fe86c95c6a1.png)

確認されるので問題なければ「Create Instance」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/579d4955-f6e5-5c23-3865-af696ccc11a2.png)

リストに戻るので、先ほど名前をつけた「Nefry」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/c24bce1a-44cd-1651-f10b-f12458dd9061.png)

ここで表示されている赤枠の内容が後で説明するNefryとenebularに設定するのでメモしておきましょう。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/eceef10c-b743-850e-d235-6258d41724b4.png)

これでMQTTブローカーの準備はできました！

# enebularの準備

https://enebular.com/

ログインをすると、このようなページになります。
まずはProjectを作成します。「Create Project」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/97c6fdfd-8eaa-5686-c7de-79110d4b4156.png)

「Nefry」と入力して「Submit」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/9d46db5d-bba4-8aeb-cb32-9b0de086bb57.png)

次にAssetを作成します。「Create Asset」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/bb916f34-2226-8a20-4f4d-aaf45d0b25db.png)

上から順に「Nefry」、「flow」、「nefry_cloud」と入力して「Continue」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/92e73c92-01e1-72e8-e289-6a5d108f75a5.png)

正常にAssetが作成できると、このような画面になります。
「Edit Flow」をクリックしてNefry Cloudのコードを設定します。
表示されるまでかなりの時間がかかります、ゆったりとした気持ちで待ってください。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/aa9a56e3-a139-4595-ab25-be91f3b16209.png)

右端にマウスを合わせると下にメニューが表示されます。
「Import」→「Clipboard」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/36bc7648-6974-b9d3-23c2-1a3f0d23c62e.png)


```json:インポートファイル
[{"id":"cb22f033.4e62a","type":"mqtt in","z":"6a204582.6319ec","name":"","topic":"nefry","qos":"2","broker":"","x":130,"y":620,"wires":[["2cd50412.05734c"]]},{"id":"2cd50412.05734c","type":"debug","z":"6a204582.6319ec","name":"","active":true,"console":"false","complete":"false","x":370,"y":620,"wires":[]},{"id":"4d73977f.4fdd38","type":"http in","z":"6a204582.6319ec","name":"","url":"/setdata","method":"get","swaggerDoc":"","x":150,"y":400,"wires":[["ad85572e.3b5728","c0f5a526.fcf308"]]},{"id":"c0f5a526.fcf308","type":"http response","z":"6a204582.6319ec","name":"","x":390,"y":400,"wires":[]},{"id":"c29d9658.b3e728","type":"mqtt out","z":"6a204582.6319ec","name":"","topic":"nefry","qos":"","retain":"","broker":"","x":530,"y":480,"wires":[]},{"id":"ad85572e.3b5728","type":"function","z":"6a204582.6319ec","name":"","func":"delete msg.req;\ndelete msg.res;\nreturn msg;","outputs":1,"noerr":0,"x":390,"y":480,"wires":[["c29d9658.b3e728"]]},{"id":"d51d5f34.d524b","type":"http in","z":"6a204582.6319ec","name":"","url":"/setdata","method":"post","swaggerDoc":"","x":150,"y":480,"wires":[["c0f5a526.fcf308","ad85572e.3b5728"]]},{"id":"724d4825.8d3ea8","type":"comment","z":"6a204582.6319ec","name":"Web → Nefryにメッセージ送信","info":"","x":190,"y":340,"wires":[]},{"id":"2a1ff8b0.532d38","type":"comment","z":"6a204582.6319ec","name":"Nefry → Webにメッセージ送信","info":"","x":190,"y":560,"wires":[]}]
```

上のJSONファイルをコピーして、enebularの入力欄に貼り付けます。
貼り付けたら、「Import」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/d16428b1-3e96-38dd-2960-64a514bdae0b.png)

上記の方法以外にも公式Twitterで教えていただいた方法でもいけるようです！

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">(前のツイートの続き)ちなみに記事中ではJSONをコピーしてImportするというのがありますが、 <a href="https://twitter.com/hashtag/enebular?src=hash&amp;ref_src=twsrc%5Etfw">#enebular</a> ではフローを共有する機能（Discover）がありますので、MQTTの設定前のフローを公開しておきましたのでForkしてご利用ください。<br><br>→ <a href="https://t.co/LMKj8e7MJ3">https://t.co/LMKj8e7MJ3</a></p>&mdash; enebular (@enebular) <a href="https://twitter.com/enebular/status/1039717867929759744?ref_src=twsrc%5Etfw">2018年9月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">なお <a href="https://twitter.com/hashtag/enebular?src=hash&amp;ref_src=twsrc%5Etfw">#enebular</a> でフローをForkして自分のProjectで利用する方法は、こちらにあります。<a href="https://t.co/SytrvmOmQE">https://t.co/SytrvmOmQE</a></p>&mdash; enebular (@enebular) <a href="https://twitter.com/enebular/status/1039717998968229888?ref_src=twsrc%5Etfw">2018年9月12日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


インポートできるとこんな感じになります。
初めにクリックしたところに配置されるので左上にマウスをずらしてそこでクリックするとよいでしょう！

![](https://qiita-image-store.s3.amazonaws.com/0/97208/5612bacf-e2b8-fe81-ad95-71d49ace8e37.png)

さてNefryと繋げるためにMQTTの設定をします。
画像に沿って順にクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/083c871c-7be1-7957-0e7d-3a29c908d8f6.png)

MQTTブローカーの準備の章で取得したサーバーとポートを設定します。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/e9de50c9-6b22-b5fc-89bc-39d8ec073a46.png)

Securityタブに移動し、MQTTブローカーの準備の章で取得したUserとPasswordを設定します。
設定が完了したら「Add」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/ead4c9eb-d924-8412-e966-18485aa79274.png)

設定が保存できれば、サーバの欄に先ほど設定したアドレスが表示されます。表示されていることを確認出来たら「Done」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/9fac5030-ee39-b977-1678-fc96179f92e6.png)

ついでにもう一つあるNodeも設定します。
画像に沿ってクリックすると、先ほど設定したアドレスが選択できるのでそれを選んで「Done」をクリックします。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/b6c6927f-34b2-04b3-dc7d-5ee597c1cc4b.png)

これで設定が完了したので右上にある「Deploy」と書かれた赤いボタンをクリックします。
しばらくするとデプロイが完了したと表示されるのでそれまで待ちましょう。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/20abeac8-b65c-550e-ce4c-64cbd7922560.png)

最後にnefryと書かれたノードの下に「connected」と出れば準備は完了です！

「connected」と出ない場合は先ほどのMQTTの設定が間違っている可能性が高いので見直してみましょう。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/3f18b6ad-eb0f-f758-fb3f-314dfeecd372.png)

# Nefryの準備

## ライブラリインストール

まずは、下準備としてひとつライブラリをインストールします。
「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」を選択します。

![2018-09-01_17h54_29.png](https://qiita-image-store.s3.amazonaws.com/0/97208/bb392a0d-98f6-65c8-857c-c1f26d39bc68.png)

ライブラリを管理をクリックするとライブラリマネージャーが表示されます。

マネージャー上部に検索欄があるのでそこに「pubsub」と入力すると下のような状態になります。
画像に沿ってインストールボタンをクリックしてライブラリをインストールしてください。
（ライブラリバージョン2.6.0での動作を確認しています。）

![2018-09-01_17h48_08.png](https://qiita-image-store.s3.amazonaws.com/0/97208/21bb01f6-108d-8e69-02df-e0f380e4cb1a.png)

「Installed」と表示され、インストールが完了したらその画面を閉じてください。

![2018-09-01_18h07_10.png](https://qiita-image-store.s3.amazonaws.com/0/97208/ea091a16-b622-d88b-bf5f-b82b358dd73f.png)


## プログラム作成

ライブラリのインストールが終わったところでプログラムを作成していきます。

Nefryクラウドと同じようにサーバからNefryに通知を投げる機能を実装していきます。

全体のコードはこちら！

```c++
#include <PubSubClient.h>
#include<Nefry.h>

WiFiClient httpsClient;
PubSubClient mqttClient(httpsClient);

void callback(char* topic, byte* payload, unsigned int length){
  Serial.print("Received. topic=");
  Serial.println(topic);
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void setup() {
  mqttClient.setServer("url", 1883);
  mqttClient.setCallback(callback);
}

void loop() {
if (!mqttClient.connected()) {
    String device = Nefry.getModuleName();
    if (mqttClient.connect(device.c_str(), "User", "password")) {
      Serial.println("Connected.");
      int qos = 0;
      mqttClient.subscribe("#", 0);
      Serial.println("Subscribed.");
    }
  }
  mqttClient.loop();
}
```

2か所修正します。

- `mqttClient.setServer("server", port);` MQTTブローカーの準備の章で取得したサーバーとポートを設定します。
- `mqttClient.connect(device.c_str(), "User", "password")`MQTTブローカーの準備の章で取得したUserとPasswordを設定します。

修正ができたらNefryにプログラムを書きこんでみましょう！

Nefryの準備も完了です！

# メッセージを投げてみよう

メッセージを投げるためにenebularのURLを取得します。

enebularのサイトに戻り、InformationのアイコンをクリックするとこのようにURLが表示されます。
このURL + /setdataでNefryにメッセージを投げることができます！

この画像の場合「 https://ev2-prod-node-red-8c9b84fa.herokuapp.com/setdata 」という形になります。

![](https://qiita-image-store.s3.amazonaws.com/0/97208/d2f2c1c0-6eb2-37ad-440b-f8eba6cb7de9.png)

皆さんそれぞれのURLをたたくと、Nefryのシリアルモニタに通知がいきます。

自由なメッセージを投げることもできます。

curlコマンドの例を置いておきます。

```
curl -i -X POST \
   -H "Content-Type:application/json" \
   -d \
'{
	"test": "hello"
}' \
 'https://ev2-prod-node-red-8c9b84fa.herokuapp.com/setdata'
```

# おまけ

上記の例はWeb→Nefryでしたが、もちろんその逆もできます。

NefryクラウドではNefry→Webに対応していないのでおまけとして記載します。

```
void loop() {
  if (!mqttClient.connected()) {
    String device = Nefry.getModuleName();
    if (mqttClient.connect(device.c_str(), "User", "password")) {
      Serial.println("Connected.");
      int qos = 0;
      mqttClient.subscribe("#", 0);
      Serial.println("Subscribed.");
    }
  }
  if(Nefry.readSW()){
     mqttClient.publish("nefry","push SW");//追加
  }
  mqttClient.loop();
}
```

このサンプルコードは、NefryのSWを押されたときにenebularにメッセージを送るものです。

このpublish関数を叩くとメッセージをサーバに投げることができるのでさらにいろんな連携ができるのではないでしょうか？

# まとめ

NefryとenebularをつかってNefryクラウドをつくってみました。

NodeRedには様々なサービスを簡単に追加して動かすことができる機能もあるので難しくないと思います。

今回のサンプルはメッセージを投げているだけなので様々なサービスを追加してぜひ遊んでみてください！！