Node-REDのobnizノードがバージョンアップした！


Node-REDのobnizノードをバージョンアップしましたので、使い方概要を書いていきたいと思います。

## バージョンアップ概要

- obnizとの通信用のjsonデータを書かなくて良くなった！楽！
- obnizにアウトプットしかできなかった(ディスプレイに文字出すとかLEDつけるとか)のが、インプットもできるようになった！ 
- JavaScriptSDKでできることが全部そのままできるようになった！
- 互換性なくなった！


# インストール方法

NodeREDの右上のメニューから、パレットの管理を選びます
![スクリーンショット 2020-10-13 11.25.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/d4bee61a-c22c-d2fa-8772-b2d2b33832ee.png)

「ノードを追加」タブにてobnizと検索します。


node-red-contrib-obnizがv0.6.1で出てきますので、右側の「ノードを追加」ボタンを押します


![スクリーンショット 2020-10-13 11.25.31.png](
https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/ca19233a-d318-dcf4-b1ce-3e98fc32f776.png)

左側に青いobnizノードが2つ出てくればインストール成功です
![スクリーンショット 2020-10-13 11.26.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/62e16852-a89f-d2d1-6741-1fe025e74d4b.png)

# 使い方
## ノードの種類

obnizノードが2つあります。

![obniz-repeat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/0734f8dd-306f-a342-2646-de4085e651e5.png)

![obniz-function.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/f61e9113-4158-a657-48fe-3dc531161132.png)

obniz repeatはセンシングなど、常にデータを取り続けることがしたいとき、
obniz funcはフロー上のきっかけでなにか動作させたいときに使います。


どちらのノードもプロパティを開くと、obnizの設定と、コードを書く画面が出てきます。
![obniz-func-property.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/92ddc171-b8fd-ae86-cf7f-3c6b6031bcf0.png)


まずはobnizの設定をしましょう。


## obnizの設定

obniz repeatノード、もしくはobniz functionノードのプロパティから、"新規にobnizを追加"を指定して右側の編集ボタンを押すとobnizの設定画面に行くことができます。

![obniz-config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/2b3e9e8f-6d3f-3fe3-efd5-2a8867faa5ee.png)

ここでobnizの設定を行います。
よく使う項目は3個です

- obnizID 
使用するobnizデバイスのobnizIDを入れます

- DevieType
使用するobnizデバイスの種類を選択します

- 初期化処理
obniz.wiredやobniz.ble.initなど、起動時に1度だけ行いたい処理を記載します。


obnizIDとDevieTypeはおそらく迷わないと思うので割愛して、初期化処理だけ詳しく説明したいと思います。

### 初期化処理

functionノードと同じような感覚で、初期化処理を記載します。
ここでは`obniz`変数と`obnizParts`変数が割り当てられていて、そのまま使うことができます。
awaitにも対応しているので、obnizをJavaScriptSDKで使うときと同じように書くことができます。

| 変数名 | 説明 |
|:-:|:--|
| obniz  | new Obniz("OBNIZ_ID")で作られたobnizインスタンスが割り当てられます  |
| obnizParts  | すべてのobniz関連ノードで共通のオブジェクトが割り当てられます。<br/>初期は空オブジェクト `{}` です。<br/>obniz.wiredで作られたパーツインスタンスを格納するのにご利用ください |


たとえば、M5StickCに外付けLEDをつけた際は、こんなコードを書くことになります。

```
obnizParts.led = obniz.wired("LED",{anode:0});
```

![sample-config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/046e39b2-180c-6691-50e7-80f201a8f265.png)



## obniz repeatの設定

obniz Repeatノードの設定は、主に３つです

- obniz
上記obnizの設定で作成したobnizを選択します

- interval
繰り返しの間隔時間を指定します（ミリ秒）

- コード
繰り返しで行う動作を設定します


コードでは、obnizの初期化処理のときと同じく下記変数が割り当てられていて、使うことができます

| 変数名 | 説明 |
|:-:|:--|
| msg  | 空オブジェクト `{}`  |
| obniz  | new Obniz("OBNIZ_ID")で作られたobnizインスタンスが割り当てられます  |
| obnizParts  | すべてのobniz関連ノードで共通のオブジェクトが割り当てられます。<br/>初期は空オブジェクト `{}` です。<br/>obniz.wiredで作られたパーツインスタンスを格納するのにご利用ください |


今回の例だと、obnizの初期化処理で `obnizParts.led` を作成していますので、ここでは `obnizParts.led` を使うことができます


nodeのデータ出力方法は２つあり、どちらもfunctionノードと同じ仕様になっています。

- `return msg` で発火
- `node.send(msg)`で発火


基本は`return msg`を使ってもらえればと思いますが、非同期処理などがある場合は  `node.send(msg)`でも発火できます。

たとえば、m5stickCのボタンAが押されてるかどうかを1秒おきに発火させるにはこのように書きます。

```
msg.payload = await obniz.buttonA.isPressedWait();
return msg;

```
![スクリーンショット 2020-10-12 12.58.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/65395527-ca57-8bec-a5b8-1e0851f6369b.png)


![スクリーンショット 2020-10-12 12.57.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/dac9b352-686a-821a-72fd-ca6ef69e57cc.png)




## obniz functionの設定

obniz functionノードの設定は、主に2つです

- obniz
上記obnizの設定で作成したobnizを選択します

- コード
発火時に行う動作を設定します


コードでは、他と同じく下記変数が割り当てられていて、使うことができます

| 変数名 | 説明 |
|:-:|:--|
| msg  | フローから受け取ったメッセージオブジェクト  |
| obniz  | new Obniz("OBNIZ_ID")で作られたobnizインスタンスが割り当てられます  |
| obnizParts  | すべてのobniz関連ノードで共通のオブジェクトが割り当てられます。<br/>初期は空オブジェクト `{}` です。<br/>obniz.wiredで作られたパーツインスタンスを格納するのにご利用ください |


今回の例だと、obnizの初期化処理で `obnizParts.led` を作成していますので、ここでは `obnizParts.led` を使うことができます


nodeのデータ出力方法は２つあり、どちらもfunctionノードと同じ仕様になっています。
ここらへんはobniz repeatと一緒ですね。

- `return msg` で発火
- `node.send(msg)`で発火


基本は`return msg`を使ってもらえればと思いますが、非同期処理などがある場合は  `node.send(msg)`でも発火できます。


たとえば、msg.payloadの値に応じてLEDを光らせたり、ディスプレイに文字を表示する場合はこのように書きます。

```
if(msg.payload > 100){
    obnizParts.led.on();
}else{
    obnizParts.led.off();
}
obniz.display.clear();
obniz.display.print(msg.payload);

```



![スクリーンショット 2020-10-12 13.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/a5c079fb-6cd9-bfa0-20c0-7e7192db53ea.png)

![スクリーンショット 2020-10-12 13.05.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/8290274b-119c-80aa-ed4b-fe14c4937337.png)


また、obniz functionノードでデータのセンシングを行えば、発火されたときだけデータを取得しに行くということができるようになります


```
msg.payload = await obniz.buttonA.isPressedWait();
return msg;

```
![スクリーンショット 2020-10-12 13.05.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/1c72f360-cbba-3311-c33a-b7b1933e59d9.png)

![スクリーンショット 2020-10-12 12.57.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227015/893ab47e-e328-ac80-f938-aa5afc939e9c.png)


# まとめ
obnizノードが進化したので、だいぶ使いやすくなったと思います。
バグ連絡は twitter:@9wick まで！

pull-reqもお待ちしてます!
https://github.com/obniz/obniz-nodered-sdk