Node-REDのobnizノードを使ってobnizを動かしてみた

Node-RED Con Tokyo 2020に参加してきました。

nodered.jp

昨年も開催されたNode-RED UG Japan主催のカンファレンスで中身の濃い知見を得られました。

この中のobnizのセッションの中で、カンファレンスの前日にリリースしたばかりだというobnizノードの紹介がありました。

その昔、ハッカソンでNode-REDを使ってobnizから送られてくるセンサの値を受け取るということに挑戦したのですが、開発にかなり苦戦した覚えがあります。

おまけに初めてobniz触ったこともあり、いまいち使い勝手が分からなかったんですよねw。

そんなobnizをNode-REDから操作できるノードが公式でリリースされたのはいいですね。

というわけで今回はこのobnizノードを使ってIBM CloudのNode-REDからobnizを操作してみたいと思います。

ちなみにNode-REDの環境を用意できれば動作環境は何でもいいと思います。 環境構築方法はNode-RED UG Japanのドキュメントが参考になります。

nodered.jp

インストール

まずはインストールしてみます。インストール方法はここにあったので、この通りにやってみます。

flows.nodered.org

Node-REDを立ち上げたら右上のメニューから「パレットの管理」を選択します

f:id:KMiura:20201010205616p:plain

「ノードを選択」タブを選択して検索窓にobnizと検索すれば「node-red-contrib-obniz」が1件ヒットすると思うので、「ノードを追加」をクリックして、インストールします。

f:id:KMiura:20201010210129p:plain

途中でこんなダイアログが出ますが、気にせず「追加」をクリックします。

f:id:KMiura:20201010210634p:plain

パレットの管理画面を閉じて、左側のノードの一覧にこのようにノードが出てきたらインストールは完了です。

f:id:KMiura:20201011012855p:plain

とりあえず動かしてみた

とりあえずobniz のディスプレイに何か文字を表示するフローを作ってみます。

フローはこんな感じです。injectノードから適当な文字列を送ると、obnizのディスプレイにその文字が表示されます。

f:id:KMiura:20201010211230p:plain

ここでよく見るとobnizノードの右上に赤い三角がついてますね。

obnizノードを使うにはお使いのobnizのデバイス情報を登録する必要があります。

というわけで接続したobnizのfunctionノードをダブルクリックしてノードの編集画面を開きます。 「新規にobnizを追加」の横にある鉛筆マークをクリックして、obnizの接続情報を追加しましょう。

f:id:KMiura:20201010211844p:plain

プロパティの画面では色々設定する必要があります。設定項目としては以下の通りです。

項目 詳細
obniz ID obnizをWifiに接続すると表示するID
access token obnizの開発者コンソールで取得するトークン (設定していない場合は空欄でOK)
device type バイスの種類

一通り設定すると、以下のようになります。僕はアクセストークンを設定していないのでaccess tokenは空欄になっています。

f:id:KMiura:20201010220427p:plain

これで「更新」をクリックするとノードの編集画面に戻ります。

続いて「コード」の欄にデバイス操作を行うためのコードを書きます。

コードについては公式ドキュメントのコードを書くと操作できます。

obniz.com

これを元にコードには、以下の2行を書きます。

obniz.display.clear();
obniz.display.print(msg.payload);

1行目のobniz.display.clear();をやらないとディスプレイの内容が上書きされて表示がぐちゃぐちゃになるので入れておいたほうがいいです。

2行目のobniz.display.print();の引数で指定した文字列をディスプレイに表示させます。

今回はinjectノードからの入力を表示するため、msg.payloadを引数にしています。

コードの記入を終えたら「完了」を押して、編集を終えます。

f:id:KMiura:20201010221727p:plain

あとは右上の「デプロイ」ボタンをクリックしてデプロイして、以下のようにconnectedが表示されればobnizとNode-REDは正常に接続されています。

f:id:KMiura:20201010222143p:plain

injectノードの左側のボタンをクリックして、接続されたobnizのディスプレイに文字列が表示されたら成功です。

f:id:KMiura:20201010222803j:plain

入力もやってみる

せっかくなので、もう片方のrepeatノードの方も試してみます。

このノードはobnizから何かしらのインプットがあったときに使えるノードです。

ここでは、obnizの上についているスイッチで何か操作すると、デバッグにその操作内容が表示するというフローを作ってみます。

フローとしては以下の通りです。

f:id:KMiura:20201010225619p:plain

まずは、obniz repeatノードをダブルクリックして編集画面を開きます。先程設定したobnizのデバイスが選択されていたらデバイスの設定は不要です。

もし何も表示されていない場合は、セレクトボックスから先程登録したデバイスを選択します。

このノードは一定の間隔でコードを実行する仕組みなので、以下のコードをコード欄に貼り付けます。

var state = await obniz.switch.getWait();
msg.payload = state;

return msg;

こちらもNode-REDで標準で使えるfunctionノードの使い方と同じになるので、実行結果を出力するには、最後に return msg;を書く必要があります。

次のswitchノードは何も入力が無かったときにnoneが出力されるので、none以外の出力を表示するために条件分岐を入れています。

f:id:KMiura:20201010231512p:plain

フローを作成してデプロイを行うと、以下のようにobinizのスイッチの状態(none以外)がデバッグ画面に表示されます。

f:id:KMiura:20201011005013p:plain

今回のフロー

[{"id":"523da830.10ea08","type":"tab","label":"obniz Control","disabled":false,"info":""},{"id":"fcbde703.c35d28","type":"obniz-function","z":"523da830.10ea08","obniz":"a8808e2f.d98e9","name":"","code":"obniz.display.clear();\nobniz.display.print(msg.payload);","x":560,"y":320,"wires":[["b1dcc84e.b9b438"]]},{"id":"bb4f92aa.2cab","type":"inject","z":"523da830.10ea08","name":"","topic":"","payload":"Hello World!","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":270,"y":300,"wires":[["fcbde703.c35d28"]]},{"id":"885dcb9f.d6ddf8","type":"inject","z":"523da830.10ea08","name":"","topic":"","payload":"Goodbye","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":260,"y":360,"wires":[["fcbde703.c35d28"]]},{"id":"b1dcc84e.b9b438","type":"debug","z":"523da830.10ea08","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":820,"y":320,"wires":[]},{"id":"ff8bb61.4f49a48","type":"obniz-repeat","z":"523da830.10ea08","obniz":"a8808e2f.d98e9","name":"","interval":"1000","code":"var state = await obniz.switch.getWait();\r\nmsg.payload = state;\r\n\r\nreturn msg","x":240,"y":480,"wires":[["488a94d0.8dda7c"]]},{"id":"ca3a09ac.aed6f8","type":"debug","z":"523da830.10ea08","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":830,"y":480,"wires":[]},{"id":"488a94d0.8dda7c","type":"switch","z":"523da830.10ea08","name":"","property":"payload","propertyType":"msg","rules":[{"t":"neq","v":"none","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":510,"y":480,"wires":[["ca3a09ac.aed6f8"]]},{"id":"a8808e2f.d98e9","type":"obniz","z":"","obnizId":"","deviceType":"obnizboard","name":"main board","accessToken":"","code":""}]

まとめ

今回はNode-REDでobnizを動かしてみました。

obnizとのやり取りがよりシンプルになってとてもいいと思いました。

最初コードの書き方がよく分からず戸惑いましたが、functionノードを使っていたらその感覚でobniz.jsのコードを書くだけになるので、慣れれば何でもできそうな気がします。

これでNode-REDでobnizを動かしていたときのつらみが解消される気がします。