クックパッドマートを支えるIoT技術

今井晨介 氏(以下、今井):「クックパッドマートを支えるIoT技術」というところで、今井がお話させていただきます。

経歴です。大学生時代は電気工学を習っていたんですが「これからの時代はソフトウェアだ!」と思い、大学院からはソフトウェアを学び始めました。クックパッドに入ってサーバサイドエンジニアとして働き始め、ちょうど2年と半年ぐらいが経ちました。

一番初めは「cookpad storeTV」という、料理動画をスーパーで流すサービスを作っていまして、今は1万台くらいのサイネージをスーパーにばらまいています。去年の終わり頃から、クックパッドマートに参画しています。サーバサイドエンジニアとして入社したのですが、なぜかハードウェアに関わる仕事が多いので「大学時代に電子工学の勉強をしていてよかったな」と思う日々です。

今日お話することは3つあります。

「クックパッドはハードウェアもやっているよ!」という話と、クックパッドマートの話と、クックパッドマートを支えるIoT技術の話をさせていただきます。

クックパッドはWebの会社と思われがちなんですが、実はそうではありません。僕たちは「毎日の料理を楽しみにする」というところをひたすら追及していきたいと考えています。最近のクックパッドは毎日の料理を楽しみにするために、Webの世界だけにとどまらず、物理世界にも飛び出していっています。

例えば今日お話する物流を作っていくクックパッドマートであったり、先ほどお話した「cookpad storeTV」であったりとか、Alexaに呼びかけるとレシピが返ってくるサービスであったりとか、「OiCy」というクックパッドのレシピを調理器具に転送するようなサービスであったりとか、食育を目的とした「おりょうりえほん」というサービスがあって、実際に絵本をサブスクリプションで配送するということをやっていたり、いろいろな取り組みをしています。

最近、クックパッドに工作環境ができました。

社内にレーザーカッターや3Dプリンター、ドリルがあって、いろんな物が作れる環境があります。実際にクックパッドマートのハードウェアもここで生産していて、3Dプリンターでプリントしたり箱に穴あけをしたりといったことをやっています。

ですがクックパッドにはハードウェアエンジニアがぜんぜんいなくて「ハードウェアをやってます!」と言っていますが、クックパッドマートにはハードウェアエンジニアが1人もいません。

今日はプロトタイプから大量生産で面倒を見れる救世主を探していまして、今日お話を聞いて「我こそは」と思われた方はあそこにテックリードの勝間さんがいるので声をかけてみてください。

クックパッドマートとは?

本題に戻ってクックパッドマートの話をしていきたいと思います。クックパッドマートを知っている人?

(会場挙手)

今井:けっこういてビックリしちゃいました。ありがとうございます。

クックパッドマートは生鮮eコマースのプラットフォームサービスです。今はAndroidとiOSの両方の端末で利用できるようになっています。

こだわりの食材を当日出荷して当日にお届けすることをやっていまして、新鮮な朝獲り野菜や新鮮なお魚を食べられるサービスになっています。

受け取り場所は自宅ではなくて、会社の近くの受け取り場所のところまで運んでいくかたちのサービスになっています。ドラッグストアやリカーストア、カラオケ店、幼稚園・保育園といったところですね。家で配達を待つ必要がないので仕事の帰り道に受け取ることができるサービスになっています。

このように個配の配送を行わないようにしているので、配送料を抑えて購入金額の制限を設けずにサービスを行っています。

クックパッドマートはユーザに対して直接商品を販売しているわけではなくて、販売者とユーザをつなぐeコマースからeコマースのプラットフォームとして意味を置くものです。物流に関してはわりと独自で作り上げていっているところでして、これがサービスの大きな特徴になっています。

一番大きな特徴は、配送センターを持たない構造になっています。販売者の拠点を回って配送先をいくつか回るというようなミルクランのような配送形式を持っています。この配送を実現することで即日で低コストで商品の配送を行えるようになります。即日行えるからこそ朝に市場に上がってくる魚や朝獲れ野菜といった新鮮な食材をユーザに届けることができるサービスになっております。

