センサーのログを取得・蓄積する仕組みの作り方(Node-RED + MongoDB Atlas)

概要

この教材では、IoTでお馴染みのセンサーを取得するところではなく、取得したデータを整形し、NoSQL型のデータベースシステムに蓄積、可視化する仕組みについて、自分で構築して学びます。

センサーを使ってデータを獲得する部分は、ArduinoやRaspberry Pi などいろいろありますが、プログラミングが苦手、書く時間が面倒な場合は、obniz が手軽です。

センサー取得データを取得する仕組み(Node-RED)の構築

Node-REDのインストールと起動

Node-REDの用語を改めて確認するには、https://nodered.jp/docs/user-guide/concepts をご覧ください。

手元のパソコン上に、Node-RED環境を構築する場合

仮想マシンを用意する

例として、仮想環境としてVirtualBoxを使っていますが、他の仮想環境でも構いません。以前に使ったものがあれば、それを複製(クローン)し、仮想マシンのIPアドレスとホスト名を変更すると、一から用意せずに手軽です。また、パソコン上に仮想マシンを用意せずに、パブリッククラウドの「PaizaCloud」を使うことも可能です。

< 以下は、VirtualBoxを使った場合の例 >

仮想マシンのスペック例

  • OS:Ubutnu Server 22.04

  • 仮想CPU割り当て数 : 1

  • 仮想メモリ割り当て:2048MB(2GB)以上

  • 仮想ディスク:40GB以上

  • ネットワーク設定:NAT + ホストオンリーアダプタの構成。ホストオンリーアダプタには、固定IPを割り当てること。

  • デスクトップ環境:なし

  • SSH接続:必須 ( ユーザー名 + パスワードでもOK )

仮想マシンの設定例

  • ホストオンリーアダプタの固定IP例:192.168.125.155

  • Your server’s name (ホスト名):ubuntu1iot

  • ユーザー名 : vboxuser

  • パスワード:任意のもの

作業環境

仮想マシンを実行しているパソコンから、ターミナルアプリ(Windowsなら「Tera Term」, Macなら「Terminal」)を使い仮想マシンの固定IPにSSH接続し、作業を行いましょう。

インストールスクリプトを使ってインストールを始める

Ubuntu 22.04 で実行している。なお、Raspberry Pi でも以下と同じ手順で、Node-REDのインストールと自動起動ができる。

sudo apt update -y sudo apt install -y build-essential git curl bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

下記のメッセージが表示される。y を入力してEnterキーを押す。

Are you really sure you want to do this ? [y/N] ? y

下記のメッセージが表示される。y を入力してEnterキーを押す。

Would you like to install the Pi-specific nodes ? [y/N] ? y

下記のメッセージが表示される。N を入力してEnterキーを押す。

自動起動設定を適用

Node-REDを起動する

構築したNode-REDを一時的に、インターネット上に公開したい場合

ngrokを使うことで実現できます。

パブリッククラウド上でインストールを行う場合

無料かつパブリッククラウドで、Node-REDを使う場合は、「enebular」があります。

AWSやMicrosoft Azure , IBM Cloud , Oracle Cloud 等の場合、OSとしてUbuntuを選択していれば前述のインストールスクリプトを使った方法で出来ます。Red Hat 系(Oracle Linuxを含む)の場合は、インストールスクリプトがUbuntuとは異なるため、RedHat系のインストールスクリプトは下記にてご確認ください。

Node-REDの初期セットアップ

Webブラウザで、http://仮想マシンのIPアドレス:1880(例 http://192.168.125.155:1880 )にアクセス。「Node-RED 3.0へようこそ!」画面の右上にある「X」をクリックして、「Node-RED 3.0へようこそ!」を閉じる。「開始」を押して、画面の説明を見ても良い。

MongoDB接続ノードのインストール

Node-REDの画面で、画面右上の「三」>>「パレットの管理」の順にクリック。

「ノードを追加」タブに切り替え、「mongodb-aleph」で検索。「node-red-contrib-mongodb-aleph」が見つかるので、「ノードを追加」をクリック。aleph は、ヘブライ文字の一文字目で、英語で言うところの「a」に相当するらしい。

確認のメッセージが表示されるので、「追加」をクリック。

追加作業が終わると下図のようなメッセージが表示される。

Node-REDの画面左端のサイドバーを「パレット」という。パレットに「mongodb-aleph-in」と「mongodb-aleph-out」が表示されていることを確認する。

センサー取得するデータベース(MongoDB Atlas)の導入

MongoDB Atlas の契約(クラウドNoSQL DB)

クラウド版のMongoDBを使います。

https://www.mongodb.com/ja-jp << にアクセスします。画面右上の「Try Free」をクリックします。MongoDB Atlas(クラウドサービス)の無料プランでセットアップされます。

「Sign up」画面で、ユーザー登録を行う。名前、姓、メールアドレス、任意のパスワードを入力後、「I agree to the Terms of Service and Privacy Policy.」にチェックを入れ、「Create your Atlas account」をクリックします。

