タワマンとWio LTE

毎年参加しているSORACOM Advent Calendarに今年も参加します。が…
アドベントカレンダーの予定を１週間勘違いしていて余裕ぶっこいていたら１日遅れなアカウントがこちらになります。
naoちゃん（中の人）に言われて昨日だったことに気づき慌てて書いています。すんまへん＞＜


はじめに
========
タワマン（タワーマンション）の悩み、よく聞くのは地上が遠いこと。
でもそれ自体は高速エレベータで中低層マンションと大差はなくなりました。
タワマンに住み始めて２５年、タワーからタワーにと引っ越して来ました。
現在も悩ましいのが郵便受け。部屋の前まで配達に来てくれないんですね。
今回はそんなネタです。

目的
========
宅配便はマンションのコンシェルジュが受け取ってくれるので帰宅時に通知されますが
レターパック等の郵便受けに届く荷物は到着を知ることが出来ません。

タワマンの郵便受けは建物の性質上その数が５００個などと非常に多いです。そのためか
入口からエレベータまでの導線にはなく郵便室に立ち寄らなければならない建物が多いです。
よって、空振りすると残念な気持ちになるのでこれを解消することを目的とします。
（休日引きこもっていて荷物が届いたらすぐに取りに行きたいという裏の目的も…）

要件
========
- 荷物が郵便受けに到着したら通知してほしい。
- 現在郵便受けに荷物が入っているか知りたい。

実装方法の検討
========

通信手段の検討
-------
郵便受けには電源がありません。電池稼動となるので低消費電力が最優先事項となります。
となれば当然この手のはLPWAですよね！
LoRaWANやSigfoxが理想です。自分もこれでやりたかった。
しかしです。地図上はLoRaWAN共有ゲートウェイやSigfoxの圏内でも建物の中は圏外なのです。
タワマンは内廊下（共用廊下が屋内で外に面していない）で、郵便室まで電波が届かないのです。
自前でLoRaWANやSigfoxの設備を置けば当然可能ですが、コスト見合いで却下です。

やはりセルラー網を使うしかないようです。
最近、LTE Use Equipment 1という低速ながら低消費電力の規格に準拠したデバイス
Wio LTEが登場したようなので今回はこれを試してみることにします。
（注：通信規格自体は昔から策定はされていた）

物理的実装の検討
-------
どうやって荷物の到着を検知するか。
ゴミ箱IoTや昨年のアドベントカレンダーで自分も使用した超音波距離センサが思いつきます。
郵便受けの底にセンサを設置すれば、荷物が入ると距離がほぼ０になるので通知できますね。
しかし、郵便受けには日常的にチラシなどが入れられ誤検知で実用にならないようです。

悩むこと１ヶ月ほど。
ＣＤやオークションからの荷物など大抵の到着を知りたい荷物は金属を少なからず含んでいます。
郵便受けの中に金属が存在したら通知すればよさそうです。
早速ぐぐる。。。
ラズパイやArduinoでセンサを使った記事は山ほど出てくるものの、金属検知する記事が全く無い。
千石電商さん・秋月電子さんなど著名なサイトを見ても金属近接センサは売っていません。
なるほど道理で誰もやらないわけです。

世の中には金属を検知するセンサが存在することは明らかですから業務用製品でこれを探します。
まぁ当然にあるのです。早速取り寄せます。
納期２～３週間と言われたので諦めアドベントカレンダーは別のネタにしようと考えていました。
そうしたらなんと急いでいただけ４日ほどで届いてしまったのです。
（初のお取引なのに無理な納期をお願いしてすみませんでしたありがとうございます）。

