IoTの「クラウド側」には素晴らしいシステムが百花繚乱。多くはお試し無料、本格利用は有料。しかし、本格利用(商用)はしないけれどいろいろ弄りたいということで、無償かつローカル環境での運用にも適する処理系を物色していたんであります。決定いたしました。Node-REDとmosquitto(MQTTブローカ)を手元のraspberry Pi(3B)にインストール。
※「IoT何をいまさら」投稿順Indexはこちら
Node-REDインストール前に一つ気になっていたことを片付けました。ラズパイの電源です。Pi 3 model Bには5V 3WのACアダプタでOK、という情報で一応3W電源(アイキャッチ画像の上の方のやつ)を取り付けてあったのです。が、結構頻繁に低電圧警告がでます。「余計なハード」をいつくか接続したまま「サーバー機」として動作させるには若干不安だったので5V 4W電源(アイキャッチ画像の下の方)に交換しました。「有休状態」のJetson nano用を転用、内径2.1mmのDCジャックからUSB「変換」するコネクタを作ってとりあえず稼働させました。後で4W電源追加しないとJetson可哀そうだ。
閑話休題、さてNode-REDです。Node-RED日本ユーザ会様の概要ページより引用させていただくと、
Node-REDはフローベースドプログラミング(flow-based programming)ツール
であり、
2019年3月よりNode.js FoundationとJS Foundationが合併して設立されたOpenJS Foundationにホストされています。
ということであります。JavaScriptの処理系であるNode.js上で動作します。日本ユーザ会様のサイトに 各種環境へのインストールについて詳細な日本語の説明があり、その中に
というページがあります。これみれば一撃(実際一行で全てをインストールor更新できるスクリプトが置かれています)なので手順などは書きませぬ。書かれているとおりに作業をすすめれば大した時間もかからずインストールが済みました。なお、ラズパイ上でのインストールなのでラズパイ特有のノードというオプションも選択してみました。これ使うとラズパイの拡張端子などをNode-REDから取り扱えるようになるようです。これはお楽しみでまた後で。
インストール後、Node-REDを起動(端末から起動するなりサービスとして設定してもよいですが、GUI上にNode-REDが登録されたので、GUIでクリクリして即起動可能)、そして外部のブラウザからRaspberry PIのIPアドレスのポート1880に接続すれば以下のようなNode-REDのエディタ画面が立ち上がります。カッコ良いです。ちょっと嬉しい。
説明資料を読みながら、最初の例題をやってみれば「ノード」をドラッグ&ドロップして接続するだけで動作しました(下の図。)簡単!
今度は2つのノードの間にfunctionノード(JavaScriptのコードを実行できる。入りと出がある関数、あるいはフイルタ的な)を挿入せよなどとあるので、挿入しプロパティ画面を開けばこんな感じ。
実際にこのフィルタにデータ(タイムスタンプ)が通るようになるとデバッグ出力で見える値がちゃんと変換されるようになりました。こんな感じ。
動作にトリガをかけているのは inject ノード(上記例は手動でノードのボタンを押して動作させていた)というものですが、そいつのプロパティを開いて設定すれば、周期的な仕事にもできるのです。こんな感じ。
調子にのって、2つ目の例題を打ち込んで(主にはドラッグ&ドロップですが)みれば、米国地質調査所のウエブ・サイトから当月の地震データを引っ張ってきて、マグニチュードみて分類した上で表示などという仕事ができてしまいます。そのフローはこちら。
いやはや、Node-RED、思っていた以上に使いやすいです。「お手軽第一」を標榜しておる当サイトでも一押しであります。
ただ、上記例ではデバッグ出力ばかり見ていて、IoTのクラウドというといつもお目にかかる
-
- スピードメーター風のゲージ
- モダンな雰囲気のグラフ
などがありませぬ。そんなところ、node-REDの皆さまに手抜かりある筈もなく、ちゃんと用意されています、
node-red-dashboard
というものが。これをインストールするとカッコイイUIを使えるようになります。Node.jsのパッケージ管理ツール npm を使ってもインストールできるようですが、Node-REDのエディタ画面からもインストール可能でした。画面右上のありがちな三本線のMenuボタンから「ノード」の管理画面が呼び出せるのであります。
「ノードを追加」というタブを開くと何千もの「ノード」のパッケージが存在することが分かります。探せばいろいろ出てきそう。。。とりあえず今回はダシュボードのみインストールいたします。
node-red-dashboardの「ノードを追加」ボタンを押すと、左端のパレットにダッシュボード関係のノードが大量に追加されます。勿論、その中をみるとゲージやらグラフやら含まれています。このダッシュボードが生成する「ダッシュボードの画面」にアクセスするには、エディタ画面にアクセスするときのurlにつづけて
/ui
とするだけで良いようです。今回はまだ何も定義していないので、下のような画面が見えました。
さて、Node-REDと末端のIoTデバイスとの間は、
MQTTプロトコル
を利用したいと思います。MQTTについては下の方にURLを掲げた記事含め、解説大量にあります。Node-REDにはMQTTと接続するためのノードの箱は用意されていますが、MQTTブローカーというものを走らせておかないとなりませぬ。そこで定番のMQTTブローカー
を使わせていただくことといたします。Eclipseといえば昔からIDEでお世話になっておりましたが、こういうものもやっているのね。こちらは Raspberry Piでソフトをインストールするときはいつもそうするように apt 使います。
まずは mosquitto で調べてみました。
$ apt-cache search mosquitto libmosquitto-dev - MQTT version 3.1/3.1.1 client library, development files libmosquitto1 - MQTT version 3.1/3.1.1 client library libmosquittopp-dev - MQTT version 3.1 client C++ library, development files libmosquittopp1 - MQTT version 3.1/3.1.1 client C++ library mosquitto - MQTT version 3.1/3.1.1 compatible message broker mosquitto-clients - Mosquitto command line MQTT clients mosquitto-dev - Development files for Mosquitto
見付かったのでインストールいたします。ブローカーとクライアントの両方。
$ sudo apt install -y mosquitto mosquitto-clients
早速、以下のように第一の端末ウインドウでmosquitto起動しましたが、下の方に Error とか出てちょっとギョっとするのです。
$ mosquitto -v 1611795649: mosquitto version 1.5.7 starting 1611795649: Using default config. 1611795649: Opening ipv4 listen socket on port 1883. 1611795649: Error: Address already in use
しかし、それを払拭してくれる素晴らしい記事あり、
MQTTで始めるIoTデバイスの作り方 第1回:「MQTT」を知り「Mosquitto」を導入する
これ読むと、上のErrorは心配に及ばないようです。一安心。上記の記事に従って第2の端末ウインドウで、自分のサイトのブローカに公開されるトピックは全部購読(サブスクライブ)と走らせておいて
$ mosquitto_sub -h 127.0.0.1 -t "#" -v
第三の端末ウインドウで、TESTトピックのmessageメッセージをブローカに「パブリッシュ」してみると
$ mosquitto_pub -h 127.0.0.1 -t TEST -m "message"
mosquittoブローカさんがちゃんと働いていて、第2の端末ウインドウに「TESTトピックのmessageメッセージ」が伝わってきます。
TEST message
このようにクライアントを呼び出して動作させることは勿論、PythonなどにもMQTTクライアントのライブラリモジュールはあり、処理に組み込むのは容易そうです。
今回はインストールだけでしたが、次回から、実際にデータを処理しながら、Node-REDを学んで行きたいと思います。