【Node-RED 2020】ダッシュボードで LED表示と表組みでの情報提示（天気情報の表示も）

この記事は、[Node-RED Advent Calendar 2020](https://qiita.com/advent-calendar/2020/node-red) の 14日目の記事です。
今回は、[Node-RED のダッシュボード（node-red-dashboard）](https://flows.nodered.org/node/node-red-dashboard)に標準で含まれていないノードをいくつか試してみる、という内容です。　

今回の内容をやろうと思ったきっかけは、以下の [Node-PAD](https://apps.apple.com/us/app/node-pad/id1534470128) のダッシュボードのノードを見たことです。
![ダッシュボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9719b4d0-7150-e4e8-80ca-3084666989d6.png)

まずは、Node-PAD について軽く補足しつつ、その後にダッシュボードの話へと入っていきます。

## Node-PAD とダッシュボード
ちょうど 2ヶ月くらい前、[Node-RED User Group Japan のFacebookグループ](https://www.facebook.com/groups/noderedjp)で知った [iOS用の Node-REDアプリ「Node-PAD」](https://apps.apple.com/us/app/node-pad/id1534470128)。

![Facebookグループでの情報.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4461d62c-90b9-d0c2-6020-823cf196b3ec.jpeg)

「試してみたいな」と思っていたものの、入手してから試さないままとなっていました。
そして、ふと「アドベントカレンダーのネタにもなるかもしれないし試そう！」と思って、アプリを立ち上げて触ってみていました。

その時、冒頭で掲載した画像にあるダッシュボードのノードで気になるものが多くあり、何か便利そうなものがないか確認してみたくなって、今回の内容を試しました。

## 気になったノードの情報を見てみる
気になるノードについて情報を見てみて、最終的に実際に試してみたいと思ったのは以下の 3つでした。

- [node-red-contrib-ui-led (node) - Node-RED](https://flows.nodered.org/node/node-red-contrib-ui-led)
- [node-red-contrib-ui-media (node) - Node-RED](https://flows.nodered.org/node/node-red-contrib-ui-media)
- [node-red-node-ui-table (node) - Node-RED](https://flows.nodered.org/node/node-red-node-ui-table)

全て試すと分量が多くなるかもしれないため、今回の記事では上記の中の node-red-contrib-ui-led と node-red-node-ui-table の2つを試してみることにします。

それと、当初は Node-PAD で試そうかとも思ったのですが、キーボードを使えたほうが進めやすそうかなと思って、ひとまず PC版で試してみようと思います。

## node-red-contrib-ui-led を試す： その1
まずは[「node-red-contrib-ui-led」のほうのページ](https://flows.nodered.org/node/node-red-contrib-ui-led)の説明を見てみます。

![LEDの説明.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/3b43770d-5166-afc0-d40b-2a66448d2193.jpeg)

この説明を見てみると、 `msg.payload` の値などによって以下のような挙動になるようです。また、 `msg.payload` を受け取ってない場合は、色が灰色になるようです。

| `msg.payload` の値 ⇒ | true | false | true/false以外 |
|---:|:---:|:---:|:---:|
| 対応するLED の色 ⇒ | 緑 |  赤 | 灰色 |

簡単なフローで試せそうなので、早速やってみます。
以下が今回利用したフローです。
![flow_led.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/70dbb321-6920-91a1-2d5b-f1fee1210d21.jpeg)

buttonノードの設定で、変更・設定した内容は以下となります。

- ダッシュボードのグループ・タグを設定
- ラベルを変更（見た目が分かりやすくなるように）
- `msg.payload` に「true/false/適当なテキスト（真偽値の true/false 以外であれば OK）」を設定（以下の画像で示した部分）

![buttonノード.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/6f7744c3-0889-1dc1-811b-9746f1c75f22.jpeg)

ledノードは、ダッシュボードのグループ・タブを設定した以外は、特にデフォルト設定を変更した部分はありません。
ダッシュボードのグループ・タブの設定については、以前書いた「[Node-RED（enebular）でダッシュボード・リアルタイム通信を利用する【ハンズオン資料】 ](https://qiita.com/youtoy/items/61e4a6c9061d68f09e3b)」という記事で紹介しているので、気になる方は[その記事](https://qiita.com/youtoy/items/61e4a6c9061d68f09e3b)の内容をご参照ください。
![Node-RED_led.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/76b4ec9c-8641-b49d-8481-365470cdfd7d.jpeg)

最後に、デプロイをしてからダッシュボードを開き、ダッシュボード上の 3つのボタンの何れかを押すと、ダッシュボード上の LED の色が変わることが確認できます。

![ダッシュボード_LED.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/00885c28-b34d-a920-41e3-a90e5cfc5c4e.jpeg)

## node-red-contrib-ui-led を試す： その2
とりあえず最初は、ボタンを押したら LED が変化するというものを試してみました。
しかし、なんとなく、連続的に動作して変化が生じるかもしれない何かを監視して、監視している状態の変化を LED で見せる、という用途が合っていそうにも思います。

そこで、以下のようなパターンも試してみました。

- 大まかな流れ
   1. injectノードで乱数を一定の時間間隔で生成（JSONata式を利用）
   2. 生成された乱数の値がとある閾値より大きいかどうかをchangeノードで判定（JSONata式を利用）
   3. changeノードでの判定結果である真偽値を ledノードで受け取る

![Node-RED_LED_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/a49f8cae-6ab5-9c57-9474-af94d39c8296.jpeg)

ここから上記のフローについて、デバッグ用のノードを除いた各ノードの設定を見ていきます。

以下は乱数を生成している injectノードです。
名前の変更以外でポイントになる部分は、「JSONata式を使った乱数生成の部分」と「乱数生成を一定の時間間隔で行うよう設定した部分」です。
![Node-RED_led_inject.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c89a391a-c395-d3fc-1728-f6030dfb6c2a.jpeg)

以下は changeノードの設定の画面です。処理の内容としては、injectノードで生成された乱数の値を判定して、その結果を表す真偽値を出力させる、というものです。
![Node-RED_led_change.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1da48d7f-7fbc-211c-5de2-bc5d8d55597a.jpeg)

そして ledノードの設定は、最初に行ったお試しと同様、ダッシュボードのグループ・タブの設定をしたくらいです。

最後にデプロイをして動作確認をしてみます。そうすると、以下のように LED の色がランダムなタイミングで変化するのが確認できます（デバッグノードで、生成した乱数の値も確認できます）。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Node-RED のダッシュボード用のノード、node-red-contrib-ui-led を試してみた！<br><br>JSONata式で乱数を生成したり、値の大きさによる条件判定を行って、それをダッシュボード上の LED に反映させた形です。<a href="https://twitter.com/hashtag/noderedjp?src=hash&amp;ref_src=twsrc%5Etfw">#noderedjp</a> <a href="https://t.co/XJFlgHowy9">pic.twitter.com/XJFlgHowy9</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1338387088144650242?ref_src=twsrc%5Etfw">December 14, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## node-red-node-ui-table を試す： その1
それでは[「node-red-node-ui-table」のほうのページ](https://flows.nodered.org/node/node-red-node-ui-table)の説明も見てみます。
今回はシンプルな表の出力を試してみることにします。
![Node-RED_table_simple.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/50756718-b8e5-41e7-70ed-046ac6dcc7b3.jpeg)

ノードの説明などが書かれたページには、表の元になるデータのサンプルとして以下が提示されていました。

```json
[
    {
        "Name": "Kazuhito Yokoi",
        "Age": "35",
        "Favourite Color": "red",
        "Date Of Birth": "12/09/1983"
    },
    {
        "Name": "Oli Bob",
        "Age": "12",
        "Favourite Color": "cyan",
        "Date Of Birth": "12/08/2017"
    }
]
```

ここから、実際にフローを作ってみます。
とりあえず、「適当なデータを設定したオブジェクトを作ってダッシュボードで表示してみる」というのをやってみようと思います。

作ってみたフローと、表示結果を先に掲載してみます。
まず、こちらがフローです。
![Node-RED_flow_table.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/495d78bd-b103-af4a-0a26-9c37c3c84fed.jpeg)

そして、ダッシュボードの表示結果は以下となります。
![Node-RED_ダッシュボード_table.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f4fd71b7-8920-d46b-b0f5-214cbc03dc17.jpeg)

それでは、ここから作成したフローについて説明していきます。

injectノードの後ろには changeノードを置いていて、表の上に表示させるデータを 3つ生成しています。
そのうち 1つを例として以下に出しているのですが、名前と年齢の情報を設定しています。
![Node-RED_table_change.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/677b0c3b-546a-675f-0763-27260a3772d5.jpeg)

その後ろは templateノードで、 node-red-node-ui-table に渡すためのデータを成形をしています。ここでは出力形式を JSON にしておいてください。
![Node-RED_table_template.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1c175d88-1947-462f-33e5-66822c84018f.jpeg)

上記の templateノードで成形したデータは、まだ 1つ1つバラバラの JSON のデータなので、node-red-node-ui-table の入力に合うよう配列にまとめます。最初に changeノードで 3つのデータを生成するようにしたので、ここでは 3つのデータを配列にまとめるように設定します。
![Node-RED_table_join.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/5875231c-4a6e-2680-6ff8-a34dc35d794e.jpeg)

あとは tableノードの設定です。
ダッシュボードのグループ・タグを設定して、それと変更必須ではない部分ですがサイズも適当に変えてみました。
![Node-RED_table.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e50e945c-6ab3-7255-dcbf-2b004c3d3e14.jpeg)

## node-red-node-ui-table を試す： その2
分量が多くなりそうなので詳細説明を書くのは省きますが、天気情報を取得して表形式で表示する、というものも試してみたので軽く紹介します。

以下で作ってみたもののフローと表示結果を掲載します。ざっくりした流れは以下の通りです。

1. 国と都市の指定（東京・仙台の 2つ）
2. 天気情報を取得（「[node-red-node-openweathermap](https://flows.nodered.org/node/node-red-node-openweathermap)」を利用）
3. たくさんの情報が取得できてしまうので都市・天気の詳細・気温のみを取り出す
4. 2つの都市の天気情報をばらばらに取得したものを 1つのオブジェクトに統合
5. オブジェクトを node-red-contrib-ui-table のノードに渡す

![Node-RED_flow_table2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/4750ef03-5629-2c02-32a5-15fed8c2ee73.jpeg)

以下の画像は、12/14 の 20時台に取得した天気情報を表形式でダッシュボードに出力したものです（仙台は雪だ...）。
![Node-RED_ダッシュボード_table2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/f57579af-388b-1afd-0347-e3963e577d89.jpeg)

「node-red-node-ui-table を試す： その2」の詳細については、もし余裕があれば記事にできたらと思っています。

## まとめ
今回、ダッシュボード用のノードである「node-red-contrib-ui-led」と「node-red-node-ui-table」の 2つを試しました。

ダッシュボード用のノード・ダッシュボードについて、今回掲載した中でもまだ試せていないノードが残っていたり、そもそもダッシュボードの設定を色々と変えてカスタマイズするといったことが十分に試せていなかったりします。
これから便利に活用していけたらと思っているので、お試しを引き続き行っていこうと思います。