Node-REDが中継してPepperとMilkcocoaが連携するメモです。
Choregraphe入っているPCにNode-REDを入れてPepperとMQTT連携するメモでPepperと手元のNode-REDの連携ができたので、あとはいろいろなサービスにもつなげやすくなります。
今回は発展させて、Node-REDが中継してPepperとMilkcocoaの連携をやってみます。
今回の仕組み
今回の仕組みは、Nefry v2.0やESPr® Developer(ESP-WROOM-02開発ボード)といったプロトタイプが得意なIoT機器と相性の良いMilkcocoというサービスをNode-RED経由でつないで、IoT機器のきっかけでPepperがしゃべるという仕組みにします。
と、説明しましたが、実際の動画を見たほうが早いですね。
こんな感じでNefryV2をボタン操作すると動きます。
今回は分かりやすくするためにボタン操作でしたが、たとえば、Grove 温度湿度センサーを取り付けてデータを送るように組み直せば不快指数に応じて、Pepperに何かしらを話させるような仕組みも可能です。
NefryV2の設定
発信側の NefryV2の情報としては色々と情報があります。主だったものを載せておきます。
- Nefry v2.0 | dotstudio
- Nefryの情報まとめ – Qiita
- Nefry 説明書
- NefryとMilkcocoaを連携させて、WebサイトにリアルタイムでPush通知してみる | 電子工作部
- 自作したオリジナルIoTデバイス「Nefry」とインターネットを繋いでみた | 電子工作部
書き込んだソースも上記の文献「NefryとMilkcocoaを連携させて、WebサイトにリアルタイムでPush通知してみる」に書かれているものをそのまま使っています。使う手順も是非記事を参考ください。
#include <Nefry.h> #include <Nefry_Milkcocoa.h> Nefry_Milkcocoa *milkcocoa; char *datastore; void onpush(DataElement *elem); void setup() { milkcocoa->print();//Setup ModuleにAPPIDの表示をする milkcocoa = Nefry_Milkcocoa::begin(); datastore = Nefry.getConfStr(3); Nefry.println( milkcocoa->on( datastore, "push", onpush) ? "Milkcocoa onPush OK" : "Milkcocoa onPush NG" ); } bool flg, old; void loop() { if ( (flg = Nefry.push_SW()) != old) {//ボタンの状態が前回と異なれば Nefry.println( milkcocoa->loop(10000)? "Milkcocoa Connect OK" : "Milkcocoa Connect NG" ); DataElement elem = DataElement(); elem.setValue("sw", flg ); old = flg; milkcocoa->push(datastore, &elem); } } void onpush(DataElement *elem) {//MilkcocoaのOn関数と同一 Nefry.print("onpush:"); Nefry.println(elem->getInt("sw")); }
こちらを設定し、まずNefryV2とMilkcocoaがつながることを確認しておきましょう。
中継のNode-REDの設定
つづいて、中継のNode-REDの設定です。今回は、Node-REDのバージョンは最新の0.17.5をベースに進めます。
ということで、仕組みを作っていきます。Pepperの話させる仕組みは以前のChoregraphe入っているPCにNode-REDを入れてPepperとMQTT連携するメモと一緒です。前回の記事で、PepperとPCで中継しているNode-REDの通信は成立しているものとします。
Choregraphe入っているPCにNode-REDを入れてPepperとMQTT連携するメモではこのような流れになっていました。
今回はIoT機器のきっかけでPepperがしゃべることを行うため、今回はこのようにフローを加えます。主に赤枠部分が追加されました。
NefryV2とESPr Developerの両方の機器を受け入れるようにしていたので2つのフローがあります。
この記事ではNefryV2側のフローを説明します。Milkcocoaからデータを受け取るmilkcocoa in ノード、ONの値が来た時だけ反応するようにするswitchノード、メッセージをつくるchangeノードで構成されています。
Milkcocoaノードのインストール
switchノードとchangeノードはプリインストール済みですが、Milkcocoaノードはインストールされていないのでまず準備しましょう。Node-RED UG ページにもあるようにNodeの追加のところで、エディタから追加する方法をオススメします。
メニューからパレットの管理をクリックします。
パレットの管理のウィンドウでノードを追加タブに移動して「node-red-contrib-milkcocoa」を検索して、ノードを追加ボタンををクリックします。
しばらく待っていると追加された通知が出ます。
パレットにも追加されてます。これでまずインストールは完了です。
Milkcocoaノードの設定
Milkcocoaノードの設定の設定です。API Keyを使えるセキュアなMilkcocoaノードの記事を参考にしましょう。
新規にmilkcocoa設定を追加します。
こちらに今回やり取りしたいMilkcocoaの設定を設定します。
switchノードの設定
switchノードの設定です。
こちらはデバイスからONの場合 {“sw”:1} が来るので判定できるようにします。msg.payload.value.swは、現状のMilkcocoaの場合、msg.payload.value に値の構造が来るので、そのsw階層のデータを待つという設定です。
changeノードの設定
changeノードの設定です。
今回はメッセージ内容をただただ送る形なのでmsg.payloadを「ねふりーがおされたよ」という値に変えます。
こちらでデプロイして設定は完了です。
今回のNode-REDのJSONノードデータも置いておきます。
[{"id":"b3d12b4a.8a69e8","type":"mosca in","z":"eb55360a.271718","mqtt_port":1883,"mqtt_ws_port":8080,"name":"","username":"","password":"","dburl":"","x":170,"y":160,"wires":[["37cb43d9.8321fc"]]},{"id":"37cb43d9.8321fc","type":"debug","z":"eb55360a.271718","name":"","active":true,"console":"false","complete":"false","x":670,"y":160,"wires":[]},{"id":"fbe0015.0273c","type":"comment","z":"eb55360a.271718","name":"MQTT ブローカー","info":"","x":170,"y":80,"wires":[]},{"id":"3da9e6f8.eff55a","type":"mqtt in","z":"eb55360a.271718","name":"","topic":"hotj78i2p14/message/push","qos":"2","broker":"ea9c480a.255328","x":256,"y":1360.5,"wires":[["6139fef3.49b28"]]},{"id":"1250eed2.f06391","type":"comment","z":"eb55360a.271718","name":"Pepper→ノートPC","info":"","x":237,"y":1303,"wires":[]},{"id":"e647667a.39a608","type":"comment","z":"eb55360a.271718","name":"↑ Milkcocoaから来る","info":"","x":180,"y":500,"wires":[]},{"id":"32e38298.0d655e","type":"mqtt out","z":"eb55360a.271718","name":"","topic":"hotj78i2p14/message/push","qos":"","retain":"","broker":"ea9c480a.255328","x":1040,"y":460,"wires":[]},{"id":"4bdebef1.d32e9","type":"inject","z":"eb55360a.271718","name":"","topic":"","payload":"いえーい","payloadType":"str","repeat":"","crontab":"","once":false,"x":580,"y":300,"wires":[["e094a8bf.3d7ad8"]]},{"id":"6139fef3.49b28","type":"debug","z":"eb55360a.271718","name":"","active":false,"console":"false","complete":"false","x":522,"y":1408,"wires":[]},{"id":"35d7d171.aba24e","type":"debug","z":"eb55360a.271718","name":"","active":true,"console":"false","complete":"false","x":990,"y":380,"wires":[]},{"id":"18bd370b.647779","type":"change","z":"eb55360a.271718","name":"「ねふりーがおされたよ」","rules":[{"t":"set","p":"payload","pt":"msg","to":"ねふりーがおされたよ","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":380,"wires":[["e094a8bf.3d7ad8"]]},{"id":"8b9c52ed.0891c","type":"milkcocoa in","z":"eb55360a.271718","milkcocoa":"30f556.98e59aaa","dataStore":"nefry","operation":"push","name":"nefry >>>","x":140,"y":380,"wires":[["c61a6921.2b1218"]]},{"id":"14325f7f.10bb81","type":"milkcocoa in","z":"eb55360a.271718","milkcocoa":"30f556.98e59aaa","dataStore":"espr_input","operation":"push","name":"espr >>>","x":140,"y":460,"wires":[["bed15f61.920de"]]},{"id":"dc9dada4.489cf","type":"change","z":"eb55360a.271718","name":"「エスパーがおされたよ」","rules":[{"t":"set","p":"payload","pt":"msg","to":"エスパーがおされたよ","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":460,"wires":[["e094a8bf.3d7ad8"]]},{"id":"c61a6921.2b1218","type":"switch","z":"eb55360a.271718","name":"ON判定","property":"payload.value.sw","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"num"}],"checkall":"true","outputs":1,"x":300,"y":380,"wires":[["18bd370b.647779"]]},{"id":"bed15f61.920de","type":"switch","z":"eb55360a.271718","name":"ON判定","property":"payload.value.v","propertyType":"msg","rules":[{"t":"eq","v":"1","vt":"num"}],"checkall":"true","outputs":1,"x":300,"y":460,"wires":[["dc9dada4.489cf"]]},{"id":"e094a8bf.3d7ad8","type":"function","z":"eb55360a.271718","name":"ハブ(なにもなし)","func":"\nreturn msg;","outputs":1,"noerr":0,"x":780,"y":420,"wires":[["35d7d171.aba24e","32e38298.0d655e"]]},{"id":"4308cd94.d41d84","type":"comment","z":"eb55360a.271718","name":"↓ ただ喋らせる","info":"","x":560,"y":260,"wires":[]},{"id":"76d2100.17e0ef","type":"comment","z":"eb55360a.271718","name":"ノートPC→Pepper","info":"","x":170,"y":260,"wires":[]},{"id":"83d7db43.c9cea8","type":"comment","z":"eb55360a.271718","name":"PepperとノートPCをつなぐためにNode-RED内で動作している","info":"","x":310,"y":120,"wires":[]},{"id":"ea9c480a.255328","type":"mqtt-broker","z":"","broker":"127.0.0.1","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""},{"id":"30f556.98e59aaa","type":"milkcocoa","z":"","appId":"hotj78i2p14"}]
動かしてみる
さて動かしてみましょう。Choregraphe入っているPCにNode-REDを入れてPepperとMQTT連携するメモで接続されてれば、あとは中継するNode-REDがMilkcocoaのデータを受信できればうまくいきます。
このように動きます!
ここまで出来たらIoT側を自分の企画に合わせて調整したり、Pepper側の動きにバリエーションを出すことで企画に合ったものにしたり色々と試していきましょう。
余談1:Milkcocoa以外にもリアルタイムにつなげられる技術
今回はMilkcocoaでのデータ連携をお伝えしましたが、リアルタイムにつなげられる得意なプロトコルや他のクラウドサービスもあるでしょう。
私がよくつなげる他のノードとしては、
MQTTノードや、
WebSocketノードも使いやすいです。IoT機器との相性もあるのでやりやすいものを使いましょう。ほかにもAWS・Azure・Bluemixといったクラウドサービスのリアルタイム技術とつなげられるものもありますので、Node-REDのフロー・ノード検索も利用して見つけましょう。
余談2:この仕組みの良さ
余談として、この仕組みの良さもちょっと話しておきます。
Node-REDが中継をせずPepperから直接IoT機器と連携すればよいのでは?と思われたかもしれませんが、これはプロトタイプ向きにさせています。
というのも、IoT機器からPepperまで連携させる上で、IoT側とPepper側の苦労ポイントがたくさんあるためです。ざっとあげてもIoT機器そのものの調子をはじめ、経由するWEBサービスが安定して稼働しているかもありますし、現場のWi-Fiの事情、Pepperの調子まで・・・気にするところがかなりあります。
そうなると、Pepperから直接IoT機器と連携するのが最終的に美しいのですが、ちゃんと動かすことを考えると、途中のところでテストできると、疎通チェックもしやすくいまどこが問題かが分かりやすくなります。
たとえば、最初の仕組みにNode-REDが中継しているところでどうなるかというと、
このように、IoTだけで疎通しているかも確認でき、Pepperへのシンプルなメッセージ確認、IoTからデータが来てちゃんとPepperが話せるデータになっているかなど、Node-REDを通過点にすることで安心感があります。
もちろん、Pepperから直接IoT機器と連携できるよう目指すことは大事ですので、今回のプロトタイプ向きな仕様で慣れてきたら、徐々に直接つなげられるようにし、途中動かなくなった時はサッと戻れるようにしておくと良いでしょう。
まとめ
ということで、Node-REDが中継してPepperとMilkcocoa(NefryV2)が連携するものをお伝えしました。
PepperとIoTが連携できると、Pepperに新しい知覚を付与できますし、PepperのデータとIoTのデータを組み合わせることで新しい視点が生まれたり、面白いなと感じています。
それでは、よきPepper & Milkcocoa & Nefry & IoT Lifeを!