前回レポートした IoTLT Vol42でデモをしたモチベーションIoT の中身を紹介してみます。
今年の酷暑でモチベーションあがんないなーって思いながら、でもIoTLT見に行きたいな考えていました。 どうせ行くなら何かネタを持っていきたいと思ってたところで突如思いついてしまった(具体的な流れは忘れました。一発ネタってそういうもんですよね)モチベーションIoTをなんとかした舞台裏となります。
制作物の紹介
モチベーションIoTと言いつつ、T(Things)の方はRaspebrry Pi 3B(以下ラズパイ), リレースイッチ, モバイルバッテリーとUSBミラーボールです。どちらかというとI(Internet)側のほうが肝いりの部分です。
全体像
今回はTrelloのカード移動、つまりタスクのカード単位でアクションがあった→タスクを終えたリストへ入れる行動を装置のトリガーとして、3つのサービスとラズパイのNode-Redをインターネット側と物側を仲介しています。
利用したサービス、部品
Trello Webhook API
まず最初にトリガーとして使うTrelloのAPIです。APIはREST APIがありますが、Webhook APIもあります。 これはTrello側がフック先にJSONを送るAPIで、Callback先のURLを登録すると、そのURLに対してJSONのデータをPOSTしてくれます。Callback URLはボード単位で登録する必要があります。
登録したTrello側で何かしらのアクション(タスクのカードを移動,コメントを入れるなど) があったときに、問答無用にCallback先のURLを叩くので、特定のアクションの挙動をJSONデータから読み取って処理を変えるなどの必要があります。
webhook APIはドキュメントや日本語の文献がいくつかあるので参照として残しておきます。なおAPIを使う場合は開発者として登録が必要になります。
- Webhook APIを使ってTrelloとchatworkを連携する - Qiita
- Google Apps ScriptからTrello APIを使ってみる - Qiita
- trelloのboardにwebhookを登録する - pblog
このWebhook APIを使った実際の例は次のGAS側で紹介します。
Beebotte(MQTT)
クラウドサービスであるTrelloのアクションをローカルのエンドポイントとなるラズパイ + Node-Redに届けるためのプロトコルとして使いました。
MQTT(Message Queuing Telemetry Transport)は主にIoTで利用されるパブリッシュ/サブスクリプション型のデータ配信プロトコルで軽量なプロトコルだそうです。
よく言われる例では、センサーの情報をMQTTブローカーに送り、情報を更に集めるサーバーにMQTTを介して送る形です。
MQTTについては詳しくないので詳細はググっていただければ。。
BeebotteはMQTTブローカーのサービスで、無料である程度の回数(1日最大5万回のメッセージ送受)利用できるので実験にもってこいです。
Beebotte側はMQTT以外にもREST APIでデータを受け取れます。今回はAPIの受け取り先URLをTrelloのアクションが実行されたときに自動的にデータを流し込む先として使います。BeebotteはそのURLをPOSTされた時点でMQTTのメッセージも送信するので、Node-RedのMQTTノードへ送れるようにしました。
Beebotteの参考情報はこちらです
- Beebotte
- IFTTTとBeebotteを使ってGoogleHomeからRaspberryPiを操作する - Qiita
- 爆速でMQTTのパブリックBroker環境を作る方法、Raspberry Pi からアクセスできる各種パブリッククラウドの比較 | IoT PLUS
Google App Script(以下GAS)
大枠としてはTrelloとbeebotte, 先で紹介するNodeRed+ラズパイまでがあれば足りると考えていましたが、Trello WebhookのCallback先にBeebotteのREST APIのURLを そのまま登録する と、TrelloのアクションをすべてBeebotte側で叩いてしまい、全てのアクションが起こるたびにMQTTのメッセージが送られてしまいます。
それもそれで良かったのですが、今回の実装としては特定のリストに入ったカードを特定のリストへ移動するを絞って動かしたかったので、上手く動かすためにTrelloとBeebotteの間にGASを挟んでTrelloのアクションを細かくフィルターしてBeebotteにデータを送ることにしました。
GASはGoogleのクラウドサービスでJavascript互換のスクリプトを実行させる環境です。よくGoogle系のサービス連携に使われます。
Apps Script | Google Developers
GASは端的にスクリプトを動かす以外にも、なんとWEBアプリケーションとしても動作可能だそうで、プロジェクト単位でURLを持つことができます。Node.jsみたいですね。
ということで言葉よりコードの方が早いかと思いますので、今回利用したコードをgistにあげておきました(利用に必要な各APIの情報は抜いてあります)
解説を一応書いていますが、TrelloのCallbackURLの登録をする、createWebhook関数と、WEBアプリケーションとして生成されたURLにPOSTされると実行されるdoPost関数を作りました。と言っても参考本のQiitaの記事を改変したレベルです。
Node Red, ラズパイ
MQTTで受け取ったメッセージを元にUSBミラーボールを動かすために使いました。
ノードをつなげるだけで操作ができてしまうのは(懐かしの)Yahoo! Pipesのような気軽さがあって楽しかったです。
ノードの組み合わせは写真のようになりました。msg.payloadが2つあるのはデバッグ用です。
トリガーノードはLチカの例で利用されているのをみて、それを使ってミラーボールを延々と回さないように10秒ほどで止まるようにしてみました。
あとTrello側の問題で対処したところがあって、TrelloのWebhookでフィルターしたアクションがどうしても二回出てしまうので、Node-Red側で連続でMQTTを受け取った場合のクッションとしても利用しています。
GAS側でフィルターしても良かったのですが、これで済んでしまったのでそのままにしてます。
リレーモジュール
USBミラーボールを操作するために用意しました。信号を送って、通電する・しないを物理的に操作できるリレーです。昔からよく見るもので電源を外部から操作するときに使われます。
Arduinoやラズパイの時代でもよく使われるもので、扱う電圧や電流をあわせれればコンセントで扱う交流100Vも操作できます。が扱いを間違えると危ないです。
今回は、USB規格の給電レベルで扱えるモジュールを探して安価なものを使いました。
SODIAL(R) リレーモジュール | |
ASIN : B00L11KL10 こちらはAmazonアソシエイトプログラム参加リンクです |
利用方法を探して見つけやすかったのも一つです。
ちなみに参考情報でも解説されていますが、このモジュールをラズパイのGPIOで操作しようとすると、2回路操作できる仕様が1回路のみとなるので注意が必要です。(1回路分のモジュールでも良かったのですが、あまり安くなかったのでこれにしました
- SODIALの送料込み143円の激安リレーユニットをRaspberry Piで利用成功(2016年の物欲その36) /usePocket.com別館
- 怪しいリレーモジュールを買ってみた
- Raspberry Piで携帯パトランプを作る (障害アラート通知) - Qiita
USBミラーボール
今回の主役。扱う品はこちらです。
ミラーボール カラーボールライティングステージライト 舞台照明 RGB LEDライト 回転ライト LEDミニレーザーステージ照明 LEDクリスタルドームライト 壁掛け ミラーボール 照明 パーティーグッズ イベント 二次会 会場 飾り 装飾 ディスコ パーティー KTV/カラオケ クラブ バー照明用ライトクリスマスUSB充電 | |
ASIN : B074G2YTNS こちらはAmazonアソシエイトプログラム参加リンクです |
USBから電源供給されると自動的にキラキラ光って回るようです。この状態は自動起動とよく書かれています。
なお、この製品はリモコン付きで、リモコンによる色の変更や音楽に合わせてライトの挙動を変える機能もあります。高度に動かしたい場合は、USB電源のオンオフではなくて、IRの解析などしてリモコン操作を行えるようにする工夫が必要だと思います。
ダイソーモバイルバッテリー
非常に小型で、5V 1Aを提供してくれるモバイルバッテリーを探したのですが、これを思い出したので買ってみました。製品の詳細は特集されているニュースなどを見ていただければと
- ダイソーの「300円モバイルバッテリー」は買っても大丈夫か? ガチ検証してみたところ…… - mitok(ミトク)
- 【100均検証】ダイソーの300円モバイルバッテリー(2000mAh)を使ってみた感想 | ロケットニュース24
その他利用したもの
- Androidのテザリング
- 予めRaspberry PiのWifi設定を変えておきました。
- すでに利用しているSDカードでも、PCやMacでマウントしてbootドライブにwpa_supplicant.confを入れておくとちゃんと読み込んでくれます
- ヘッドレスRaspberry Pi Zero w(h)のネットワーク初期設定やコンソールやUSB Gadget/Ethernetなどについてメモ - uzullaがブログ
- タッパー
- プロトタイプを持ち込むなら常套手段だと思います!
- 3Dプリンタ時代に逆行している気がしてるので、次は3Dプリンタを使って持ち込みたい。。。
注意点
今回の例は実験レベルです。具体的に挙げられる問題点はこちらです。
- 今回の例ではセキュリティについては考慮していません。
- そのため各APIやMQTTによる通信を傍受される可能性があります
- httpsのAPIはそれほど心配はないと思いますがMQTTは検討などしませんでしたので、実際に真似される場合は注意が必要です
- リレーモジュールで操作できる機器は100Vは難しいです。
- 別途100V対応のリレーなどの用意をしてください
- 回路については知識が乏しいので安全性は考慮していません
- 扱うモジュールなどに合わせた回路を作る必要があります
電子回路の知識は頑張ってもオームの法則レベルや利用したボードのピンについての情報を知っているレベルなので、安全性は考慮していません。長期稼働させる場合は電気系統の安全性確保をお願いします。
まとめ
というわけで長文となりましたが、今回扱ったモチベーションIoTもとい、TrelloのWebhookからUSBミラーボールを回すシステムの全体像をまとめました。
IoTLT発表当日に持ち込んだ制作物は、中身的にはラズバイとUSBミラーボールがおいてあるだけのシンプルな構造をしていましたが、裏ではいくつかのサービスを経由して初めて装置が動くという形でした。雲の上では割と複数のいろんなものを介して実行されていたわけです。
会場のハッシュタグで、タスクを移動させたらすぐに動作して早いと言われていました。理由についてですが残念ながら具体的にはわかりません。 Trello Webhookは割と早く動いてくれるのと、GASとBeebotte側で特にラグらしい動きもなく、テザリング側も接続は安定していたので、MQTTの受け取りもスムーズに行えてそうでした。このどれかが欠けてたらあの状態にはならなかったと思ってます。
苦労した点ですが、タイムラインにも書きましたが当初はIFTTTを経由して実行させる予定が、カードの移動がフックできないという調査不足を 3日前 にやらかしたところです...
流石に終わったと思いましたが、先人の方々の知恵にうまく乗っかることに成功しました。そういう意味で今回のネタは多くの先人の皆様のおかげでもあります。感謝しきれないです。
成り行きでGASを扱えたのは割といい経験だったのと、Node-Redの気軽さは使っていて気持ちが良いものでした。MQTTはもう少し仕組みを含めて扱えるようになりたいです。
今回は、ピカピカ光るミラーボールを回した程度でしたが、Trelloなどのクラウドサービスの状態をフックして装置を動かすアイディアは昔からやられています。TrelloのAPIはシンプルで扱いやすいので、業務で状態をトラッキングしたいときに使うと良いです。
社内でミラーボール回すのも一興だと思います。パトランプのほうが場の雰囲気としては合いそうですがw
蛇足ですが、今回リレーモジュールを使いたかった理由はもう一つあって、蛇口IoTで使えるのではと考えて練習として用意しました。蛇口の開け締めにアクチュエーターを使おうと考えて、12Vの供給をどうするかと考えたときにリレーが使えるなら扱いやすいと考えて試したかったのもあります。
しかしアクチュエーターを使った方法は、お風呂場の環境として難しい事情があったので別の方法を取る予定です。