さくらのモノプラットフォームを使用したアプリケーション開発　第４回

## 初めに
　本記事は、さくらインターネット株式会社により開発環境が用意されているモノプラットフォームを使用する記事です。IoT向けのサービスを作成したい人、扱い人を対象としています。M5stackを利用してさくらのモノプラットフォーム及び、さくらのモノプラットフォーム開発基板を使用した開発について説明しています。

　この連続記事は
１回目　システムと全体の構成の説明
２回目　ハードウェアの組み立て
３回目　モノプラットフォームの設定
４回目　クラウドアプリケーションの作成
のような順番で進めてきました。

第１回目の記事は[こちら](https://qiita.com/shinfrom/items/715c2255b173bd2dabdc?fbclid=IwAR3oqqowBvhYcmDrVxEZiGN2Xlm26QCgn8HzJ7z7cUvWsSuD5vyfxCITYww)です。
第２回目の記事は[こちら](https://qiita.com/shinfrom/items/0b813d01c8522356c3c4)です。
第3回目の記事は[こちら](https://qiita.com/shinfrom/items/691a82daf136ab1f6d81)です。
今回は4回目の記事となっています。実際にセンサーを使用して、環境モニタリングシステムを作成します。
## 最終的に作成するもの
　本連続記事では「IoTセンシング」、「マイコンでのプログラムと書き込み」、「モノプラットフォームの設定」、「クラウドアプリケーション」「データの可視化」、「はんだ付け」について説明しており、サンプルアプリケーションとしてIoT環境モニタリングシステムを作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/bb82b037-c7bf-3bf5-baf6-caef6b0e17ae.png)
## この記事の対象者
- さくらのモノプラットフォームを体験してみたい人
- IoTを体験してみたい人
- 開発基板を請求したがその後どうして良いかわからない人
- webエンジニア、ソフトウェアエンジニア
を対象としています。
## 事前準備
- 開発基板の調達
- さくらのアカウントの作成
- ArduinoIDEのインストール
- Googleアカウントの準備
- 部品の調達
[こちら](https://qiita.com/shinfrom/items/d195c30ea8da26de56a6)のページを参考にします。
組み立てやプログラムの書き込みについては、[こちら](https://qiita.com/shinfrom/items/0b813d01c8522356c3c4)のページを参考にしてください。
→[さくらのモノプラットフォームを使用したアプリケーション開発　第2回](https://qiita.com/shinfrom/items/0b813d01c8522356c3c4)
## 今回の開発の流れについて
今回は、BME280という環境センサーを使用した環境モニタリングシステムの開発を例として説明します。
1 仮想マシンの作成
2 仮想マシンへの接続と開発環境の構築
3 デバイスの準備とマイコンへのプログラムの書き込み
4 アプリケーションサーバーでのデータの受信確認と可視化の確認
5 ストレージに保存されたデータの可視化
の順番で説明しています。

## 実際の開発
### 1 仮想マシンの構築
[事前準備](https://qiita.com/shinfrom/items/d195c30ea8da26de56a6#gcp-compute-engine%E3%81%AE%E6%BA%96%E5%82%99)で用意したGCPのアカウントで仮想マシンを構築します。
※GCPを使用するためにはクレジットカードの登録が必要ですが無料枠が用意されています。


GCPのトップ画面からコンソールに入っていきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/5576e89a-2f15-3fb4-1953-adc8ae776f11.png" width=60%>
コンソールからCompute Engineに入ります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/44885c21-ea96-6117-ccc2-209405a21934.png" width=60%>
インスタンスを作成します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/f4abe939-143d-b7db-7fcc-d2a78c3b3ec9.png" width=60%>
下記のような内容で仮想マシンを作成します。
無料分を消費してしまうと、課金されますので注意していください。
|  項目|入力例  |
|---|---|
|名前 | environment-monitoring-system |
|リージョン|  asia-northeast2（大阪）|
|シリーズ|E2|
|マシンタイプ|e2-micro|
|ブートディスク| ubuntu |
|バージョン|  ubuntu 20.04 LTS x86/64, amd64 focal image built on 2023-03-02, supports Shielded VM features|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/4d62406f-273e-05f9-e80d-343d6428fa90.png)
認証が必要になることがあります。認証が必要な場合には画面の指示に従って認証を行ないます。

仮想マシンが立ち上がったら必要なポートを開けていきます。
アプリケーションで使用する1800番のポートと3000番のポートを開ける必要があります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/d4f319ed-4cb5-b3f0-7ba2-01494b1af743.png" width=60%>
ファイアーウォールの設定に入って、ファイアーウォールルールを作成していきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/89dc4636-0122-0574-d6ee-f3c3bc56bf12.png" width=60%>
以下のような設定でファイアーウォールルールを作成します。
| 項目|入力例  |
|---|---|
| 名前 | node-red-grafana |
| 説明 | node-redとgrarfanaが使用するポートです |
| ログ | オフ |
| ネットワーク| default |
| 優先度 | 1000 |
| トラフィックの方向 | 上り |
|一致した時のアクション | Allow|
| ターゲット | ネットワーク上のすべてのインスタンス |
| ソースフィルタ | IPv4範囲 |
| 送信元IPv4範囲 | 0.0.0.0/0, 192.168.2.0/24 |
| 2番目のソースフィルタ | なし |
| 送信先フィルタ | なし |
| プロトコルとポート | 指定したプロトコルとポート |
| TCP | 1880, 3000 |

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/e1118eb3-88a5-506f-84cf-4d3f7e75038b.png" width=60%>

ファイアーウォールのルールが作成できて、ポートが開放されていることを確認します。
この時に22番ポート(ssh接続)が開いていなかったら、22番ポートも開けておく必要があります。

### 2 仮想マシンへの接続と開発環境の構築
仮想マシンへsshで接続します。
仮想マシンのコンソールでsshというボタンを押すことで、新しいウィンドウが開いて、ブラウザからssh接続することが出来ます。認証の必要があれば認証します。
※この時に22番ポートが開いていないとssh接続することができないので注意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/9ec02961-0af8-9ab9-65aa-403b8b6c68df.png)

ssh接続の確認が出来たら、必要なスクリプトを仮想マシンにダウンロードして実行します。
スクリプトは[こちら](https://github.com/shinrinakamura/sipf_sample_cloud)に用意しています。
仮想マシンのコンソールに下記のコマンドを入力して使用します。
```bash
git clone https://github.com/shinrinakamura/sipf_sample_cloud.git
bash sipf_sample_cloud/sipf_sample_cloud.sh
```
このスクリプトを実行すると、Node-REDのインストール、必要になるノードの追加、influxDBのインストール、使用するデータベースの作成、grafanaのインストールを行うようになっています。
Node-REDのインストール中に質問をされます。ユーザーの認証をするか聞かれるまでyesと答えます。
ユーザーの認証もyesと答え、ユーザー名とパスワードを指定することにより、Node-REDにアクセスするときにユーザー名とパスワードを入力することを求められるようになります。ユーザー認証をすることを推奨します。
後の質問については、デフォルトで提案されているものを指定して結構です。
入力内容を間違えるとエラーが出てインストールに失敗するので、その時は仮想マシンを作成しなおして再挑戦します。
#### 3 デバイスの準備とマイコンへのプログラムの書き込み
[事前準備](https://qiita.com/shinfrom/items/d195c30ea8da26de56a6#%E5%BF%85%E8%A6%81%E3%81%AA%E6%A9%9F%E6%9D%90)で紹介した温湿度センサー(BME280)とM5stackを接続します。GROVEコネクタ対応のケーブルがある場合には、M5stackのGROVEコネクタに接続します。
（写真）
[こちら](https://qiita.com/shinfrom/items/0b813d01c8522356c3c4#%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)の記事を参考に必要なプログラムをインストールしておきます。
ArduinoIDEを開きます。
ファイル→スケッチ例からテスト用のプログラムを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/a182a726-0262-9923-2bb0-221a2da915cd.png)
今回使用するプログラムはカスタムライブラリのスケッチ例のところにありますので、esp_sipf_clientからsample_environ_sensorを選択することで、今回使用するプログラムを開くことが出来ます。
このプログラムをM5stackに書き込むことで、M5stackで取得した、温度、湿度、気圧情報をモノプラットフォームにアップロードすることが出来ます。
書き込み方がわからない場合は、[こちら](https://qiita.com/shinfrom/items/d195c30ea8da26de56a6#%E5%BF%85%E8%A6%81%E3%81%AA%E6%A9%9F%E6%9D%90)の記事を参考にされてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/6c8838ea-a0c1-1966-f598-ab8108bd7414.png" width=60%>

#### 4 アプリケーションサーバーでのデータの受信確認と可視化の確認
必要なファイルをローカルPCにダウンロードします。
[こちら](https://github.com/shinrinakamura/monoplatformSampleApplication)からダウンロードして、任意の場所に解凍しておきます。
GCPのコンソールに戻って、外部IPドレスを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/7409335a-ac1f-75f4-7aac-a55b155b7f76.png)
確認した外部アドレスの1880番ポートに接続します。
（例えば外部IPが192.168.0.1であるならばブラウザのアドレスバーに192.168.0.1:1880と入力するとNode-REDにアクセスすることが出来ます。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/2c4ccb92-7411-2329-c801-b3e20fbea2c1.png" width=60%>
ユーザー認証をするを選択した人は、ユーザー名とパスワードを入力してログインします。
Node-REDのフローをローカルPCにダウンロードします。
Node-REDにフローをインポートします。
右上のハンバーガーメニューから読み込みを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/c7483f9e-c667-7551-1875-6cf260f63fb1.png" width=60%>
フローの読み込みでクリップボードを選択して、読み込むファイルの選択を押すとエクスプローラが開きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/7d003d3a-6de5-3ac7-f555-0373bc2af390.png" width=60%>
先ほどダウンロードして解凍したフォルダからmonoplatformSampleApplication/monoplatformSampleApplication/Node-RED-sample
/Environmental_Data_Visualization_Flow.json
を選択して読み込みます。
読み込みが終わったらデプロイします。
※説明した手順で、開発環境を構築しているとそのままデプロイして大丈夫ですが、そうでない場合、不明なノードがありますというエラーが出ますので、その場合は必要なノードをインストールしてデプロイします。webソケットのプロパティが設定されていませんというエラーが出ている場合は、そのままデプロイして大丈夫です。
※Environmental_Data_Visualization_Flow.jsonとSimple_payload _extraction.jsonを同時にデプロイするとうまく動かないことがありますので、その時には片方のフローを消去して、片方のフローだけデプロイするようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/938707a4-d899-16de-7c9f-2915e40e06c2.png)
webソケットの設定をしていきます。モノプラットフォームと書かれているノードをダブルクリックすることで、webソケットの設定を開きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/5e633061-89b7-aff9-893d-43b6a57abf3f.png" width=60%>
パスには[３回目の記事で取得したURL](https://qiita.com/shinfrom/items/691a82daf136ab1f6d81#4-%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%97%E4%BF%A1%E3%81%AE%E6%BA%96%E5%82%99)を貼り付けます。
送信 / 受信に関してはペイロードを送信 / 受信を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/06bc1c56-02b1-f074-40df-62c754e37241.png" width=60%>
パスの設定まで終わったら、追加をして、デプロイをします。
これで、データの受信と可視化ができるようになりました。

続いてデータを受信できているか確認していきます。右上にあるデバッグボタンを押すことで、データの受信確認をすることが出来ます。
（デフォルトの状態では３０秒間隔でデバイスからデータを送信するようにしていますので、データの受信確認は３０秒以上行う必要があります。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/34091ec6-cc6e-e921-ae42-1ab15f831ec6.png)

続いて可視化した画面を確認していきます。
画面右上にある矢印を押した後にDashboardを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/1d0599d1-9835-b1ef-4578-6d533cf8a996.png" width=40%>
画面が変わるので、右上を向いた矢印をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/a8c3659b-a355-cfab-45a5-183b798113bf.png" width=40%>
新しい画面が開きゲージが表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/f6a8b0da-508b-162f-0502-7d2c8083baa1.png" width=40%>

### 5 ストレージに保存されたデータの可視化
最後にデータをストレージに保存して可視化する方法を説明します。
データベースの設定については、Node-REDのフローの中と、インストール用のスクリプトの中で行っていますので、今回は考慮しなくて大丈夫です。設定する必要があるときはNode-REDのフローの中のinfluxdbノードをダブルクリックして設定を開いて設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/8bce0d7a-4ae2-2f8a-4b8e-0f197ba0cd70.png" width=70%>

続いてストレージに保存されたデータを可視化していきます。
ブラウザからグローバルIPアドレスの3000番を開いてください。
アクセスの仕方がわからない場合は[こちら](https://qiita.com/shinfrom/private/d69804d3829fdcc86d8a#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A7%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%97%E4%BF%A1%E7%A2%BA%E8%AA%8D)に戻って確認します。
Grafanaにログインしていきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/e620131b-acea-99b6-1c00-13da41d37566.png" width=40%>
ユーザー名とパスワードはadmin, adminになっています。
最初のログインの時に、ユーザー名とパスワードを変更するか聞かれますので、必要があれば変更しておきます。

続いて、データベースとGrafanaを連携します。
トップページのハンバーガーメニューからAdministration, Data sourceを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/14c3b10f-990c-22cc-2824-04e1f70d9d73.png" width=60%>
Add Data Sourceを選択して、続いてinfluxDBを選択します。

連携するための情報を入力する必要がありますので、今回は必要最低限だけ入力します。
| 項目|入力例  |
|---|---|
| URL | http://localhost:8086 |
| database | EnvironData |

を入力して、Save & testをクリックします。
認証などは行っていませんので、運用には十分に注意します。

データの連携が終了したら、ハンバーガーメニューからdashboardsに入っていきます。
Newボタンを押して、importを選択します。
画面が切り替わったらimport dash boardを選択するとエクスプローラーが開きます。
先ほどダウンロードして、解凍しておいたフォルダからmonoplatformSampleApplication/monoplatformSampleApplication/Grafana-sample
/Environment system2-1687955351911.jsonを選択します。
Loadボタンをクリックして画面が変わった後にimportをクリックするとdashboardが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/44d97fdf-8783-8526-710a-48feef3302ef.png)
これでストレージに保存されたデータの可視化まで終了しました。

## 終わりに
　いかがでしたでしょうか。今回はさくらのモノプラットフォームを利用した環境センサーを開発してみることで、IoTアプリケーションの開発の流れを体験してみました。今回体験したことを応用することにより、自分の暮らしを便利にするものや、役に立つものを作ることが出来るようになります。
　本連続記事の内容を実行することで、さくらのモノプラットフォームの使い方もわかったのではないでしょうか。本連続記事の内容を参考に自分にとって便利であったり役に立つアプリケーションをつくってもらうととても嬉しく思います。
　今回は簡潔なアプリケーションを作成しましたが、応用編として挑戦的な内容の記事も作成していく予定です。また、この連続記事を見るだけではよくわからないな（特にHWの部分）という声があれば、ワークショップの開催も検討します。ご意見ご感想お待ちしています。

## 関連記事
[さくらのモノプラットフォームを使用したアプリケーション開発　第1回](https://qiita.com/shinfrom/items/715c2255b173bd2dabdc)
[さくらのモノプラットフォームを使用したアプリケーション開発　第1.5回（事前準備編）](https://qiita.com/shinfrom/items/d195c30ea8da26de56a6)
[さくらのモノプラットフォームを使用したアプリケーション開発　第2回](https://qiita.com/shinfrom/items/0b813d01c8522356c3c4)
[さくらのモノプラットフォームを使用したアプリケーション開発　番外編](https://qiita.com/shinfrom/items/2bce28565778e495962b)
[さくらのモノプラットフォームを使用したアプリケーション開発　第3回](https://qiita.com/shinfrom/items/691a82daf136ab1f6d81)
## 参考情報
[さくらのモノプラットフォーム　開発者向け情報](https://iot.sakura.ad.jp/platform/development/)
[sipf-simple-websocket-viewer](https://github.com/sakura-internet/sipf-simple-websocket-viewer)
### 参考動画
[アルディーノIDE v2.0のインストール](https://youtu.be/su8pZzPY37I)
[Esp32をArduino IDEで使えるようにしよう](https://youtu.be/yGKforrbP74)
[0-1.GCPアカウント作成方法](https://youtu.be/mGtyJPeVwxM)
## special thanks
[さくらインターネット株式会社](https://www.sakura.ad.jp/)
[Engeneer cafe](https://engineercafe.jp/ja/)
[株式会社B&B Lab.](http://b-and-b-lab.jp/)