オフィスハック ラズパイとMESHボタンで会社の呼び鈴を作った記録

弊社札幌オフィス、4月くらいからオフィスの内装工事が始まりまして、徐々にプロジェクター設置、ソファーの搬入、机設置、などなどだんだんオフィスらしくなってきました。
![IMG_1770.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18306/109de4f2-7d7e-9efe-f053-968ec32614b1.jpeg)
![IMG_1791.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18306/d23474e0-1de1-0a4c-c59a-715111847592.jpeg)



一方で、社内のオフィスハック委員会（現 未来研究委員会）では、Amazon IoT Enterprise ボタン から Lambda を動かしてコーヒーやゆで卵の通知をslackに行う、Co2濃度を測定してslackへ通知する などなど。 オフィスハックを自由にやっていい文化もあるようです。

そこで、札幌オフィス入り口につける呼び鈴 を作成することにしました。

まず最初に用意したセットがこちら
![IMG_1744.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18306/e0ec155b-ff1e-33b8-b944-6a1683285525.jpeg)


Raspberry Pi 3B+ と電源ケーブル、microSDカード
![IMG_1750.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18306/97ca42d6-16b1-4f6e-0dc3-7a9314ca72fa.jpeg)


ラズパイの上には、クリスタルシグナル pi （以下: クリシグ）も載せました。こちらのプロダクト、http://ラズパイのIPアドレス/〜 へHTTPリクエストを投げることで、上に乗っているクリスタルを好きな色で光らせることができる。（点灯、点滅、速度を変えるのも可能で、手前の赤いボタンを押すと消灯する。）

![IMG_1950.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18306/6c669313-20cf-5408-d65c-1ce6f618f9d8.jpeg)

呼び鈴本体のボタンは、AWS IoT Enterprise ボタンを使います。会社でコーヒーメーカーの横に貼ってあったりして、実績ありますからね。これで問題ないでしょう。

ということで組み立てて、Lambda 関数を作成し、ボタンぽちー

ん？？

？？？

？？？

（10秒くらい待った）

（クリシグが光る。slackにも通知くる。）

え、、、まじでそんなに時間かかるの？
もう一回ボタンぽちー

やはりクリシグが反応するのに10秒くらいかかってしまいます。

Lambda関数はVPCを設定すると、起動に時間がかかるという情報を事前に得ていたので、VPCは設定せずに単体で動くようにしてあります。Lambdaは一度実行してから次まで時間が空いてしまうと一旦コンテナが削除されてしまい、起動するのに時間がかかる という特性があるので、連打したり定期実行してコンテナが削除されないようにと頑張ってもみました。しかしどれも呼び鈴として満足する結果は得られませんでした。

ボタンを押すたびに海の向こうのAWSまで通信していては遅いのも無理はないと思い始め、直接ラズパイに繋がるものでスクリプトをキックできれば、localhostへのHTTP通信は一瞬で行われるはず。

ということで次に試したのがこれ、ダイソーで300円で売っているbluetoothのシャッターボタン
![IMG_1951.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18306/84eecbb2-8e77-a9b9-dd6d-60b96938d8f2.jpeg)


ラズパイにもBluetoothが搭載されているので、ペアリングすることでボタンを押したことを検知することができる。またボタンのup/down それぞれで実行するスクリプトを設定できるので、ここにcurlコマンドやslackへのpost処理を書いたスクリプトを書いて指定すればサクッと動くのでは？と考えたのです。

ボタンぽちー

・・・・

・・・

・

反応しない。

・・・・

・・

・

反応しない

たまーに反応してくれるときもあるんですが、このボタンはBluetoothのペアリング自体が1分で切れてしまいます。元がシャッターボタンという用途ですからね。。1分に1回ペアリングし直し、なんてことは呼び鈴には不適合です。これもボツ。

このあと、しばらくボタン探しの旅に出ることになります。電子回路とかハンダゴテを触ったのは、おそらく中学校の技術の時間にライトを作ったのが最後。基板も回路図も全く読めません。そんな中、なんとか使えるものは無いだろうか？とIoT関係のサイトや書籍を読み漁り、いろいろ探しました。

そしてたどり着いたのがこのボタン。MESHボタンでした。

> シンプルなボタンです
> 緑色のボタン(Button)ブロックは、ボタンスイッチとして使えます。ボタン(Button)ブロックが1回押されたら、長押しされたら、2連続で押されたら何かが起こる、 そんなシンプルなアイデアをカタチにできます。

http://meshprj.com/jp/tag/MESH-100BU-Button.html


MESH-100BU ボタン(Button)ブロック - シンプルなボタンに無限の可能性 ワイヤレスボタン | ソニー緑色のボタン(Button)ブロックは、ボタンスイッチとして使えます。ボタン(Button)ブロックが1回押されたら、長押meshprj.com

MESHシリーズは発売当初から知っていて、人感センサーを使ってなにかできないかなーと考えてたころもありました。しかし動作させるためにはiPadが必要、と認識していたのでここで使うにはちょっと厳しいかなぁと諦めていたのです。

ところがiPadのかわりにRaspberry Piと連携できる、しかもレシピを自分で書ける、という機能がリリースされていました。これはもしかして！！と思い早速購入してきました。

MESHブロックもBluetoothでラズパイと通信する都合で、最初のペアリングがサクッとはできず、ちょっと苦労しました。一度つながってしまえば、ラズパイの電源を落としたなどペアリングが切れると、メールで通知してくれるなど使い勝手は悪くないです。

https://meshprj.com/sdk