ですが、配送センターを持たずに多くの商品を流通させるのはすごく難しくて多くの壁があります。今日はこの流通の難しさを、ハードウェアやIoTの技術で解決していくところの話をさせていただきます。

クックパッドマートを支えるIoT技術

今、クックパッドマートで稼働しているIoTのデバイスは2つあります。

ラベルプリンターと冷蔵庫の錠です。まずラベルプリンターからお話をさせていただきます。先ほども話したようにクックパッドマートは物流センターを持っていません。商品を一括で準備を行う場所がないので、流通センターが行っているような業務はすべて販売者の方にやってもらわなければいけません。

運搬する場合もあれば、商品を受け取り場所まで届けてもらってユーザに商品を受け取ってもらう必要があります。

クックパッドマートでは、商品を正確にどこからどこまで送るということを実現するために、販売者の方に販売する商品にラベルを毎日付けてもらっています。このラベルを付けて準備した商品をドライバーに渡して、ドライバーはそのラベルを頼りに受け取り場所まで運ぶかたちになっています。

ユーザはそのラベルを見て、その商品を受け取るかたちになっています。なので、ラベルが印字されないと流通が完全に破綻してしまうことになるので、毎日ちゃんとラベルを印刷するところがすごく重要な話になります。

ラベルを貼ってもらうんですけど、販売者の環境ってすごい混沌としてるんですよね。誰もクックパッドマートのためだけに働いてくれているわけではなくて、ふだんは販売業務をしています。もちろん有線た無線といったネットワーク環境が整っていないところが多いです。こういった環境でもちゃんと動作して、誰でも扱えるようなプロダクトを作る必要があります。

なので僕たちは、電源はプラグをさせばネットワークにつながって毎日自動的にラベルが印刷されるようなシステムを構築しました。

ラベルプリンターが現在の現在の状態に至るまで

デモをしたいと思います。今、管理画面からラベルの印刷を行ったんですけど、会場にあるラベルプリンターからラベルが出るはずです。出るはずです。

(会場笑)

今、ラベルを発行する命令を投げてバッチが立ち上がって出てきましたね。こういった感じで毎日商品のラベルが印刷されるようなかたちになっています。

この状態にたどり着くまで、何度かアップデートを繰り返していきました。

これは最初にプロトタイプしたiPadと、どこかのラベルプリンターなんですけど、これだと毎日トラブルが発生するような状態でした。そこで初号機の安定性を重視したものを作ろうということで、いろいろな機材の選定を行い、十分に安定性を高めることができました。

2号機ではコストダウンを計って、3号機ではネットワークの安定性を向上しています。このように問題が発生するごとにアップデートを繰り返していきました。10ヶ月で4回ぐらいのアップデートを行ったのですが、そのサイクルを早く回して改善を進めていくということに取り組んでいます。今、2号機が一番展開している端末なので、今回は2号機の構成を紹介できればなと思います。

クックパッドマートのラベルプリンターの仕組み

ラベルプリンターですね。スター精密さんのTSP700シリーズを採用していて、だいぶ壊れない丈夫なものになっています。今日はメーカーさんが来られているんですが(笑)。

(会場笑)

そういった感じでメーカーさんともお話をしながら「どういったものがいいですかね?」みたいな感じで進めています。あとはLTE通信を行うためにHuaweiのLTEドングルを利用していて、エッジデバイスにはRaspberry Piを使っています。このRaspberry Piはルータとしての機能がメインなんですが、LTEから入ってきたリクエストをプリンターへフォワーディングしています。あとはSSHサーバも動かしているので、不具合発生時は遠隔で操作を行ったり、調査をしたりといったことができるようになっています。