下図のようなイラストが表示され、登録したメールアドレス宛に、確認メールが届きます。

「Verify Your MongoDB Email Address」という件名のメールです。「・・・mongodb.com さんからのコンテンツを信頼します。」をクリックすることで、メールには以下のようが画像が表示されます。メール内の「Verify Email」をクリックします。

「Continue」をクリックしましょう。

MongoDB Atlas にログイン

https://account.mongodb.com/account/login << にアクセスします。まず最初に登録したメールアドレスを入力し、「Next」をクリックします。

次は、登録したパスワードを入力し、「Login」をクリックします。

下図のような質問は、初回に聞かれずに、2回目以降にログインした時にこの画面が出ることもある。どんな目的でMongoDB Atlasを使うのか聞かれるので、今回はAPIがメインでJavaScriptを使うとして、「Finish」をクリック。他の回答でも良い。

多要素認証の設定を勧められますが、後でも出来るので「Remind me later」をクリックします。

「Close」をクリックします。こちらの設定も後でやっても良いでしょう。

データベース(MongoDBクラスター)の作成

クラスターの作成

「Build a Database」をクリックします。

「Next」をクリックします。「Cluster0」という名称のクラスターが作成されます。特にこだわりがなければ「Auto Setup」を使います。AWS、GCP、AzureのいずれかにMongoDBの環境を構築してくれます。「Manual」を選ぶことで、マルチクラウド構成も取ってくれます。

表示されている「Username」と「Password」をメモしておきます。「Copy」を押すとパスワードを取得することができます。その後、「Create Database User」をクリックします。

「Choose a connection method」をクリックします。

MongoDB Atlas への接続方法についてガイドをしてくれます。ここでは「Close」をクリックするか、「X」をクリックします。

MongoDB Atlas上で、クラスターが作成されました。AWS 東京リージョンで稼働していることがわかります。また、「Connect」をクリックすると、上の図が再び表示され、MongoDB Atlasに接続するための情報や手順を確認することができます。

データベースの作成

「Browse Collections」をクリックします。

「+Create Database」をクリックします。

「Create Database」の画面が表示されます。「Database name」と「Collection name」にそれぞれ入力し、「Create」をクリックします。「Database name」と「Collection name」は英数字のみです。

クラスター内にデータベースを作成することができました。このデータベースは、NoSQLです。RDBではありません。

画面左側の「Database」をクリックして、データベース(MongoDBクラスター)の画面に切り替えます。

アクセスするIPアドレスの制限を行う

画面左側の「Network Access」をクリックします。

初期状態では、今現在あなたが利用しているネットワークのグローバルIPアドレスが設定されています。今いるところと別の場所からMongoDBに接続する場合は、この画面で「EDIT」をクリックして変更します。今使っているネットワークのグローバルIPアドレスを知りたい場合は、 にアクセスするとわかります。

「Edit」をクリックすることで、IPアドレスの書き換えができます。書き換え後、「Confirm」をクリックします。これで書き換え完了です。

変更が反映されるまで待ちます。Statusが、Active になるまで待ちましょう。

画面左側の「Database」をクリックして、データベース(MongoDBクラスター)の画面に切り替えます。

データベース画面。

Node-REDにMongoDBを接続する

センサー情報を集約する仕組みとしてのNode-REDを使い、集めたデータをMongoDBに送信できるようにします。

接続情報の取得

「Connect」をクリックします。

接続方法についてガイドが表示されますので、「Drivers」をクリックします。

プログラミング言語別の接続情報が表示されます。「Driver」の箇所を変更することで、PythonやJava等を使う場合のMongoDB Atlas内のデータベースへの接続情報を確認することができます。ここでは、Node-REDを接続先とするため、「Driver」は「Node.js」になります。

3. Add your connection string into your application codeに表示されている2行程度のコードをコピーします。メモ帳アプリ等に貼り付けておきます。2行程度のコードに書かれている情報を使って、Node-REDに接続します。コピー後、「Close」をクリックします。

Node-REDから、MongoDBに接続する

サンプルフローを使って、Node-REDからMongoDBの接続方法を確認

接続を確認するために、Node-REDに以下のサンプルを読み込みます。Node-REDの画面右上の「三」>>「読み込み」の順ににクリックします。「フローを読み込み」画面で、下記のコードをコピー&ペーストします。

「読み込み」をクリックします。

「MongoDB 接続サンプル」のタブが追加されます。

「myDB@….」と表示されているノード(箱状の部品)をダブルクリックします。これは、「mongodb-aleph-out」を使っています。

「mongodb-aleph-outノードを編集」画面が表示されます。ペン型のアイコンをクリックします。

