前回につづき、ありがちですが、必修科目ということでNode-REDからデータベース(SQLite)へのアクセスを練習。末端のデバイスが送ってきたセンサデータなどNode-REDのダッシュボードに表示するだけでなく、SQLiteにデータを書き出しておけば後々の活用はOKっと。外のPythonスクリプトで処理することなども簡単だし、という感じであります。ありがちなだけに「とりあえず」無問題。
※「IoT何をいまさら」投稿順Indexはこちら
データベースの操作のためにRaspberry Piの上で SQLiteのブラウザ(GUI)が動作することを確かめました。これがあれば自分ではSQL文書かずともDBをcreateし、中身を覗き、書き換えるなどお手軽にできます。定番のツールじゃないかしらん。まあ呼吸するようにSQL書ける人には不要か。以下にURL貼り付けました。
RaspbianOS(最近、ちょっと逆風が吹いた)の場合のインストールは簡単。以下のとおり。
sudo apt-get update sudo apt-get install sqlitebrowser
一方、Node-RED側のインストールも簡単。Node-REDのエディタ画面からパレットの管理を選び、ノードの追加で以下を検索してインストールであります。「本当に良いのか、ちゃんと調べてからやれよ」みたいなポップアップ出るのであります。調べる場合は以下のURLどうぞ。
このインストール、結構時間がかかります。正確に測っていないですが10分くらいかかった気がします。何をやっているのか覗いてみると、makeとかcc1とか走ってます。オブジェクトをビルドしてらっしゃいますね。なおCPUの使用率をみると大体25%に張り付いています。3Bは4コアありますが、1個しか使っていないんじゃないかしらん。インストール完了時点の表示は以下のようです。そっけなく「追加しました」ボタンになっています。
そして肝心のパレットをば見やれば、「ストレージ」のところに sqlite ノードが追加されとります。ノードの見た目を冒頭のアイキャッチ画像に引用させていただきました。
Node-REDの中からでも任意のSQL文が実行できるようなので、データベース作ることからNode-RED側でもできそうです。しかし面倒。データベースの作成やメンテナンスは先ほどインストールしたGUIのブラウザ様にお願いしてしまいます。適当な場所(私はラズパイに外付けのHDD上に確保しました。)にデータベースの実体を用意。その中に、まずは末端のIoTデバイス共のお名前とユニークなIDを保持するテーブルを作りました。こんな感じ。
後々、ここに列挙されるデバイス名を眺めて悦にいる予定ですが、とりあえずのリストを入力してしまいます。こういうところもGUIからできるので楽。
今度は、Node-REDのエディタ画面(PC上のブラウザからRaspberry Pi上のNode-REDに接続して操作)にうつり、Node-REDのフローを描きました。
SQLiteノードは「どこのデータベースに接続するのか」を設定するだけで、実際にそのDBに対して実行するSQL文は msg.topic に載ってやってくる設定です。テスト用に設定したばかりのデバイス名テーブルを列挙することにいたしました。SQLノードの前に injectノード を置いてそこのtopicに 実行すべき SQL文を書きこみました。こんな感じ。
select * from devices
出力はデバッグノードへ垂れ流しです。結果を見るとオブジェクト5個の配列がpayloadに載ってやってきており、オブジェクトの中身を見ると先ほど設定したテーブルの各レコードになっていました。こんな感じ。
一応、読み取りが出来たので、今度は書きこみのテストであります。GUI使って、テーブルをいくつか追加しました。そのうちの一つが、時刻(テキスト)、デバイスID、データ種別のID、データ実体のテキストの4フィールドからなるテーブルです。とりあえずそこにダミーのデータ1個を書きこんでみるために先ほど同じようなフローを1個追加しました。
insert into kvdata values('time', 1, 1, 'dummy');
ところが、そんなテーブル無いよ、と怒られました。
何度も書いたとおり、Node-RED側の「デプロイ」ボタンは忘れずに押していたのですが、DBブラウザ上でテーブルを追加(SQL文を組みたて)した後で、操作をデータベースに反映させる(実際にSQL文を実行)するボタンを押すのを忘れていました。慌て者だ。反映させれば問題なくNode-RED側からデータベースにレコードが追加されました。追加されたレコードはDBブラウザ上で確認できます。こんな感じ。
とりあえず、読み書きできました。次は実データのフローに組み込んでいかないと。