この記事は IBM Cloud Advent Calendar 2020 の 15 日目の記事です。
IBM Cloud で構築した Node-RED で obniz ノードを試して Cloudant にデータを貯めるメモです。
obnizノードがバージョンアップ
Node-REDのobnizノードがバージョンアップした! – Qiita
こちらの記事にあるように、obniz ノードがバージョンアップしまして、obniz クラウドのエディタ JavaScript を書いて MQTT などでブリッジすることなく Node-RED の中だけで完結してやり取りをすることができます。
これができると、obniz でセンサーをつないだり、サーボやモータなどのアクチュエーターをつないだものを Node-RED で直接操作することができます。
obniz は obniz クラウドに常時つながって、IoTのややこしい処理を吸収してくれる恩恵をちゃんと受け取れることができるようになりました。
ということで、このような便利な仕組みが IBM Cloud で構築した Node-RED で使えるかどうか確かめつつ、 IBM Cloud の Node-RED のメリットである IBM Cloud 内の別のサービスへの接続性の高さとして、obniz のスイッチ操作をCloudant にデータを貯めてみます。
IBM Cloud にNode-REDを準備
IBM Cloud で Node-RED セットアップ (2020年9月) を参考に準備します。
Cloud Foundary で作ります。
デプロイ開始。
出来上がったので ID やパスワードを設定します。
設定できると、このような初期のフローができています。
ちなみに今回、検証のために、有料のサービス立ち上げて Node-RED を立てて最新の状態でチェックです。
obniz ノードインストール
メニュー > パレットの管理 > ノードの追加で node-red-contrib-obnia の名前で探して、obniz ノードインストールします。
無事インストールされました。IBM Cloud のサービスに挟まれているのがアツい。(個人的感想です)
今回のフロー
ということで今回のフローです。
フローのJSONです。
[{"id":"f9b664be.cf3118","type":"obniz-repeat","z":"e61f015e.a7b78","obniz":"dbf751c5.c96f","name":"","interval":100,"code":"// スイッチの情報をただただ流す\nlet state = await obniz.switch.getWait();\n\nmsg.payload = state;\n\nreturn msg;","x":150,"y":300,"wires":[["b238a2b0.bf24a"]]},{"id":"13b61daa.f0ff92","type":"cloudant out","z":"e61f015e.a7b78","name":"","cloudant":"","database":"obniz","service":"1ft-advent-calendar--cloudant-1607993272831-17434","payonly":false,"operation":"insert","x":650,"y":240,"wires":[]},{"id":"b238a2b0.bf24a","type":"switch","z":"e61f015e.a7b78","name":"none 以外通す","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"none","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":440,"y":300,"wires":[["7ca333ba.df155c","b3a2f4fa.be6248","13b61daa.f0ff92"]]},{"id":"7ca333ba.df155c","type":"debug","z":"e61f015e.a7b78","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":670,"y":360,"wires":[]},{"id":"b3a2f4fa.be6248","type":"obniz-function","z":"e61f015e.a7b78","obniz":"dbf751c5.c96f","name":"","code":"// スイッチ表示\nobniz.display.clear();\nobniz.display.print(\"[switch]\\n\");\nobniz.display.print(msg.payload);","x":680,"y":300,"wires":[[]]},{"id":"dbf751c5.c96f","type":"obniz","z":"","obnizId":"0000-0000","deviceType":"obnizboard","name":"","accessToken":"","code":"obniz.display.clear();\nobniz.display.print(\"obniz&IBM Cloud\");"}]
obniz 初期設定
obniz の設定は 0000-0000 にしてあるので、自分の obniz ID に置き換えて設定してください。
obniz.display.clear(); obniz.display.print("obniz&IBM Cloud");
接続時に速やかに行われる初期化処理ということでメッセージが出るようにしています。
実は初期化処理を把握するために、試行錯誤があったところは Node-RED obniz ノードの起動時の処理はノード内の初期化処理に書いたほうが良いというメモ をよろしければご参考ください。
obniz repeat ノードの処理
obniz repeat ノードです。
100 ミリ秒という間隔で、コード内に書かれたコードを実行します。
// スイッチの情報をただただ流す let state = await obniz.switch.getWait(); msg.payload = state; return msg;
スイッチの情報をただただ流すようにしています。
switch ノードの設定
switch ノードの設定です。
これで、 obniz repeat ノードで取得した obniz のスイッチの値を none の操作以外を通すことで、押した push ・右に回す right ・左に回す left といった処理が取得できます。
debug ノードではこのような値が取得できます。
obniz function ノードの設定
obniz function ノードでは obniz にまつわる色々な処理を書きます。function ノードに obniz 用の予約変数が準備されているイメージです。
// スイッチ表示 obniz.display.clear(); obniz.display.print("[switch]\n"); obniz.display.print(msg.payload);
スイッチの値が来るので、それをディスプレイに表示しています。
たとえば、押したときの様子です。
cloudant ノードの設定
さて、 IBM Cloud の Node-RED は IBM Cloud 内で連携できる他のサービスと連携がしやすいです。今回はobniz のスイッチ操作をCloudant にデータを貯めてみます。
このように、Cloudant の場合は、Node-RED を作る時点で設定情報を保持するために Cloudant が一つあるため、Service のところにすぐに表示されます。便利。
Database 名を obniz として Operation を insert にしてカジュアルにデータを貯めてています。ほんとこれだけ。
スイッチを左右に動かします!
アプリの詳細ページから Cloudant ダッシュボードを見に行きます。
Database を確認します。
デプロイ後にいろいろ動かしたので、すでにデータが色々入ってきています!
無事、 push のデータや
右に操作した right のデータが入ってきています!
ということで、IBM Cloud で構築した Node-RED で obniz ノードが動くか検証してみたところ、問題なく動いたし、IBM Cloud 内のサービスとも連携がとてもやりやすかったという知見が得れました!