![MDS-12U-5.jpg](https://qiita-image-store.s3.amazonaws.com/0/96018/a1fb2fe4-8109-4f1f-73e5-964221e50572.jpeg)
<A HREF="https://www.sensatec.co.jp/products/detail.php?product_id=171" target=_blank>MDS-12U-5 (センサテック株式会社製)</A>

このセンサは電源電圧5VDCで動作します。
しかし、Wio LTEの各ポートは3.3VDC出力しかありません。
![wio.jpg](https://qiita-image-store.s3.amazonaws.com/0/96018/68487fb8-3986-ddf8-0e3d-8731347aa34c.jpeg)
これはMicroUSB端子裏面にあるランドから+5Vを得ることで解決出来ます。
もちろん外部から直接供給でも構いません。


Wio LTEとの接続
-------
Wio LTEはGroveというコネクタで、センサから出ているケーブルのコネクタとは異なります。
センサ側のはSMコネクタというようです。これを接続するためのケーブルは自作しました。
![sora1.jpg](https://qiita-image-store.s3.amazonaws.com/0/96018/e16124eb-d68e-a764-89ff-49ca026c0d10.jpeg)
こんなかんじ。
Grove側はデータピンが２本あるけどセンサ側は１本なので片方は結線無しです。

通信方式の検討
-------
荷物の到着を知るのは定期的にセンサの状況をサーバへ送出すればことたります。
リアルタイムの状況取得はリクエスト時にセンサの状況を取得できれば望ましいですね。

SORACOM GateでサーバのCGIから接続しに行くことを考えたもののラズパイとは異なり
Wio LTEにデーモンを構築することは（自分の技術では）できませんでした。
センサの状態送出を高頻度に送出することで解決することとします。

自分のサーバへデータが届くのが理想ですが、Arduinoでこれを作るのは難しそうです。
SORACOM Harvestが簡単そうなのでこれにデータを送ることにします。
SORACOM Harvestからはみんな大好きSORACOM CLIで簡単にデータを取り出せますし、
デバイスからデータを送るコードはサンプルがそのまま使えそうなのでこれに決定。

SORACOM Harvest 無料利用枠
-------
（アカウント作成から１年間）
SORACOM Harvestの無料利用枠は1日2000リクエストまでです。
これは43.2秒以上の間隔で送信しないと課金されてしまうことを意味します。
また無料利用枠が無い場合、1日5円の基本料金がかかりますのでご注意を。

データ通信量の見積
-------
（アカウント作成から１年間）
SORACOM Airの無料利用枠は月間150MBです。が、これはs1.minimumの場合。
今回はs1.minimumでも十分ですが、何らかの原因でs1.fastであった場合でも
無料利用枠で収まるように見積もると月間50MB程度になります。
これは1.6MB/日、66kB/時間、1.1kB/分。余裕ですね。
最も貴重なのは電池の持続時間ですし、SORACOM Harvestの無料利用枠内で
実装したいので１分毎に送信することにしました。

実機外観
-------
Wio LTEのケースが無いのでラズパイ用ケースに組み込みました。
左のケーブルで接続された先にある黒い四角い箱が金属近接センサです。
箱の上面に金属が近接すると検知します。
下方向は検知しませんから金属製郵便受けの底部に設置して使用できます。
![sora2.jpg](https://qiita-image-store.s3.amazonaws.com/0/96018/d8507883-0a2f-4c26-94f9-2e5796fe2b1e.jpeg)
完全にバラックですが、屋内用ですしよしとします。


制作開始
========

敷居が高い開発環境
-------
Wio LTE(Arduino)はラズパイのように装置へsshでログインしてゴリゴリ書いたり。
といった昔からのUNIX的な使い方ができません。
専用のソフトウェアをウィンドウズ端末などへ導入して、そこで作業する必要があります。
インフラ屋にはこれが辛く敷居が高い＞＜

エラーが出て動かず、何を聞けばよいのかもわからず、１日無駄な時間を過ごしました。
（結局自力解決には至らず、アルコールパワーで時間外のアプリ開発技術者を巻き込んで動くようにしてもらった）

センサとの接続
-------
今回使用するセンサは金属物検出処理までセンサ内部で行い、出力は検出か非検出かの２値として出力されます。
簡単そうですが、業務用ですからこれをWio LTEはもとよりラズパイですら接続したという記事は見当たらず。
どのように接続すればよいか悩みます。仕様書には「オープンコレクタ出力」と書かれています。

まずはWio LTEの基本っぽいD38（デジタルポート）での読み出しを試みます。
SORACOMさんの温湿度センサ用サンプルで試みるも digitalRead でデータを取得しているであろう場所で
止まってうんともすんともいわなくなります。どうやら使い方が違うようです。

他のサンプルを見ているとアナログ入力ポートもあるようです。
アナログで値を取得して自分で０と１の閾値を決めれば動作するはず（全ての電子機器の基本）。
A4ポートへ接続してまずは動作するかを確認します。

センサが非検知の時、500~650と揺らぎがあるものの取得できているようです。
金属を近づけ検知状態にすると、850~950と値がぐっと変化することが確認できました。
800以上を1、未満を0として処理すればよさそうです。
![soraH.jpg](https://qiita-image-store.s3.amazonaws.com/0/96018/2825ccc4-e943-ed14-1c36-7e3cb18c56d4.jpeg)
無事、SORACOM Harvestにデータが送信されました。

サーバ側の実装
-------
データ取得可能な状態になりましたから、あとはサーバでの処理だけ。
サーバ側に通知バッチとリアルタイム表示用のCGIを作るのみです。
みんな大好きSORACOM CLIを使うと簡単にデータを取得できます。

```bash:コマンド:
soracom subscribers get-data --imsi 444444444444444 --coverage-type jp --limit 1
```

```text:結果(例):
      [
              {
                      "content": "{\"payload\":\"eyJzZW5zZWQiOjB9\"}",
                      "contentType": "application/json",
                      "time": 1514288651645
              }
      ]
```

しかし、なんじゃこりゃ。読めない。
COBOLを最後にプログラムを卒業した自分はこんなの解読不能であります。
が、
０の時は "content": "{\"payload\":\"eyJzZW5zZWQiOjB9\"}",
１の時は "content": "{\"payload\":\"eyJzZW5zZWQiOjF9\"}",
という文字列が出力されることを確認しました
０か１か区別できればよいだけですから読めなくても気にしません。
perlは数字も文字も同じように扱える便利な言語。このまま固定文字列として処理します。

- 荷物到着通知バッチ

perlスクリプトで簡単に作りました。
SORACOM CLIで値を取得し、値が変化したらメールする無限ループするだけ。
これをサーバ上で動かしっぱなしにします。

- 現在状況確認アプリ

サーバのapache httpd上で動作するperl CGIで作りました。
SORACOM CLIで値を取得し、値に応じて「荷物あり」「荷物なし」と日本語で結果を出力します。

サニタイジングなど行っておらず攻撃可能な状態のためコードの公開はご容赦。


完成
========

実際に郵便受けに設置してみました。
![sora3.jpg](https://qiita-image-store.s3.amazonaws.com/0/96018/cd5ae1ca-0bac-2008-c2ad-be64b7ebebe5.jpeg)

問題無く動作したものの、家族から邪魔だと苦情が入りました。
本運用にはスリム化が必要なようです＞＜

オチ
========

そうはうまくいかないのがこの世界。必ずオチがある。
帰り道、何か届いているか状況確認すると反応が無い！！
急ぎ確認しに郵便受けへ向かうと、なんとまぁ。

電池切れでした。Wio LTEは意外と電力を消費するようです。
そういえば滑りのヤマンが言っていたっけ。
　「そういうのはもうしばらく待ってくれ」
と。
LTE Cat.1自体は低消費電力ですが、Wio LTEの消費電力が大きいようです。


結論
========

目的であった動作は全て実装を完了しました。
しかし消費電力の問題により実用には至らなかったのでした。
ヤマンの言葉を信じて新しいデバイスが出るまでお蔵入りです。


その後の検証
========
MAX（中の人）と話していて、電力問題解決に２つの方法を考えこれを検証しました。

LTEモデムをデータ送信の時だけONにする
------
サンプルコードはLTE接続しっぱなしなので常にかなりの電力を消費しています。
これを通信の都度LTEモデムの電源をいれ通信する実装に変更します。
具体的には起動時に呼び出している

```
Wio.PowerSupplyLTE(true);
Wio.TurnOnOrReset();
```
を起動時には実行せず、データ送信前に都度実行するようにします。
そして送信終了後に通信を切断します。
ところがWio LTEには通信を切断するコマンドがありません。仕方ないので

```
Wio.PowerSupplyLTE(false);
```
で電源供給を断ち（タイムアウトにより）強制切断するしかないようです。
このため１分ごとに行うのは難しく５分ごとの送信として検証しました。

| 実装方式 | 74Wh電池での稼働時間 |
|:-----------|:------------:|
| 常時LTEON | 19時間20分 |
| 通信の都度LTEON | 24時間30分 |

LTEモデムの電力消費が減ったのでしょう、確かに稼働時間が延びました。
しかし毎日電池交換するわけにはいきませんから実用には遠いようです。


センサの検知をトリガーに送信する
------
公式サイトで取り上げていただきサンプルコードまでご提示いただきました(<A HREF="http://www.seeed.co.jp/blog/wio-lte-with-int/" target=_blank>Wio LTEを省電力に使おう</A>)。
ありがとうございます。参考にさせていただき試行錯誤してみました。

```
attachInterrupt();
```
はデジタルI/Oの変化をトリガーとして動作するようでアナログ入力ではこれが機能せず。
A4ポートでアナログ入力として信号処理をしている現在の実装では難しいようです。
これは仕様なので仕方有りません。

　
======
最後までお読みいただきましてありがとうございました。

###### 2017/12/27 Rev.2 無料利用枠について追記、サービス名・商号の誤字・文言を修正)
###### (2017/12/27 Rev.3 今後の予定について追記)
###### (2018/01/08 Rev.4 センサの詳細とその後の検証結果について追記）
}