ラズベリーパイ使って宅配便の再配達を撲滅した話(総集編)
概要
外出時でも荷物を受け取れるように、ラズベリーパイを使って受取までのプロセスをほぼ自動化した話。
我が家がオートロックマンションのため、共同玄関をどうセキュアに開けるかがキモ。
背景
私は宅配便の受取が苦手である。
時間指定できるならまだマシだが、指定したその2~3時間どのタイミングで来るかもわからず、待っていなければならないのは苦痛である。
以前はコンビニ受け取りもしていたが、やはり段ボールを抱えて家まで帰るのは面倒である。(我が家は3件隣がコンビニだがそれでも面倒は面倒)
時間指定ができない宅配便などは、もう諦めて一度不在票入れてもらってその上で時間指定で受け取っていた。配達員の方々には申し訳ないがそうせざるを得ない。
日本の宅配便の約6件に1件が再配達
一人暮らし、共働きが多い現在、再配達率は相当多いのでは?と思い調べてみたところ、国土交通省の発表では平成31年度4月の段階で16%、都市部に限れば18%に上るそうである。
5~6回に1回が再配達ということになる。正直もっと多いと思っていた。
配達業界もこれは問題と思っているのだろう、最近はAmazonなどで置き配も始まっている。
我が家はオートロックマンション
置き配はセキュリティ上不安な面も残るが、再配達問題の解決の一歩にはなるだろう。私も是非利用してみたい。だが、我が家はオートロックマンションのため、インターホンで「解錠」ボタンを押さないと共同玄関が開かない。共同玄関が開かないことには配達員は玄関にたどり着くことができない。これでは置き配してもらうこともできない。
そこで、ラズベリーパイを使ってインターホンを監視、共同玄関を解錠したりユーザに配達を通知するシステムを作ってみた。
インターホン監視システム概要
今回構築したシステムの概要は以下の通りである。あらかじめ配達がわかっている場合と、予定外の配達の場合で動き方が分かれる。
まずは予定された配達の場合。
時間指定便など、あらかじめ配達時間がわかっている場合は、事前にGoogle Calendarに配達予定を登録しておく。ラズベリーパイは配達予定を取得し、その時間帯にインターホンが鳴ったら共同玄関を開け、配達員を中に入れる。ラズベリーパイは同時にユーザへ配達の旨をプッシュ通知する。
(2020年1月27日 19時50分追記)
「指定時間帯は誰でも入れてしまうセキュリティホールになる」とのコメントが多くありましたので,このモードは廃止しました.
次が予定外の配達の場合。
時間指定ができなかったものなど、事前にいつ届くかわからなかいものの場合、ラズベリーパイはインターホンを検知するとその通知とインターホンのモニタ画面をスマホへプッシュする。ユーザはモニタ画面を見て配達員と判断したら、ラズベリーパイに解錠コマンドを送る。今回、Flaskでラズパイ上にサーバを立て、そこにコマンドを送ることにした。
オートロックマンションの共同玄関はセキュリティのためにあるため、来る者拒まずすべて通していたらオートロックの意味はなくなってしまう。そのため、「事前にわかっている配達」か、「ユーザが判断して許可した配達」のみ、通すようにした。
なお、部屋の玄関までたどり着いたら、簡易宅配ボックスであるOKIPPAを使って受け取る。
ラズパイでインターホン音検知
このシステムのトリガは全てインターホン音である。なにはともあれ、ラズパイでインターホン音を検知する。
家に転がっていたウェブカメラのLogicool C270をラズパイに接続し、インターホンが押されたときの「ピロピロピロ・・・」という音を検知している。具体的には、音声データを常に取得、FFTで最大音量の周波数を取得し、インターホン音と一致するかを判定する、というもの。詳細は以下の記事を参照。なお、プログラミング言語にはPythonを使っている。
インターホンの音を検知したら、同時にユーザのスマホでプッシュ通知を送っている。プッシュ通知にはPushbulletを使った。PushbulletはPython APIも用意されており、アカウントを作れば簡単にラズパイ→スマホへのプッシュ通知を実装できる。
ラズパイで解錠ボタンを押す
インターホン音が検知できたら、次にサーボモータで解錠ボタンを押せるようにしてみる。サーボモータにはマイクロサーボSG92Rを使った。秋月電子にも売っている。pigpioを使い、pythonで動かしている。サーボモータはインターホンに強力両面テープで貼り付けた。解錠ボタンをちょうどよく押せる角度を調整するのがキモである。
ここの詳細は以下の記事を参照。
ここまでできると、こういうことができるようになる。
ラズパイ+ウェブカメラでインターホン検知→サーボモータで解錠。あまりに反応が早いと怪しいので少し間を空けて。 pic.twitter.com/BGr4zJplWk
— 水田かなめ (@kmizta) 2019年12月31日
ラズパイでGoogle Calendarから配達予定を取得する
次に、Google Calendarから配達予定を取得してみる。なお、予定自体はあらかじめユーザがスマホで設定する。 PythonからGoogle Calendar APIを使う手順はQuickstartが整備されているので、それに従って設定していけば良い。
今回のシステムでは、CRONで1時間に1回Google Calendarを読みに行って新しい配達予定がないかを確認している。
読み取った予定をもとに「予定された配達」か「予定外の配達」かを識別している。
ここの詳細は以下の記事を参照。
ここまでくれば、一応「予定された配達」は自動で受け取れることができるようになる。
ラズパイ+ウェブカメラでインターホンのモニタを抽出、通知する
もし、予定外の配達だった場合、ユーザへインターホンのモニタ画像を通知する必要がある。今回は、OpenCVを使った。ただモニタを撮影してプッシュするとモニタ以外の無駄な領域が多いため、輝度値からモニタ部分のみを検出し、射影変換して向きを補正した上でPushbulletを使ってユーザへ通知している。
ここの詳細は以下の記事を参照。
外出先からラズパイに接続されたサーボモータを操作する
さて、ここまで来たら、ユーザは通知されたモニタ画像を見て配達か否かを判断できる。もしこれが予定外の配達であると判断した場合は、ラズパイに解錠コマンドを送って共同玄関を開ける必要がある。しかし、ただコマンドを送るだけではない、「即座に判断し、即座に解錠コマンドを送る」必要がある。なぜならば、配達員はインターホンを鳴らして十数秒もすれば不在票を入れて帰ってしまうからである。
リモートでラズパイを操作するので有名なのはWebIOPiだが、これは基本GUIによる操作を前提としており、操作に時間がかかってしまう。今回のような用途には不向きである。
そこで、今回のシステムではFlaskを使ってラズパイにサーバを立ち上げ、そこにコマンドを送ることにした。
また、家のルータにポートマッピング設定を行い、Flaskで使うポートへのコマンドをラズパイに転送することで、外出先からのラズパイ操作を実現した。
ここまで来ると、スマホへの通知画面は以下のようになる。モニタ画像とともにプッシュされたURLを1タップすれば、サーボモータが動作、解錠ボタンが押され共同玄関が開く。
(2020年2月2日 追記) まとめのところにも同じ内容を追記しているが、解錠コマンドはインターホンが鳴った時のみ反応すれば良いため、インターホンを検知してから30秒間のみ、応答するようにしている。四六時中コマンドで開けられるわけではない。そもそもインターホンが鳴ってないときに解錠ボタンを押しても共同玄関は開かない。
ここの詳細は以下の記事を参照。
まとめ
ようやく、ここまででラズパイを使った再配達撲滅システムが完成した。
再配達撲滅システム(オートロックマンション用)、完成した。 pic.twitter.com/vLucri4NpH
— 水田かなめ (@kmizta) January 26, 2020
完成以来、再配達を依頼することはなくなった。ハッピーハッピー。
(2020年1月27日 19時50分追記)
普段2,3人/日しか来ないブログのPV数がえげつないことになっていてビックリ・・・
上にも追記しましたが,「指定した時間帯は誰でも入れるセキュリティホールとなる」といったコメントが多くありましたので,このモードは廃止しました.
こうするとインターホンが鳴るとスマホに通知が飛び,その場でインターホンモニタを見てスマホから中央玄関を開けることもできるシステムになります.
なお,「解錠コマンド」はインターホンが鳴ってから30秒程度しかコマンドに応答しないようになっており,普段はコマンドを送ったところで何もしません.念の為.
(2020年2月9日 14時05分追記)
このシステムに対してアクセス制御を実装し、セキュリティ対策とした。 以下の記事参照。