前回PythonスクリプトのクライアントからNode-REDのダッシュボードに向けて”Hello World”いたしました。また、こちらではMicroPython制御のmicro:bitにサーミスタを接続し、その読み取り値をもう一台のmicro:bitに送信、ラズパイで読み取っておりました。2つガチャンコでmicro:bit測定値をNode-REDダッシュボードに表示できる筈。
※「IoT何をいまさら」投稿順Indexはこちら
さて前回のHello Worldのフローからは大分複雑となりました。とはいえ追加したのはたかだか4つのノードです。また、前回は成り行きでお名前をつけていたのを「後々のことを考えて」ちょっと変更。
追加したのは以下のノードです。
-
- MQTT-inノード、micro:bitに接続してあるサーミスタの測定値を受け取るつもりのサブスクライバ
- Functionノード、数値文字列で生の値を受け取るつもりなのでそれをダッシュボードでの表示用に加工するフィルタ
- dash-boardのgaugeノード、最新の値(サーミスタ端子の電圧[V])を表示
- dash-boardのchartノード、サーミスタ端子の電圧[V]の時間グラフを表示
そして前回、Hello World表示につかったtextノードは、ステータス表示用に改めました。micro:bitとのインタフェースが生きていれば Running、停止中は STOPと表示させるつもりであります。
フローはこんな感じ。
前回成り行きのお名前であったダッシュボードについては、お名前を変更し、実体にあわせました。なお、
電池駆動(リモート)の緑色のmicro:bit にサーミスタが接続
しているので、micro:bit Green つづめてMBGreenであります。もう一台の基地局というかアンテナ替わり(物理層はBLEだが上位層はそれと互換性のないmicro:bitのMicroPython独自?プロトコル)のmicro:bitは赤色なのでMBRedと呼んでおりまする。今回もこいつは無線からRaspberry Piへの橋渡しで動作していますが、表立っての登場はなし。
サーミスタ用のフローを左から確かめていきます。まず、MBGreen/Thermistorノード。設定は以下のようです。サーバーは前回設定済のRaspberry Pi上のmosquittoブローカに向けます。トピック入力して「完了」。
次に到着した生データを加工するフィルタです。MBGreenは、Arduino互換のアナログ読み取り関数analogRead()でサーミスタ端子の電圧(回路図についてはこちら参照)を読み取っています。ざっくり0が0V、1023が3.3Vの整数値。しかし、伝送時に文字列として送ってくるので、MQTTでパブリッシュされてくるのは数値文字列です。これを電圧のグラフにしたいので、浮動小数の数値に変換しないとなりません。Functionノードでフィルタできるのは理解したのですが、だいたい関数の入力や出力は何なの?Node-REDのユーザ会様のサイトを拝見すれば直ぐに分かりました。
一番大事だと思うところを引用させていただくと、
メッセージは msg と呼ばれる一つのオブジェクトとして渡されます。 このオブジェクトは慣例により、メッセージ本体を含む msg.payload プロパティを持っています。
であります。javaScriptは滅多に書かないので、冗長な書き方で処理。
前から使いたかったスピードメーター風のゲージの設定はこちら。ラベルやUnitに文字列設定している程度で後は大体デフォルト。
忘れてはいけない無線受信機と化しているMBRedが送信してくるデータを処理しているPythonスクリプトにも手をいれなければなりませぬ。短いので全文を掲げると以下のような感じ。今回追加したのはパブリッシュするための数行のみ。
なお、micro:bit側のスクリプトには前のまま。一切変更なしです。
#! /usr/bin/python3 import serial import paho.mqtt.publish as publish recMax = 500 rec = 0 ser = serial.Serial('/dev/ttyACM0', '115200', timeout=0.5) publish.single("MBGreen/Status", "Running", hostname="127.0.0.1") while (rec < recMax): mes = ser.readline().decode('utf-8').strip() dat = mes.split(":") if len(dat) == 3: recSend = dat[0] thermistorV = dat[1] chipTemp = dat[2] print( \ "REC={0} Thermistor={1} ChipTemp={2}".format(recSend, thermistorV, chipTemp)) publish.single("MBGreen/Thermistor", thermistorV, hostname="127.0.0.1") rec += 1 ser.close() publish.single("MBGreen/Status", "STOP", hostname="127.0.0.1")
動作中(Running)の様子は最上部のアイキャッチ画像に掲げました。以下は「予定数終了」してSTOP後のダッシュボードの様子。
大したことはまったくやっていない(全てPython, Mosquitto, Node-Redのお陰)ですが、ゲージとかグラフがブラウザに表示されるだけで
モダンなIoT
の雰囲気が出てくる。。。お手軽。