obnizにLINEで問いかけて休み方を決めてもらう

## 休憩の仕方を決めてもらうっていうのはいかがだろうか
最近多忙である。
プライベートもお仕事もいろいろやることが多い。
さて休もうかってときに、だいたいコーヒーを飲むことになるのだが、「散歩とか遠くの景色見た方が目にいいんだよな」とか思ってもやらないことが多い。
せっかくだから、最近覚えたobnizを使って、
普段やらないけど、やった方がよさそうな休み方をobnizに発信してもらうことにしようと思う。

反応の仕方は色々とあると思うが、フルカラーLEDを使用することにした。
思いのほか光が強いので、目に留まりやすいと思ったからだ。

あと、本当は休み方を何百通りも用意してランダムに・・・とかしたいところだが、今回はそのプロトタイプってことで数パターンになっている。

## 完成イメージ
obnizの画面上には休み方が載っていて、ライトも点灯する。

https://twitter.com/ySuljbjE7vLmUov/status/1518287988140441600

ライン側では、以下の通り、「疲れた」と呟くと反応する仕組み。
ライトの点灯とメッセージの返事の2通りで反応してくれることになった。

https://twitter.com/ySuljbjE7vLmUov/status/1518288006360158208

## 環境等
<dt>環境</dt>
<dd>Heroku環境上でNode-REDを使用</dd>
<dt>API</dt>
<dd>LINEmessagingAPI</dd>
<dt>ハード</dt>
<dd>obniz Board 1Y</dd>
<dd>フルカラーLED</dd>

## 完成フロー
フローの全体はいたってシンプルだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607557/3e2c9a97-29f0-9534-f5a0-05709731948c.png)

「疲れた」と呟くとフルカラーLEDが反応してくれて、それ以外であれば、「その調子！」と反応してくれる。
それ以外のパターンが1パターンなので、もうちょっと気の利いた返答が出来るようになるとより良いとは思う。
今回は、obnizの反応の方に注力したかったので、メッセージのやりとりという意味では省力化した。

