「お金を払わないと電気が使えないコンセント」を作ってみた

この記事は[IoTLT Advent Calendar 2018(neo)](https://qiita.com/advent-calendar/2018/iotlt_neo)の5日目の記事です。昨日の記事は[CO2センサー、空気品質センサーの測定値を比較する](https://qiita.com/AmbientData/items/9daeab2a1409528a8df5)でした。Ambientまだ使ったことないのですが、ずっと興味あるのでそろそろ試したいです。


「お金を払わないと電気が使えないコンセント」というのを作ってみたので紹介したいと思います。


## これはなにか

サーバに繋がるコンセントです。このコンセントに家電やスマホ、PCを差し込んでも電気は付きません。しかし、ネット経由で決済を行うことで電気が流れるようになっています。

紹介動画はこちら↓
[![動画](http://img.youtube.com/vi/2wozF1KAtHw/0.jpg)](https://youtu.be/2wozF1KAtHw)

たとえば、カフェやレストラン、コワーキングスペースなどで電源利用に対して課金することを想定しています。[ニューヨーク・タイムズの記事](https://toyokeizai.net/articles/-/212441)によると、アメリカでは在宅ワーカー・ノマドワーカーによるカフェの席の専有が問題になっているとのこと。これに対応するため、カフェ側は無料Wi-Fiを撤去したり電源を隠したりという"工夫"をしているそうです。もしこういう場面で電気利用に課金ができれば問題が緩和しないかなと思ったりしました。

また、今後シェアリングエコノミーが進むあたり「コインランドリーマシンは持ってないけど洗濯機は持っている人」がこのコンセントを使えば、簡単に課金機能付きの設備を作れるかもなーとか妄想しています。

## なぜ作ったのか

僕も外出先で電源借りたいことあるんですが、知らない店員さんに「使っていいですか？」とか聞いて断られるのが怖くて(笑)なかなか電源かりられないんです。なので、対面じゃなく確実にお金を払って使える仕組みがあると良いのでは、と思って作り始めました。

もともとはblockchainでの実装を試していたのですが、blockchainのウォレットが一般化するのはまだ先になりそうな気がして、現在はLINE Payでの支払いを採用しています。

参考:
[blockchain上で自動支払を行うスマートコンセントを作ってみる](https://qiita.com/kopanitsa/items/b873b269d0bf3f530b3b)
[ESP32を使ってEthereumのSmart Contractを操作する](https://qiita.com/kopanitsa/items/ffcbceec9915f4d7a628)

## どのように動くのか

利用シーンやUIは[動画](https://youtu.be/2wozF1KAtHw)を御覧ください。スマホでQRコードを読み、LINEのチャットボットに「使いたい」ということで支払いを行い、電気の供給を行います。

全体の構成は以下のようになっています。
<img width="972" alt="構成.png" src="https://qiita-image-store.s3.amazonaws.com/0/42108/756f85c2-d915-8260-3758-0a9117414267.png">

サーバで

- ユーザとコンセントの管理
- LINE APIを使ったチャットボットとペイメントの管理
- MQTTを使ったコンセントへの指示

をおこない、コンセント側は指示を受けてリレーを操作します。

## コンセントの制御について

コンセントはMCUとしてESP8266を使い、Wi−Fiの接続、MQTT通信、リレーの制御を行っています。
Wi-Fiの接続とリレーの制御(Digital Out)はサンプルそのままという感じです。
MQTTは[knolleary氏のPubSubClient](https://pubsubclient.knolleary.net/)を使用しています。マジ便利。githubのサンプル通りですが以下のような感じでMQTT subscriptionができます。

```C
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient); // MQTTクライアントを生成

...
client.setServer(MQTT_SERVER, MQTT_PORT); // 接続
client.setCallback(callback); // subscriptionコールバック設定

...
void callback(char* topic, byte* payload, unsigned int length) {
    // メッセージに従って電源ONやOFFなどの制御を行う
}

```

今後の課題としては、

- 生MQTTなのでちゃんとmbed-TLSを使ってMQTTS化する
- 一般向けに作ろうと思うと信頼性試験・品質管理をしたりPSEを取得したりと考えなければならないことがたくさん。リモートファームウェアアップデートなども。
- 消費電力が測れるとおもしろいかも

という感じです。

## サーバサイドについて

サーバは

- LINEチャットボットの制御(messaging API経由)
- LINEペイメントの制御(payment API経由)
- MQTTの制御
- ユーザ管理、コンセント管理

といった機能があります。LINEチャットボットやユーザ管理は優れた記事が沢山あるからいいとして、

LINEのpaymentはまた、[公式技術ドキュメント](https://pay.line.me/jp/developers/documentation/download/tech?locale=ja_JP)が丁寧に書かれていて参考になりました。
実装にはLINEさんが提供している[line-pay npmモジュール](https://www.npmjs.com/package/line-pay)を使いました。マジ便利。
[LINE Payを使ってみよう](https://qiita.com/4geru/items/42f1bf2666bdbad9fbe7)という記事にサンプルが記載されています(基本これ読めばOKな気がする)。`reserve`と`confirm`という2つの機能があり、流れとしては

1. ユーザとチャットボットが会話(LINE messaging APIを使用)
2. ユーザが何らかのアクションをした(購入したいボタンを押した、など)メッセージのpostbackを受け取って`reserve`をコールして課金処理へ遷移
3. ユーザがLINE Payプラットフォーム上で課金処理を実施
4. 課金処理完了後`confirm`が呼び出されるので、ここで完了メッセージを表示

という感じです。
なお、事前にLine Payの事業者登録・開発者登録が必要となります。このコンセントは事業化していないので開発者用のSandboxを使って機能を試しています。

MQTT周りはブローカとして[mosca](https://github.com/mcollina/mosca)を、クライアントとして[MQTT.js](https://www.npmjs.com/package/mqtt)を使いました。マジ便利！

今後の課題としては、

- botまわりで大量にコールされた場合のキューイングなど
- コンセントをおいてくれているお店用のダッシュボード・CMS的なものも必要だよね
- お店にお金を支払う仕組みってどうしたらいいの?
- コンセントの死活管理や異常状態検知などができるように
- コンセント利用ログ貯められるといいけど、貯めていいんだっけ

という感じで盛りだくさんです。

## まとめ

僕がやらなくても誰かやりそうな課題ですが、電気の制御が支払いとつながると結構いろんな面白い事が起こると思っています。たとえば、電動モビリティとか増える気もしますが、気軽に人の家の前で充電できたりとか。
妄想してプロトタイプしてたら、ありがたいことに[GUGEN](https://gugen.jp/)優秀賞と[MashupAwards](https://ma2018.we-are-ma.jp/) CivicTechヒーロー賞もいただきました。今後もがんばりたい...!