MESH SDKのサイトにログインして、カスタムタグのスクリプトを書いていきます。少しわかりにくいのがスクリプトを書くところが4つあって、順に Initialize、Recive、Execute、Result とタブ切り替えのようになっています。デフォルトで表示されるのがInitializeで、ここしかスクリプトを書くところが無いと思い込んでいた私は、少し嵌ってしまいました。ボタンを押したときに動作させたいスクリプトは、Execute の textarea へ書くのが正解です。

```javascript
var apiURL = "http://xxx.xxx.xxx.xxx/bell.php";

ajax ({
   url : apiURL,
   type : "get",
   timeout : 5000,
       success : function ( contents ) {
	   log("[success]");
           callbackSuccess( {
               resultType : "continue"
           });        
       },
   error : function ( request, errorMessage ) {
       log("[ERROR]" + errorMessage);
       runtimeValues.outputIndex = -1;
       callbackSuccess( {
           resultType : "continue"
       } );
   }
});

return {
   resultType : "pause"
};
```

こんなスクリプトを書きました。ほぼJavascript、jQueryでAjax通信するときと同じようなコードですね。

最終的に、ラズパイは2つになりました。当初、クリシグのラズパイでMESHのスクリプトも動かせば1台で済むと思ったのですが、HTTPサーバーのあたりが干渉してしまうようで、調整が難しかったので、問題をシンプルにするため、それぞれ別のラズパイを使うことにしました。

ラズパイ同士は、社内の無線LANにつながっており、プライベートIPでアクセスできるため、ボタンを押してからラズパイBELLへのアクセスで外部ネットワークを通りません。（MESHを使っているので別途そちらで外部アクセスしているかもしれませんが。）そのためネットワーク的なレイテンシーは問題にならない設計です。

また最初はOpenJTalk を使って動的にメッセージのmp3を生成してスピーカーから音声を流す、ということをしていました。呼び鈴にはたとえば天気予報のように動的に変わる要素がないこと、動的に生成することで再生までにかかる時間を少しでも省略したいと思い、固定のmp3ファイルを再生することにしました。


<b>ラズパイMESH</b>

![IMG_1945.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18306/6befc900-8e66-56a5-f143-851adf760a75.jpeg)

- MESHボタンの押下を検知
- カスタムタグを実行
- ラズパイBELLへHTTPリクエストを投げる

<b>ラズパイBELL</b>

![IMG_1949.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18306/b2b74b99-1a72-6760-d3d0-4c20e228ea05.jpeg)

- webサーバーでHTTPリクエストを受け取り
- 自分自身のクリシグ点灯ようURLへHTTPリクエストを投げる → 光る
- スピーカーで呼び出し音を鳴らす
- slackへメッセージをPOST


廊下の呼び出しボタン
![IMG_1939.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18306/6202dabf-3171-fd4b-9f95-e89d3d7947e2.jpeg)


ということで設置完了です。

ボタンはMicroUSBケーブルでの充電式になっており、公式では1ヶ月ほど持つそうですが、定期的につけ外しと充電が必要になってしまいます。そこで3Mのこちらのテープでつけてみました。両面がマジックテープの硬い側のような状態になっていて、ちょっと力を入れてつけるとガシッとハマってちょっとやそっとじゃ落ちてしまわななさそうです。

3M コマンド ファスナータイプ Sサイズ 4セット CMF-1H
[https://www.amazon.co.jp/dp/B003OCMXUQ](https://www.amazon.co.jp/dp/B003OCMXUQ)

設置した翌日、たまたま什器の搬入などで業者が何度も出入りする場面があり、皆さんちゃんとこの新しい呼び鈴を押してくださいました。slack通知されるので、たまたま誰もいないタイミングで来客があっても専用チャンネルで通知されて便利です。

会社の入口前には自動販売機があって、ちょくちょく買いに来る方がいたり、お手洗いや給湯室へ行く方の足音などがわりと聞こえる、という状況の中で、来客がドアをノックする音を聞き分けないといけないのは、仕事に集中しにくい状況にも繋がっていました。

お仕事中は、イヤフォンをしていたり、テレビ会議をすることもあります。そんなときでも、音（スピーカー）と光（視覚）とSlack（通知）と複数のチャンネルで伝えてくれるため、来客に気づかない心配がなくなりました。

もし弊社札幌オフィスへお越しになる機会がありましたら、ぜひこの新しい呼び鈴を押してください！

【感想追記】
ただただ呼び鈴がほしい、鳴ればいい、ということであれば、安いものだｄと200円くらいから市販のものが売っていたのですが、無駄に頑張って自作してみました。結果としてAWS IoT Enterprise ボタンやLambda
、ラズパイで音を鳴らす方法など、を少しずつ調べながらやったので勉強になったし経験値がアップしたと思います。
最終的には電子工作には至らなかったけれど、ボタンを探す過程で結構電子工作的な情報にも触れ、新たな興味にもつながっています。
来月、東京で行われる Maker Faire Tokyo というイベントに興味を持ちました。良いタイミングなので参加してたくさん刺激を受けてきたいと思います。

Maker Faire Tokyo
https://makezine.jp/event/mft2019/


次のおもちゃは、`M5Stack` と `M5StickC` を買ってあるので、何を作ろうかワクワクしています。 

-----

クリシグを組み立てる際、ネジの締め加減を誤って締めすぎてしまった結果、ネジの受け側のパーツを全損してしまう事故がありました。市内の大きめなホームセンターを探しても同じものが見つからず困っていたら、販売元の会社まつい社長 @ketaiorg から連絡を頂き、破損してしまったパーツを分けていただきました。ありがとうございました。
![IMG_1781.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18306/7aecc69b-7c1e-206c-f55c-76021d73b78d.jpeg)

後日教えていただいたスペーサーというこのパーツはモノタロウで売ってるそうです
https://www.monotaro.com/g/01214584/