ネットワークにはSORACOMのネットワークを採用しています。SORACOMが提供するサービスはIoTで運用をしていく上で便利なものが揃っているので重宝しています。これが具体的なネットワークの構成図です。

ユーザからの注文がクックパッドマートのサーバにきて受け付けて、その日の注文が締まったタイミングで印刷の命令をプリンターに投げます。

真ん中にあるShepherdという層がSORACOMのVPCのプロキシを行っている層になるんですが、印刷の命令をShepherdのホスト側に投げると、直接ラベルプリンターまでフォワーディングされて印刷できる仕組みになっています。直接POSのコードをたたくとなぜかプリンターが動く、おもしろい設計になっています。

この図はスター精密さんのサイトから引っ張ってきたプリンターの命令の手続なんですが、TCPのソケットプログラミングでコントロールできるようなものになっています。実際毎回何度も信号化をするのでここら辺が印刷データの生成とかハンドリングをラップするライブラリを書いてたりしています。

start_ethernetというライブラリで、このラベルプリンターでできることをほぼ網羅している感じです。クックパッドはRubyをよく使用するので、今回特別な理由がなかったのでRubyで操作できるような配分になっています。通信まわりのハンドリングや状態取得を行うのですが、あとはプリンターの操作のコマンドですね。けっこういっぱいあるんですけど、ドキュメントを1枚ずつ読んでいって、2、300ぐらいのコマンドをすべて写経するという感じですね。

これが実際のコマンドの例なんですけど「文字サイズを6倍に大きくする」ですね。

こういったコマンドを300個ぐらい16進数で写経してメソッド化してみたいなことをしていました。けっこう苦行です。

こうして構築したラベルプリンターを各販売店にこういったかたちで設置していきます。

これは確か豆腐屋さんだったと思いますが、ここでマッチしてラベルが印刷されている状態ですね。このラベルプリンター自体は安定期に入っていて、今後も大きなアップデートはそれほどないのかなと思いますが、今後はQRコードも付けて、より物流の正確性を上げていくといったことをやっていきたいと考えています。

冷蔵庫錠に求められる要件

次に冷蔵庫の錠について話したいと思います。

この錠は比較的最近開発を始めたものなので、まだすべての受け取り場所には設置されていませんが、社内といくつかの場所でテストの拡張を行っています。家まで配送しないというクックパッドマートの配送システムの特性上、届ける商品をパブリックな場所で保管するときに、やっぱり商品の安全性、セキュアな状態を保たなければいけないところがあります。

特定の人しかアクセスできないような状態を作りたい。あとはネットワークが不安定なときでもちゃんと扉が開いたり、コンセントが抜かれても扉が開かないようにしたり、冷蔵庫がちゃんと冷えた状態なのかを監視したり。受け取り場所に冷蔵庫を複数置くこともあるので、複数の扉をコントロールしたりといったことがやりたいので、開発をしてきました。

まず、QRコードの解除システムなんですが、特定のユーザやドライバーが特定の時間のみ扉を開けられるようにしたい。なのでQRコードに開閉可能な時間帯であったりとか、開閉可能な冷蔵庫の情報を読み込んでその情報について署名を行っています。冷蔵庫はオフライン状態でもこの署名を検証できるといったような仕組みにしています。

実際にデモをしてみたいと思います。今日は梨を2つ入れてるんですけど、ここにQRコードリーダーが付いてます。ここにかざしてあげると鍵が開いて扉が開くという感じですね。

それでここから梨を取って持って帰るという感じですね。これは閉まると錠が掛かって開かない状態になります。

これは実際にどうなっているのかというところで裏側の仕組みの説明です。

ユーザ側には冷蔵庫の扉を開けるJWTトークンをサーバ側が発行しています。アプリ側でこれをQRコード化して冷蔵庫に設置しているQRリーダーに読み込ませる感じです。冷蔵庫側は事前に公開鍵をサーバ側から取得しておきます。QRコードで読み取ったトークンを公開鍵で検証して冷蔵庫を開けるか開けないかの判断を行います。

