ChatWorkとArduinoでオフィスハック - 応接室編
Expand
昨年に続き、今年も始まってますChatWork Advent Calendar2014!
本日6日目の担当は、デザイン部の西口です。
昨年の「オフィスハック - トイレ編」で、一部方面から予想外にウケた美味を覚えてしまい、今年も(またかという声もありそうだけど)チャットワークAPIでオフィスハックをすることにしました。
それでは、最後までお付き合いのほどよろしくお願いします。
リリースを待ち望む声が非常に多かったメッセージAPI が、先日ついに公開されました!(大変おまたせしました)
公開されてしばらく経ちますので、すでに活用されている方もいらっしゃると思います。
私もさっそく使ってみたくて、この記事のネタ用にと趣味プロジェクトで作っていた、オフィスの応接室の使用状況を調べる装置と組み合わせることにしました。
弊社は今年の春に新しいオフィスに移転しました。
新オフィスの応接室は、中に人がいるのかどうか外からでは伺い知れないほど遮音性が高くなっています。
重要な話をすることがあるため、遮音性が高いことは大事なことです。
ですが、ある日事件は起こりました。
中に人がいるのが分からなさすぎて、誰も気づかずセコムをセットして退出してしまい、会議をしていたメンバーが応接室から出てきたところセコムが反応し、警報が発火してしまったのです!!
通常、使用しない時は扉を開けたり、使う時は共有のGoogleカレンダーに予定を入れるなどのルールがありますが、こんな出来事があったので新たなイノベーションが必要とされていると感じ、応接に人がいるかを簡単に知れる装置を作ろうと思いたちました。(そんな大きなオフィスでもないので、すぐに確認できるっちゃーできるけど)
作り始めた当初は、センサ入力をArduinoからJavaScriptに送信し、データに応じてHTMLの表示を切り替えるものを考えていました。 それをiPhoneで表示し、セコムの機械のすぐそばに置いて使うイメージでした。(iPhone古!)
そこに、メッセージAPIを取り入れることになり、前述のiPhoneで見るものとは別に、チャットワークから応接が使用中かを問い合わせると、それに返事をしてくれるBOTを作ることにしました。
チャットワークAPIはチャットワークの「動作設定」>「API発行」でトークンを発行することで使えるようになります。
人がいるかどうかを検知するのに、今回は受動型の赤外線人感センサ(Passive Infrared Ray、PIRセンサ)のモジュールを使うことにしました。
物体(人も)はその温度によって異なる波長で赤外線を放射しています。
人感センサ(PIRセンサ)はその赤外線を検知し、その波長(温度)に変化が起こるとそれを物体(人)の動きとして検知します。
写真のようなセンサーモジュールを使うと、ワイヤリングするだけですぐに使えるのでお手軽です。(その分少しお高く(1,000円ほど)なりますが)
Arduino側は、デジタルI/Oに接続した人感センサからの入力をパソコンに出力するという処理をさせます。
そのプログラムは下記のようになります。
13や8というのは、ArduinoのI/O番号で、どのピンを使うかを指定し、そこにセンサーからの信号線を指します。(上の接続図ではデジタル2番ピンにつながっています)
setup の Serial.begin(9600); でポートを開き(9600は転送レート[bps]の指定です)、
loop で0.1秒おきに Serial.println(pir_read); でpir_pin(人感センサ)からの入力値(0か1)を送信しています。
実際にプログラムをArduinoに書き込むとすぐに実行され、Arduino IDEのシリアルモニタで送信されてくるデータを見ることができます。
JavaScriptとArduinoでシリアル通信
センサ入力に反応するBOTを作るには、Arduinoから送られてくるデータをJavaScriptで受け取る必要があります。
その通信に今回は SerialPort Server を利用しました。
SerialPort Serverを使うと、JavaScriptとArduino間でHTTP、WebSocket、TCP Socketでデータのやりとりができます。
% gem install serialport-server
でインストールし、起動は次のコマンドを実行します。
% serialport-server /dev/tty.{usb-device}
usb-device には、Arduinoを接続しているUSBポートを指定します。 USBポートは、Arduino IDEの「ツール」メニュー > 「シリアルポート」で調べられます。
起動するとポート番号:8783でシリアル通信用のサーバーが立ち上がります。
BOTでは、特定のチャットルームのメッセージを受け取り、そのメッセージとセンサ入力に応じた返事を投稿するという処理をさせます。
では、ひとつづつ見ていきましょう。
まずはセンサ入力を受け取る部分です。
0.1秒間隔でデータを受け取り、sensor_output を更新しています。
次にチャットワークのメッセージ受信と投稿部分です。
room_id でチャットルームを指定します。
そして、BOTの処理部分です。
未読メッセージを受信、返信メッセージを生成し、投稿するという処理を繰り返しています。
チャットワークAPIのリクエスト数は5分あたり100回までに制限されているため、メッセージ受信間隔には注意が必要です。ここでは5秒間隔にしています。
クライアント側では、センサ入力を $.getJSON で受け取るので、あらかじめ jQuery を読み込んでおきます。
これをiPhoneなどで表示させる場合、BOTの時のように var serial_server = 'http://localhost:8783' の指定では通信できません。
ローカルネットワーク内であれば、SerialPort Serverを起動しているパソコンのIPアドレスを指定します。
そして、受け取ったセンサーデータに応じて、HTMLを操作する処理を書きます。
こうして作ってきた装置がどのように動いているのか、デモ動画に撮りました。(センサが敏感すぎてうまく撮れない…)
人感センサーモジュールが赤く光っている時が反応(人がいる)している時です。 センサの反応に連動して、iPhoneのブラウザの表示が切り替わっているのが分かります。
そして、チャットワークから「おるか?」と問い合わせると、センサが反応している時は「おるで」、反応していない時は「おらんで」という返事をBOTが投稿します。
また、「セコムええか?」と聞くと「セコムええで」「セコムまだあかんで」という返事がセンサの反応に連動して返ってきます。
ChatWork APIを他のWebサービスと組み合わせた例は、いろいろと紹介されていると思いますが、今回紹介したようなハードと組み合わせても、職場環境が良くなったり、生活に潤いを与えてくれる(潤い…?どんなものか全然思いついてないけど)ようなものが作れるかもしれません。
3日目のチンペイ(@tinpay)の記事でBeacon & チャットワークでオレオレ勤怠管理というようなものも紹介されています。
ぜひ、みなさんもチャットワークAPIを活用してください!
それでは、最後までご覧いただきありがとうございました。