この記事はShiftallのプロジェクトに関わるメンバーが日替わりでブログを更新していくアドベントカレンダー企画の1日目です。その他の記事はこちらのリンクからご覧下さい。
アドベントカレンダー2018
https://blog.shiftall.net/ja/archives/tag/adventcalendar2018/
久々のブログ更新となりましたカイです。
4月のShiftall事業スタートから半年が経過し、最初はのんびりと過ごしていた社内も今では慌ただしくなってきました。HomeX DisplayやWEAR SPACEなど、いくつかのプロジェクトは発表していますが、社内ではまだまだ公開できないプロジェクトも多数進行しています。
そんな忙しい状況ながら、Shiftallのプロジェクトに関わるメンバーのお力を借りて、IT業界では恒例となりつつアドベントカレンダーを本日より開始することとなりました。
アドベントカレンダーは、クリスマスまでに日数を数えるためのカレンダーになぞらえ、12月1日から12月24日までの24日間、ブログをリレー形式で毎日更新する、という企画です。
日々の業務やオフィスで使っているツール、はたまた趣味で作ったガジェットなどブログのテーマは自由。24本のブログ記事で、Shiftallのプロジェクトメンバーが日々どんなことをしていて何を考えているのか、その一端を知ってもらえれば幸いです。
「トマト何個残ってたっけ?」冷蔵庫における食材管理の悩みをIoTで解決
言い出しっぺの宿命として執筆する記念すべき第1回は、私のライフテーマとなりつつある食材管理について。食事の買い物に行くたびに悩む「あれ、トマト何個のこってたっけ?」「こないだ買って置いた玉ねぎってもう使い切った?」という冷蔵庫内の食材管理を、Google HomeとIFTTT、そしてGoogle シートを使って実現してみました。
具体的には冷蔵庫のそばにGoogle Homeを設置しておき、買ってきた食材の名前と個数をGoogle Homeへ話しかけるという流れ。冷蔵庫から食材を出し入れする時のながら作業でGoogle Homeに話しかけることで、トマトを何個買って何個使い、今冷蔵庫に残っているのは残り何個なのか、といった在庫管理を自動的に集計しています。
以下、長くなりますが設定手順を細かく説明しておりますので、冷蔵庫の食材管理に悩んでいる人は参考にしてみてください。基本的には難しい知識など必要なく設定が完了するようになっております。
IFTTTを使って、Google Homeに話しかけた食材と数量をGoogle シートへ記録
まず始めにIFTTTを使い、Google Homeに食材の名前とその数量を話しかけるとGoogle シートへ自動的に記入される、という連携を作成します。IFTTTのユーザー登録を済ませた上でIFTTTにログインし、画面右上の「New Applet」からアプレットを選択。
画面の「This」をクリック。
検索ウィンドウに「google」と入力、候補の中から「Google Assistant」を選びます。
IFTTTのGoogle Assistantは4つの設定が選べますが、今回はその中から一番名前の長い「Say a phrase with both a number and a text ingredient」を選びます。これはGoogle Homeに対して発したフレーズの中から好きなテキスト、好きな数字を両方使って指示をするための連携。テキストは「$」、数は「#」で表記します。
設定画面の一番上にある「What do you want to say?」は、Google Homeへ発声したいフレーズを入力します。今回は「買ったよ 【食材の名前】 【数】個」というフレーズを話しかけることで、買ってきた食材を登録することにしました。【食材の名前】を「$」、【数】を「#」とし、
買ったよ $ # 個
と設定します。
その下の「What’s another way to say it? (optional)」「And another way? (optional)」は、他の言い方でも登録できるようにという補助的な設定です。「買ったよ」を「買ってきた」や「プラス」に変えるなどお好みでどうぞ。
その下の「What do you want the Assistant to say in response?」は、正しく認識した時にGoogle Homeがどういう音声で答えるかを設定できます。フレーズが長いと次の登録まで時間がかかるので、「はい」とか「登録しました」くらい短くしておくのが実用的です。今回は短さ優先で「だん」と設定しました。最後に「Language」を「Japanese」にして「Create trigger」をクリック、先へ進みます。
続きまして今度はGoogle シートの設定に移ります。「that」をクリック。
「google」を検索して「google sheets」を選択。
2つのメニューのうち「Add row to spreadsheet」を選びます。これはGoogle Home経由で先ほど作成した音声入力があったとき、該当のスプレッドシートへ行を追加していく、という設定です。
設定画面のうち、最初の「Spreadsheet name」は自分でわかりやすい好きな名前をつけておきます。続く「Formatted row」が実際にスプレッドシートに書き込むための文字列で、使えるのは以下の記号とテキストです。
{{CreatedAt}} | セルに記入された年月日と時刻 |
{{NumberField}} | Google Assistantで「#」で指定した数字 |
{{TextField}} | Google Assistantで「$」で指定したテキスト |
||| | セルの区切り(この記号の左右が別のセルとして記入される |
セルの区切り記号以外は入力エリア右下の「Add ingredient」から追加できるのでコピペは不要です。今回は「食材の名前」「ステータス(買ったのか使ったのか)」「数」という順番に並べたかったので
{{TextField}}|||購入|||{{NumberField}}
としました。なお、{{NumberField}}で日付も入力できるのですが、これを使うと「November 30, 2018 at 07:57PM」というようなテキストで記録されてしまい、日付のデータとして使うことができないのでいまいち扱いにくい。日付についてはもう少しいい設定と活用方法がありますが、長くなるので後述します。
最後に保存したいフォルダーを設定。特にフォルダー管理していなければデフォルトの「Google/」のままでOKです。名前は今回冷蔵庫の「refrigerator」と「IoT」をかけて「refriot」という名前にしてみましたが特に深い意味はありません。
最後の確認画面。一番下のスイッチは今回作成した設定が動作するたびに通知するかどうかを選べる設定ですが、うまく動作したかはGoogle Homeの反応を見れば十分なのでここはオフにしておくのをお勧めします。
これで買ってきた食材の登録が完了したので、今度は食材を使ったときのIFTTT設定をもう1つ作成します。
手順はほぼ同じですが、発声したときのフレーズを「使うよ」に変更、Google シートのステータスを「購入」ではなく「使用」に変更しておきます。また、Google シートの名前やフォルダー設定も同じにしておかないと別のシートに記録されてしまうのでご注意を。
Google シートに記録されたデータを関数で集計
2つの設定が完了したら、あとはGoogle Homeへ話しかけるだけ。食材を冷蔵庫にしまう片手間に「買ったよ トマト 3個」とGoogle Homeに話しかけながら入れていき、使う時には冷蔵庫から取り出しながら「使うよ トマト 1個」と発声します。なお、1個の場合は「いっこ」ではなく「いちこ」と言わないとうまく認識されません。ひょっとしてこれ発声の中で「個」をつけないほうが使いやすいのかなとか思いつつ再度試すのは大変なので今回はこのまま突き進みます。
以下がGoogle シートに記録された例。ただこれだけだと在庫管理にはほど遠いので、関数を使って集計をしていきます。
まずは画面左下の「+」を押して新しいシートを作成。
一行目に「名前」「在庫数」、2行目に「トマト」を手動で入力。
B2のセルにはSUMIFS関数を使い、シート1の数を集計します。この場合「シート1にあるトマト(A2)の購入総数から使用総数を引く」という式になっていますが、この画面の通り作成している人はそのままコピペしてください。
=sumifs('シート1'!C:C,'シート1'!A:A,A2,'シート1'!B:B,"購入")-sumifs('シート1'!C:C,'シート1'!A:A,A2,'シート1'!B:B,"使用")
この式によってトマトの総数がカウントされました。やりましたね。
なお、この方法では食材の名前だけはどうしても手入力しなければいけませんが、同じ食材であれば一度設定してしまえば再度入力する必要はありません。
管理する食材を増やすときは、まずGoogle Homeに食材の名前を話しかけてシート1に記録された名前をA列にコピーし、B列は上のセルをコピーするだけ。「ほうれん草」「ほうれんそう」など複数表記がある食材はGoogle Homeの形式に合わせる必要があるので、まずはGoogle Homeに話しかけて入力された表記を使いましょう。
「いつ食材を買ったか」を簡易的に記録
ここまでの設定で在庫管理はできるようになりましたが、これだけだと食材をいつ買ったかまではわかりません。「在庫リストにトマトがあるけどいつ買ったトマトだっけな……」という事態に備え、さらに一手間かけて「食材をいつ頃買ったのか」を簡易的ながら記録してみます。
まずは購入日の記録ですが、前述の通りIFTTTの設定では年月日がテキストで入力されるため、関数で操作するにはやや扱いにくいため、今回はGoogle Apps Scriptを使って日付を取得します。今回は下記の記事を参考にシートへ日付を自動で入力するようにしました。
Google Home、IFTTT、Googleスプレッドシートを使って独自音声コマンドでログをとる(ついでにNode.jsやngrokやらも使ってLINEやGoogle Homeに通知する) – Qiita
https://qiita.com/miso_develop/items/be562d8a823ad2639d94
Google Apps Scriptを使うことに抵抗ある人もいるかもしれませんが、基本的にはコピペで進められるのでプログラム知識は一切不要です。まずはデータが記録されているGoogleシートを開き、「ツール」から「スクリプトエディタ」を選択。
次の画面で、上記で紹介した記事URLにある「Googleスプレッドシート」の項にあるコードをそのまま貼り付けます。ただし、このコードではセルの1列目に日付、2列目に時刻が入力される設定になっていますが、今回作成したGoogle シートでは1列目と2列目にすでにデータが入力されているので、該当の箇所で以下のように「4」「5」に数字を置き換え、画面上部のフロッピーディスクアイコンを押して保存します。
プロジェクト名を要求されるので好きな名前をつけましょう。
保存したらメニューの「編集」から「現在のプロジェクトのトリガー」を選択し、作成したGASをどのタイミングで動作させるかを設定します。
画面右下の「トリガーを追加」をクリック
イベントの種類を「変更時」にします。これでGoogle シートに新しいデータが記入されたことをトリガーとして、記入された日付や時刻が自動的に記録されるという仕組みです。その他の設定はデフォルトでいいはずですが、念のため下の画面と同じ設定になっているか確認しておいてください。エラー通知設定の頻度はお好みでどうぞ。
「保存」を押したらあとは表示される画面に従って進めていくだけ。まずは本人確認のため自分のGoogleアカウントでログインします。なお、先ほどrefriotと設定したはずの名前がここで変わっているのは単なる入力ミスなのでスルーして進めていきます。
物騒な画面が表われますが、あわてず「詳細」をクリック。
作成したトリガーへの移動を選択。
Google アカウントへのリクエストを許可して設定は完了。
これで以下の通り、D列に日付、E列に時刻が記録されるようになりました。時刻はさほど必要ではないのですが今後何かの役に立つかもしれないので記録しておきます。
日付のデータが取れたのでここからはまた関数の出番。シート2のC列でMAXIFS関数を使い、指定した条件の中で最も大きい数字(=新しい日付)を参照します。関数の記述は以下の通り。
=MAXIFS('シート1'!D:D,'シート1'!A:A,A2)
これで食材のうちもっとも新しい日付を取ることができました。
なお、この関数では購入日が異なる同じ食材が在庫として残っている時、新しい方の食材しか日付が表示されません。たとえば11月29日に買ったトマトが1個残っていて、さらに12月1日にトマトを3個購入した場合、日付としては12月1日が表示される、ということです。
簡易的、と表現したのはこのためで、ここを追求しようとするとシートがより複雑になって見にくくなってしまうことが予想されたことと、最新の日付が出るだけでも十分役に立つだろう、ということで今回は妥協しました。見やすさを維持しつつ異なる購入日を管理できるアイディアがありましたらぜひお寄せください。
まとめ
以前から我が家のキッチンではGoogle Homeが設置してあり、「調味料や常備している食材がなくなりそうになったらGoogle Homeに話しかけてTrelloに記録」という設定が結構便利に使えていたので、今回はさらに一歩進めて冷蔵庫内の管理まで手を伸ばしてみました。
食材を1種類ずつ登録するのは面倒に思えるかもしれませんが、買ってきた食材を冷蔵庫にしまうのと並行してながら作業で登録できるので実際はそこまで手間でもありません。また、Google Homeでは連続して質問できる「Continued Conversation」という機能を提供予定なので、これがリリースされれば「OK Google」を何度も言う必要もなくなり、より手軽に登録できるようになりそうです。
Google Home、ついに連続した質問時の「OK Google」が不要に
https://mobilelaby.com/blog-entry-google-home-update-2018.html
なお、Amazon EchoもIFTTT連携機能を備えていますが、Google Homeに比べてIFTTT連携の幅が狭く、今回のような設定はできません。IFTTTを活用したい人はGoogle Homeをお勧めします。
今回はGoogle Homeを使った即席管理ですが、食材を登録日ごと数量を管理し、賞味期限のデータベースなども加えて「そろそろ賞味期限がきれそう」という情報まで加味できたらさらに便利に使えそう。そんな食材管理に特化したIoT機器があったら個人的には便利だなと妄想しているのですが実際のところニーズがあるのかはわからず。この記事が好評で、まさかの1000ブックマーク超えることがあったら自社開発を真剣に考えてみたいとおもいます。