ブロックを積みながら(102) Node-REDでSQLiteの練習その3

Joseph Halfmoon

前回、SQLiteデータベースからデータを抽出してテーブルに取り出せるようにしました。でも、ドロップダウンリストから選択すると即座に「その他の条件はキメウチ」のクエリが実行されてしまい、なんだかな~です。今回は前回の不満点を解消するために細かく手を入れてみました。本質一緒なのだけれどもフローはちょいと複雑になり。

※「ブロックを積みながら」投稿順 index はこちら

※動作確認にはRaspberry Pi 3 model B+のRaspberry Pi OS(32bit)上にインストールした以下を使用しています。

    • Node-RED v2.0.5
    • node-red-dashboard 3.2.0

※今回、フロー間での大域変数的なデータへのアクセスを使ってますが、その件については、Node-RED User Group Japan様の以下のページに解説があります。参照させていただきました。ありがとうございます。

コンテキストを利用する

前回フローの不満点と対処

前回フローの不満点というか、問題点を列挙すると以下のとおりです。

    1. 手動でドロップダウンリストの初期化が必要だった
    2. デバイス(ボード名)ドロップダウンリスト選択で即SQLクエリが走った

2の件はNode-RED起動時に一度初期化しておけば、その時点でのデータベースのテーブル(台帳的な)項目が反映できます。しかし、ドロップダウンリスト化する対象のテーブルに新たなエントリを追加した場合には再初期化が必要です。「とりあえず」ということで自動起動に加えて手動での更新も可能になっていればよいことにします。

2の件は、今回実験対象としているデータベースには、マイコン・ボード名の台帳とは別に測定項目名の台帳もあり、そちらでの検索条件を指定したいです。マイコン名と、測定項目名、例えば、「ATOMLite」ボードの「湿度」データという具合に2つ指定してからクエリを実行したいです。そのため、ドロップダウンリストを選択した結果はいったん「コンテキスト」に保存しておいて、クエリを実行するボタンが押されたらその時点で「コンテキスト」に保存されている条件でSQL実行したいと思います。

今回実験のフロー

前回フローに改変を加えたものが以下に。最初の「行」は前々回のドロップダウンリスト作成フローの「チョイ変」、最下行は前回のデータベース本体へのデータ照会フローの「チョイ変」です。

SQL4flow

最初の「行」と「2行目」は、ほぼほぼ同じものがパラレルに流れているので、今回追加の「2行目」を使ってフローを説明したいと思います。

まずは最左端のInjectノードによる初期化のトリガです。ここは以下のように設定しました。SQL4injectSetting

Injectノードから送出されるpayloadは下流ノードで参照していないので、何が乗っていても関係ないのですが、msgが到来したということで下流の2つのSQLiteノードが動きます。

下流のSQLノード2つは同じ構造ですが、列挙するテーブルだけが異なってます。固定SQL文で、特定のテーブルを全列挙してます。以下では測定項目名の台帳 keysテーブルを列挙しとります。

SQL4getKeys

さて、上記で列挙されたテーブル(msg.payload上のJSONオブジェクトになっている)を受けて、ドロップダウンリスト化するための加工をしているのが以下の change ノードです。すごい簡単ですが、以前練習したJSONata式を使ってキーのみを取り出して msg.optionsに載せ替えてます。

SQL4makeKeys

さて、上記でmsg.optionで列挙されたものは、dropdownノードに到達するとダッシュボードのドロップダウンリストの初期化に使われます。SQL4KeysDDlist

一連のフローの動作はここまでで一たんとまります。

そしてダッシュボードの該当のドロップダウンリストから1項目選択することでフローの動作が再開します。選択項目は、msg.payloadに載って以下のfunctionノードへと到来。SQL4flowSet

上記ノードにて、flowコンテキスト(該当ノードの存在するタブ上の全ノードから参照可能な一種のストレージ)にKEY_SELECTEDというお名前で格納されます。

条件選択動作は以上で完了です。

続いて下半分、実データにクエリをかける部分です。SQLクエリを実行するトリガは、ダッシュボード上に配置したボタンです。ボタン自体はトリガのためにmsgを下流に送出するだけで、payloadに載せたものを以下のsqliteノードは無視するので関係ないです。

前回のfunctionノードと変更されているのは、SQLクエリのWHERE句で使われる検索条件をコンテキストから引っ張ってきていることです。これにより上のフローのドロップダウンリストで選択した内容が生成するSQL文にとりこまれます。

SQL4sqlbody

ドロップダウンリストで何も選ばれなかった場合の対処とか抜けてますが、今回は目をつぶるっと。いい加減だな。

実験結果

ドロップダウンリストでマイコンボード「ATOMLite」、測定項目「HUMI」(湿度の略)を選択し、QUERY実行ボタンを押したときのダッシュボードの様子が以下に。SQL4_Result

列挙されとります。次回は、タイムスタンプでの絞り込みかね。

ブロックを積みながら(101) Node-REDでSQliteの練習その2 へ戻る

ブロックを積みながら(103) Node-REDでSQliteの練習その4 へ進む