ここが一番特徴的なところなんですが、事前に公開鍵を渡しているので、たとえネットワークが断絶されていたとしても、鍵は本来の稼働をします。

ハードウェアの仕組み

次に、ハードウェアの部分です。これは冷蔵庫の上に付いているものになります。

会場にも実物があるので見ていただければと思いますが、この左側のところでOMRONの電磁ロックを採用しています。FA用の部品を採用していて、工作機械の部屋に入れるか入れないかを制限するような用途で使われています。

これがけっこう便利で、解錠しているかしていないかの状態や開閉の状態も見れるようになります。24ボルトを掛けてやるとロックが解除されるかたちになっているので、電源を抜かれて0ボルトになった場合もずっとロックが掛かっている状態なのでセキュアです。あとは温度計も付いていて、例えば冷蔵庫が壊れたみたいな故障になったときに検知できるような仕組みを作っています。

この子機から親機に対してイーサネットケーブルを伸ばしています。24ボルトに入られるPoEのイーサケーブルを使っていて、ケーブルのアサインはイーサネットのそれとはぜんぜん違っていて、おそらく制御ケーブルとして利用しています。汎用的なコネクタやケーブルを使うと安いので、そういったものを模索しています。なので、それをPCに刺すとPCが壊れるので気を付けてください。

これは親機です。親機には子機をつなげることができます。1つのQRリーダーで4つの扉を操作できるようになっていますね。ちょっと写真が見にくいんですが、下側の基盤のここにRaspberry Piがあります。その上に特注した基盤が乗っているという感じですね。それぞれの操作に必要な電圧というのが24ボルトなんですけど、Raspberry PiのGPIOを動かせる電圧が3.3ボルトなんです。

3.3ボルトで24ボルトをスイッチさせるためにMOSFETが4つ乗っています。電源はその24ボルトとRaspberry Piの動作に5ボルトが必要なので2チャンネルを集約できる電源が乗っている感じです。QRリーダーはHoneywellのものを採用していてUSBで接続します。

LTEモジュールは電波が悪いところでもつながるように多くのアンテナに対応できるようにしたいところがあったので、EC21-JというタイプのMini PCIeで刺さるモジュールを採用しています。これをUSBに変換してRaspberry Piにつなぐということを行っています。電波の悪いときには強度の良いアンテナを採用するということができるようになっています。

これはまだそこまで安定した状態ではないので、他にもどんどんやらなければいけないことがあります。例えば扉だけでなく、中に入っている箱自体の施錠であったり、監視カメラを設置したり、そもそもこの冷蔵庫を隠したいということがあったり、今は1個ずつ取って行かなければいけないので、もっと受け取り体験を向上したいと考えています。あとは常温ボックスでパンをボックスに入れたり、安定性を高めていくところが今後の課題かなという感じです。

Raspberry Piは便利だが……

ここからは余談です。いろいろやっていて思うのが「ネットにつながる手ごろなIoT端末って本当にないな」と最近思っていて、Raspberry Piはすごい便利で安くて情報がすごいいっぱいあるしGPIOもあるし、いろんなものも刺さる。ただUSBまわりの電力供給、電流が足りないとか、さっきも言ったLTEモジュールが乗せにくいということもあったりするので、そこの複雑性というのを問題だなと感じています。

最近考えているのが、コンピュートモジュールとSIMと、Mini PCIeの通信モジュールが良い感じに乗るような基盤を作ってUSBとかGPIOとかHDMIとかが伸びてACアダプタを刺して動くようなものを作りたいなと思っています。

完全に余談でした。

まとめです。クックパッドはウェブの会社ではなくて、「毎日の料理を楽しみにする」会社です。ハードウェアエンジニアがいないので、すごく求めています。何かあったら勝間さんまで。

ありがとうございました。

(会場拍手)