satetsu888のブログ

アラサーwebエンジニアのブログ

Raspberry Pi 3 とタッチパネルで1タッチリマインダーを作った話

とある機会にプレゼントとしてRaspberry Pi 3 とタッチパネルをもらった。

せっかくなので以前から我が家の中で不便だと思っていたことを、流行りのIoT的なやつで解決してみようと思って、ワンタッチで特定の単語をiOSのリマインダーに追加できるやつを作った。

以前から不便だと思っていたこと

我が家では、僕と嫁さんの買い物のバッティングを防ぐために、iOSのリマインダーの共有機能を活用している。 二人で買うものリストを共有して、スーパーやドラッグストアに行くたびに開くだけで非常に便利で、生活に溶け込んだITの威力を感じる。

またリマインダーの良いところとしてSiriから簡単にタスクを追加できるというのがある。 iPhoneの中の特定のアプリを探して起動して文字入力する手間に比べると、Siriを呼び出して「◯◯をリマインド」と言う方が格段に楽だし、片手しか空いてないかつ数秒以上注意をそらせないような状況(家に小さい子どもがいるとよくある)でも問題なく使える。

ただこの Siri x リマインダー にも弱点があって、

  • 料理中、掃除中など片手すら離せない状況

  • お風呂の中などiPhoneを所持していない状況

では使えなくて困っていた。 iPhoneがたまごや肉の脂でベトベトになったり、水没したりするリスクを取ってまでリマインダーを使いたくはないが、一区切りついてから「たまご」や「シャンプー」を登録しておこうと思っていても、なかなか高い確率で忘れてしまう。

大抵のものは1日くらい買い忘れていても問題ないのだが、食料系などは無くなった時に買い忘れると困ることもある。我が家の場合「たまご」「チーズ」「食パン」あたりのものは、基本的に毎日消費するかつ賞味期限が比較的短くて買いだめしにくいため、無くなった時に忘れず確実にリマインダーに登録してやる必要性が高い。

つまり、たまごを割って手がベトベトかつフライパンの上ではたまごが刻一刻と焼けていっている状況において絶対に忘れずにリマインダーに「たまご」と登録したいのにできなくて不便、ということだ。

理想の解決方法

この困りごとの理想の解決方法は、実はアメリカにはすでに存在していて Amazon Dash Button があればそれで済む。

gigazine.net

たまごやシャンプーがなくなった瞬間にボタンを押せば届けてくれるというのは非常にクールで、このボタンがiPhoneのアプリとしてではなく独立したデバイスである点がサイコーである。 ただしこの理想の解決方法、まだ日本ではサービスが提供されていない。悲しい。 早く日本でもサービス開始して欲しいと思いつつ、同じようなことができるボタンを自作して設置したい。

IoTのプロダクトはなぜかみんな常時センサーデータを記録してクラウドビッグデータをやりたがる傾向がある気がするが、Amazon Dash Buttonみたいな環境中に場所に応じたシンプルなインタフェースを配置する方向もかなり大きな可能性があるように個人的には思う。

設計方針

僕のやりたいことはリマインダーに「たまご」を追加するだけではあるが、せっかく作るので汎用性をもたせたい。

ラズパイに表示されたボタンをタッチすると、登録しておいたタスクが実行される仕組みを作って、「リマインダーにたまごを追加する」タスクを登録できるように作れば、リマインダー以外のことがやりたい時にも対応できそうだ。将来的に1タッチでたまごが注文できるようになった時にもうまく使いまわせる気がする。 というわけで、ボタンを押すとIF by IFTTTのMaker Channelにリクエストを送るだけのインタフェースをラズパイにのせて、ボタンの種類の追加とIF側のルールの追加を行えばいろんな便利機能が1タッチで呼び出せちゃう感じで作る。

ちなみに IFTTT はまさしく僕が作りたいものに近い Do Button というやつも提供しているが、今の所スマホアプリにしか対応していない。 ラズパイにAndroidをのせてこの Do Button アプリを動かすという方針もありっちゃありだが、自作する方がいろいろつぶしが効きそうなので自作することにする。

よくわかるシステム構成図はこちら f:id:satetsu888:20160505214504p:plain

実装

本当にとりあえず動くようになっただけでREADMEも書いてないものがこれ

github.com

遊びなので使ったこともないPyramidとReactのチュートリアルを組み合わせたみたいな感じになったけど、どうにかこうにかボタンを押すとMaker ChannelにPOSTリクエストを送るだけのものができた。 各ボタンを押した時に送るPOSTリクエストの内容は、ラズパイのローカルに置いたDBで管理している。管理ツールはまだ作ってないがデバッグ用のリロードボタンだけ必要だったので置いた。

gyazo.com

しかし!

IFTTTからiOS Reminderの連携が全く同じリクエストを送ってもうまくいく時と行かない時があって詰んだ。 せっかく忙しい合間を縫って必死に投げたリマインダー登録が虚空に消えてしまうのは残念すぎる。

そこで、しぶしぶ汎用性を捨てて、スクレイピングiCloudを使うライブラリを取り込んで、リマインダーの追加はそっちを通して行うことにした。 IFTTT側の実装は今の所使い道を思いついてないけど残してある。

あとはこれをラズパイのローカルで立ち上げて表示して、本体を冷蔵後の側面に貼り付けて完成。 これで如何なる時でもあっという間にたまごをリマインダーに登録できる。便利。

f:id:satetsu888:20160505215102j:plain

まとめと今後の課題

昨日設置して今日2、3回使ってみたが、地味に便利さを感じた。 もう少し使いながら登録する単語を精査して利便性を上げていきたい。

また、実際に配置して使ってみると、かなり多くの問題が発見できた。

  • タッチエリアが意外と小さい、ボタンが離れてなくて誤タップする

  • onClickイベントで拾うと、タッチパネルの感度の問題でわずかにドラッグしてしまった時にボタンがおせなくて辛い。すぐにonMouseDownに修正した。

  • 一定時間で画面がスリープする、その復帰のためのタップによって誤タップが起きる

また、登録されていない単語をリマインドするために音声認識機能もつけたいし、 リマインダーとは関係なく、今日の天気や何のゴミを出す日かを喋って教えてくれる機能をつけて欲しいとのリクエストも嫁さんからもらった。 もとはキッチンコンピューティングくらいの予定だったけど、リビングコンピューティングくらいまで範囲を広げて、便利に使える機能を搭載していきたい。

[asin:B01D1FR2WE:detail]