JSONはこちら。
~~~
[{"id":"5e8ede99.4ce0d","type":"obniz-function","z":"6f69e0fd.984ac","obniz":"ffaf4872.dd93c8","name":"フルカラーLED","code":"var min = 0 ;\r\nvar max = 3 ;\r\nvar i = Math.floor( Math.random() * (max + 1 - min) ) + min ;\r\n\r\nobniz.display.clear(); // 画面を消去\r\n\r\nif (i === 1) {\r\n    obniz.display.print('coffee');\r\n    obnizParts.WS2811.rgb(103, 49, 67); // コーヒー\r\n    //const result = msg.payload;\r\n    const result = 'コーヒーでも飲んで休もう！';\r\n    msg.payload  = result;\r\n} else if (i === 2){\r\n    obniz.display.print('sleep');\r\n    obnizParts.WS2811.rgb(255, 148, 255); // 仮眠\r\n    const result = 'たまには仮眠とってもいいんじゃない';\r\n    msg.payload  = result;\r\n} else if (i === 3){\r\n    obniz.display.print('sky');\r\n    obnizParts.WS2811.rgb(139,255,255); // 空\r\n    const result = '気分転換に外でお散歩もありだよ';\r\n    msg.payload  = result;\r\n} else {\r\n    // 押してないとき\r\n    obniz.display.print('nothing');\r\n    obnizParts.WS2811.rgb(255,255,255); // 無\r\n    const result = '瞑想で心穏やかに';\r\n    msg.payload  = result;\r\n}\r\nawait obniz.wait(1000); // led ON for 1sec.\r\nobnizParts.WS2811.rgb(0, 0, 0);\r\nreturn msg;\r\n","x":720,"y":300,"wires":[["e436c204.f0c14"]]},{"id":"fa4c7e8.619e08","type":"Webhook","z":"6f69e0fd.984ac","name":"","url":"/webhook","x":360,"y":380,"wires":[["33c402cc.b49fde"]]},{"id":"33c402cc.b49fde","type":"switch","z":"6f69e0fd.984ac","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"疲れた","vt":"str"},{"t":"else"}],"checkall":"true","repair":false,"outputs":2,"x":530,"y":380,"wires":[["5e8ede99.4ce0d"],["21b0f89a.f55238"]]},{"id":"e436c204.f0c14","type":"ReplyMessage","z":"6f69e0fd.984ac","name":"","replyMessage":"","x":920,"y":360,"wires":[]},{"id":"21b0f89a.f55238","type":"obniz-function","z":"6f69e0fd.984ac","obniz":"ffaf4872.dd93c8","name":"その調子！","code":"obnizParts.WS2811.rgb(0, 0, 0);\n\n//const result = msg.payload;\nconst result = 'その調子！';\n// 返信メッセージをhttp requestの結果にする\nmsg.payload  = result;\n\nreturn msg;","x":710,"y":440,"wires":[["e436c204.f0c14"]]},{"id":"ffaf4872.dd93c8","type":"obniz","obnizId":"00000000","deviceType":"obnizboard","name":"","accessToken":"","code":""}]
~~~

## 各種ノードの設定
### switchノード
ひとまずobnizに繋ぐための分岐点ということで、特に癖のない内容になっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607557/6df68c28-29cd-c1dd-a6f0-e04ec4200ecf.png)

### obniz funcitonノード「フルカラーLED」
最初に提示したように、「どういう休み方をするのか」というのをobnizから発してもらいたい。
今回は、ランダムな値を割り振って、値に応じた休みパターンをobnizから発してもらうことにした。

ランダムな値の割り振りについては、前回Qiitaでも使用して使い勝手が良かったので今回も使うことにしている。

https://qiita.com/long66tail/items/00ba2e3912933331ecec

休み方は4通りあって、それぞれに色を割り振ることにした。
各種の色は、[RGBが確認できるツール](https://www.lab-nemoto.jp/www/leaflet_edu/else/ColorMaker.html)を使用して決めた。

| No | 休み方 | カラー |
|:------|---------:|:-------------------:|
| 1     | コーヒー  |茶色（そのまま）|
| 2     | 仮眠      | ピンク（なんかフワフワしたイメージ）|
| 3     | 散歩      | 青（空のイメージ）|
| 4     | 瞑想      | 白（無のイメージ）|

具体的なパターン別の色設定内容は、以下を参考にして欲しい。

~~~javascript
var min = 0 ;
var max = 3 ;
var i = Math.floor( Math.random() * (max + 1 - min) ) + min ;

obniz.display.clear(); // 画面を消去

if (i === 1) {
    obniz.display.print('coffee');
    obnizParts.WS2811.rgb(103, 49, 67); // コーヒー
    //const result = msg.payload;
    const result = 'コーヒーでも飲んで休もう！';
    msg.payload  = result;
} else if (i === 2){
    obniz.display.print('sleep');
    obnizParts.WS2811.rgb(255, 148, 255); // 仮眠
    const result = 'たまには仮眠とってもいいんじゃない';
    msg.payload  = result;
} else if (i === 3){
    obniz.display.print('sky');
    obnizParts.WS2811.rgb(139,255,255); // 空
    const result = '気分転換に外でお散歩もありだよ';
    msg.payload  = result;
} else {
    // 押してないとき
    obniz.display.print('nothing');
    obnizParts.WS2811.rgb(255,255,255); // 無
    const result = '瞑想で心穏やかに';
    msg.payload  = result;
}
await obniz.wait(1000); // led ON for 1sec.
obnizParts.WS2811.rgb(0, 0, 0);
return msg;
~~~

あとは、休み方に合わせたコメントを _msg.payload_ に設定して、LINEのメッセージとして返却してもらうようにした。

参考までに、ノード内の内容と初期設定も残しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607557/571359fe-e33c-c3c6-db8d-e2d64b85508b.png)

~~~
obniz.display.clear(); // 画面を消去
obnizParts.WS2811 = obniz.wired('WS2811', { gnd:0, vcc:1, din:2 });
~~~

### obniz funcitonノード「その調子！」
「疲れた」でなければ、それ以外のルートということで設定しておいた。
LINEメッセージを返却させるためだけのものだ。
~~~javascript
obnizParts.WS2811.rgb(0, 0, 0);

//const result = msg.payload;
const result = 'その調子！';
// 返信メッセージをhttp requestの結果にする
msg.payload  = result;

return msg;
~~~


## 解消したいこと
フルカラーLEDの限界なのだろうが、コーヒーの茶色と仮眠のピンクが似て見えるし、散歩の青（空色）と瞑想の白色が殆ど一緒なので、結局どの休み方にすればいいのかがライトから判別がつかない。
もっとくっきりとした赤青緑とかにすればいいのだろうが、遊び心もないし味気無く感じてやらなかった。
ライトだけで難しければ、頼り切らずに音とか動作とかでも分かるようにすればいいんだと思う。

## 実は追加でやりたかったこと
上述した通り、ライトだけではなく音でも休み方を表現するというのもいいと思って、
「疲れた」と伝えたら海を表現してくれるということも付け足してみようとしたが、実装には至らなかった。
サーボモータを使用して、ペットボトルに入れた砂を傾けさせるといい音になりそうな気がする。
サーボモータがパワーがあるのはわかっているので、音の出し方や固定の仕方を考えると出来ると思う。

## おわりに
obnizなどのハード面が合わさると、やれることが増えることを改めて感じた。
先日IoTのハッカソンイベントに参加したのだが、各自がアイデアにあわせて思い思いのものを作ることが出来ており、技術力だけではなくアイデアによっては本当に面白い素敵なものが仕上がっていた。

私もせっかくobnizに触れるようになったし、LINEやAPIなどといった技術面も習得し始めていると思うので、アイデア方面にも磨きをかけて、より魅力的なものを作れるようになりたいと思う。