解説:センサーデータの収集フロー

今回は、Node-RED con 2023の発表で使用したフローの解説を行います。

全部で3回の予定です。1回目は、センサーデータをデータストアに保存するフローについてです。

センサーからデータを取得するフロー

動作確認

今回はOMRONのUSB型の環境センサーを使いました。

まずは、Raspberry Pi上に環境センサーを接続して、Raspberry Pi OS上のNode-REDまたはenebular editorで動作を確認します。

Raspberry Pi OS上でenebular editorをインストールする方法はドキュメントを確認してください。

Linux用enebular editorのインストール

フローはDiscoverにも公開しています。直接自分のプロジェクトにインポート可能です。

OMRON環境センサーからデータを取得するフロー

まず最初のフローはデータ取得するコマンドを発行し、環境センサーに送ります。

Functionノードのプロパティ

var buf = new Buffer([0x52, 0x42, 5, 0,0x01,0x22,0x50,0xe2,0xbb]);
msg.payload = buf;
return msg;

シリアルポートノードのプロパティ

次のフローでは、取得したデータをFunctionノードで整形しています。

var crc = 0xFFFF;
var odd;

for (var i = 0; i < msg.payload.readInt16LE(2)+2; i++) {
    crc = crc ^ msg.payload[i];

    for (var j = 0; j < 8; j++) {
        odd = crc & 0x0001;
        crc = crc >> 1;
        if (odd) {
            crc = crc ^ 0xA001;
        }
    }
}
if ( crc== msg.payload.readUInt16LE(msg.payload.readInt16LE(2)+2)){
    temperature= msg.payload.readInt16LE(8)/100;
    humidity= msg.payload.readInt16LE(10)/100;
    light= msg.payload.readInt16LE(12);
    pressure= msg.payload.readInt32LE(14)/1000;
    sound= msg.payload.readInt16LE(18)/100;
    etvoc= msg.payload.readInt16LE(20)/100;
    eco2= msg.payload.readInt16LE(22);
    discomfortindex= msg.payload.readInt16LE(24)/100;
    heatstroke= msg.payload.readInt16LE(26)/100;
    msg.payload=
    {
        temperature: temperature,
        humidity: humidity,
        light: light,
        pressure: pressure,
        sound: sound,
        etvoc: etvoc,
        eco2,
        discomfortindex: discomfortindex,
        heatstroke: heatstroke
    }
    msg.timestamp = Date.now();
    return msg;
}

インジェクトノードを実行してみると、Debugノード上でセンサーデータを確認できます。

enebularにフローをアップロードする

もし、Node-REDを使って先ほどのフローの動作確認をしていた場合は、flow.jsonなどにしてenebularにアップロードしましょう。

enebularにアクセスして、空のフローを作成します。

フローの概要の更新ボタンをクリックします。

フローの更新ダイアログでflow.jsonのファイルを選択して、下にある読み込みボタンをクリックします。

もし最初からenebular editorを使っていれば、フローを保存したタイミングでenebularのクラウドにフローが保存されますので、ここまでの手順は不要です。

次に、フローの内容を確認したいのでここで編集ボタンをクリックします。すると、ブラウザー上でWeb上にあるフローエディターが起動し始めます。

Raspberry Pi上でブラウザを起動するともしかすると動作が遅いかもしれません。ここからは、PC上のブラウザを使った方がよいかもしれません。

起動が終わると、フローエディターが表示されますが、場合によっては、ノードがUnknownになっていることもあります。その場合はパレットの管理から該当のノードを追加してください。

センサー値をデータストアに保存するフロー

先ほどのフローを少しだけ改変して、センサー値をデータストアに保存するフローにします。

右下の青い印が付いているのが追加したフローです。

それぞれのプロパティは次の通りです。

データストアのプロパティには、フローのある同じプロジェクトのデータストアのテーブルIDが必要です。詳しくはこちらのブログ記事をご覧ください。

データストア機能のご紹介

ターゲットデバイスの準備とデプロイ

デバイス用のフローはクラウドにあるWeb Editorで動作させても、正しく動作確認ができません。クラウドのエディターは直接センサーとつながっていないためです。実際に現場に設置するデバイスにフローをデプロイして動作するか確認します。

デバイスにフローをデプロイするには、エージェント実行環境がインストールされたデバイスを用意します。

詳細な手順は、ドキュメントのチュートリアルなどを参照してください。

エージェント実行環境の準備

エージェント実行環境の該当のデバイスのステータスが接続状態のマークになっていれば、正しくenebularとデバイスが通信できている状態であることを示しています。

デプロイ

フローをデプロイするには、デプロイボタンをクリックします。

エージェント実行環境をクリックします。

デプロイ対象のデバイスにチェックを入れます。

デプロイ対象のバージョンを指定して、デプロイボタンをクリックします。

デプロイ済みステータスになれば、デプロイ完了です。

データストアの確認

フローがデプロイされれば、Injectノードの実行頻度毎にセンサー値を取得してデータストアにデータが送られてきているはずです。

データをすぐに確認したい場合は、データの送信頻度を細かくした方が良いと思いますが、フリープランの制限にすぐに到達してしまうので、加減しながら試してください。

まとめ

今回はセンサーデータをデータストアに格納するところまでを解説しました。

全部説明し切れていない部分もあるかと思います。不明な点がありましたら、お気軽にサポートまでご連絡ください。

次回は、クラウドで動かすフローについて解説します。