「ホスト」は、MongoDB Atlasの画面でコピーした「mongodb+srv://…」で始める2行の文字列から、@より後、/(スラッシュ)の手前までをコピーし、貼り付けます。例 cluster0.abc2cba.mongodb.net 。
「データベース」は、MongoDB Atlasで作成したデータベース名 を入力します。例 myDB
「ユーザ」は、クラスターを作成した際にデータベースのユーザー名を表示されたものを入力します。
「パスワード」は、クラスターを作成した際にデータベースのパスワードに表示されたものを入力します。4つの値を入力後、「更新」をクリックします。

「コレクション」には、MongoDBでデータベース作成時の作成したコレクション名を入力します。例 myCollection

「操作」には、「insert」を指定します。その後、「完了」をクリックします。

画面右上の「デプロイ」をクリックします。

「inject」ノードのボタンをクリックします。「inject」ノードの中身は、temprature という変数に、28 という数値が挿入され、次の処理でデータが引き渡されます。

MongoDB Atlasのデータベース画面を見ると、Node-REDから届いたJSON形式のデータが、データベースに蓄積されていることがわかります。データベース画面から、「Browse Collections」をクリックすることで確認することができます。

サンプルとして動かしたフローの説明

「inject」ノードをダブルクリックすることで、送信する数値を変更することができます。

変更後、「完了」をクリックします。その後、画面右上の「デプロイ」をクリックします。

数値を変更後、「injectノード」のボタンをクリックします。これを数回繰り返します。数回繰り返すことで、異なる値のデータが、データベースに蓄積されます。

「inject」ノードは、数値を送るためだけに使っています。実物のセンサーがある場合は、Raspberry PiやM5Stack、obniz 等を経由でセンサー情報を受け取るように変更しましょう。obnizを使っている場合は、例として があります。実物のセンサーがある場合は、MQTTなどを使い、センサーのデータを取得し、それを後続のfunctionのノードで、MongoDB向けに整形することになります。

「funtion 1」となっているfunctionノードをダブルクリックして開くと、MongoDBに送信するためのデータ加工の手続きについて記載してあります。

ここでは、functionノードの直前のノードから届くデータの他に、「msg.type」にはセンサーの識別名、「msg.date」にはデータの取得日時といった追加情報を記載しています。functionノードから線が伸びているノードは、mongodb-aleph-out ノードで、MongoDBにデータ送信されます。functionノードを編集した場合は、「完了」をクリックします。その後、画面右上の「デプロイ」をクリックします。

「debug 1」と表示している「debug」ノードは、オブジェクト全体を取得し、Node-REDの画面右側のデバッグタブに、処理したデータを表示します。

画面右側のデバッグタブには、以下のように表示されます。ゴミ箱アイコンをクリックすると、デバッグログを削除することができます。

データベースに蓄積したデータを可視化してみる

データの可視化

データベース画面で、「VISUALIZE YOUR DATA」を使って可視化を行う方法

MongoDBに蓄積したデータ、今回のサンプルでは、日付と時間、温度(仮のデータ)を蓄積していますので、折線グラフで表示できるようにします。

データベース画面で、「VISUALIZE YOUR DATA」をクリックします。ここでは、データベース名を「myDB」、コレクション名を「myCollection」としています。

「Select Data Source」の画面が表示されます。「Project」で、使っているクラスター(例として、Cluster0)、データベース内のコレクションで、「Select」をクリックします。ここでは、Node-REDに接続しているデータベースおよびコレクションを選択します。

「Add Chart」画面が表示されます。画面左側の「FIELDS」には、データベース内の項目(フィールド)を、「X Axis」や「Y Axis」にドラッグ&ドロップします。まずはドラッグ&ドロップする前に、「CHART TYPE」折線グラフように「Discrete Line」に変更します。

温度を時系列で折線グラフで表示したいので、「CHART TYPE」が「Discrete Line」になっていることを確認し、「X Axis」と「Y Axis」を下図のように設定します。設定後、「Save and close」をクリックします。

「Save to」の画面が表示されます。「Dashboard title」を入力し、「Save」をクリックします。

ダッシュボードが表示され、作成したチャート(温度を時系列で表示する折線グラフ)を表示することができます。

Charts タブから可視化を行う方法

データベース画面内の「Charts」タブをクリックします。

「Welcome to Charts」のメッセージが表示されます。「Start」をクリックします。

データの可視化は、「Chart builder」を使います。「Select」をクリックします。可視化のためのチャート作成画面が表示されます。

作成済みダッシュボードの表示

データベース画面内の「Charts」タブをクリックすることで、ダッシュボード画面に切り替わります。作成済みのダッシュボードをクリックすることで、チャートを表示することができます。

そのほかの可視化方法

<< MongoDBは、この教材で扱ったMetabaseと接続できるため、Metabaseを使って、MongoDBに蓄積したデータを可視化しても良いでしょう。

応用課題

  • obniz ボードとセンサーを使って、センサーの計測値をMongoDB Atlasに蓄積できるようにしてみよう。

  • MongoDBでは、UTC(世界標準時)の時刻データを格納しています。日本時間に対応する場合は、どうしたら良いか考えてみよう。