LINE Things と LINE BOT をイイ感じで連携するには

# LINE Things とは

LINE アプリ内で Bluetooth LE 対応機器を操作して、ネイティブアプリ開発なしに BLE 対応製品をスマホから扱うことができる IoT プラットフォームです。
LINE Things Developer Trial を使って、無料でお試しできます。

詳しくは、以下の記事を見てください。

 - [LINE Things 関連情報まとめ](https://qiita.com/stachibana/items/0cb88015221c3df58d9b)
 - [LINE Things Developer Trial ハンズオン](https://qiita.com/hktechno/items/bb83cc898c75819b2664)
 - [LINE Things 自動通信機能 ハンズオン](https://qiita.com/hktechno/items/12781e38b09e10c20da2)

LINE Things をうまく使うと、以下のような LINE Pay 決済を組み合わせたドリンクバーなども作ることができます。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">LINE Things + LINE Pay 連携 ドリンクバーも展示してます！すごいよくできてる！ (<a href="https://twitter.com/sumihiro3?ref_src=twsrc%5Etfw">@sumihiro3</a> さん提供) <a href="https://twitter.com/hashtag/%E3%83%A1%E3%82%A4%E3%82%AB%E3%83%BC%E3%82%BA%E3%83%90%E3%82%B6%E3%83%BC%E3%83%AB%E5%A4%A7%E9%98%AA?src=hash&amp;ref_src=twsrc%5Etfw">#メイカーズバザール大阪</a> <a href="https://twitter.com/hashtag/linethings?src=hash&amp;ref_src=twsrc%5Etfw">#linethings</a> <a href="https://t.co/egggU7KVs0">pic.twitter.com/egggU7KVs0</a></p>&mdash; Hirotaka Kawata (@hktechno) <a href="https://twitter.com/hktechno/status/1152777478147981312?ref_src=twsrc%5Etfw">July 21, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

## LINE Things Mini Award 開催中！

[LINE Things Mini Award開催のお知らせ！ - LINE Developers](https://engineering.linecorp.com/ja/blog/line-things-mini-award-2019/)

2019/9/24 まで開発期間がありますので、まだこれから開発を始めても十分間に合います！
そこで、LINE Things を上手に使って、いい感じのプロダクトを作る為のコツをいくつか書き残しておきます。

# LINE Things でいい感じの UX を実現するコツ

ただメッセージを流したり、LIFF を開くだけでは、手間が多かったり、イマイチなんで LINE の上から行うのかよくわからなくなってしまうことが多くなります。
そこで、きちんと LINE bot の機能を使って、うまく LINE Things を組み込んであげましょう。

基本的な LINE Bot の作り方や、機能の使い方のおさらい的なところもありますが、いくつか。
個人的につくった、[line-things-snippets](https://github.com/techno/line-things-snippets) で公開している、以下のようなプロトタイプを例にして説明します。

 * 簡単にスマホから画像が印刷できるようになるサーマルプリンタ
 * CO2 や気圧・温湿度が定期的に送信される空気質モニタ

## 友だち追加後のデバイス連携画面への遷移

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29906/1b4bc4cd-82ec-fa8f-14eb-1621464abf12.png" width="320">

まず、LINE Things を使ったときの最初の関門は、デバイス連携だと思います。
LINE Things Developer Trial では、友だち追加をしていないとデバイス連携できないため、まずは Bot を友だち追加してもらうことになります。

流れ的に以下のようなフローになると思います。

 1. 友だち追加
 2. LINE Things デバイス連携
 3. LIFF を開く or 自動通信

となるのですが、友だち追加して、デバイス連携画面の QR コードを読み取って... とやると面倒くさくて手間が多いです。

そこで、上記のように友達追加後の **あいさつメッセージ** で **LINE Things デバイス連携画面へのリンク** を送信してしまいましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29906/deaffd96-d1fa-1312-ad17-755bc9010789.png" width="480">

あいさつメッセージの設定は、[LINE Official Account Manager](https://manager.line.biz/) の "あいさつメッセージ" から行うことができます。
プログラミング不要で、友達追加後に送信したいメッセージをそのまま入力するだけです。画像なども送信できます。

LINE Things のデバイス連携画面への URL スキームは以下のとおりです。(公式ドキュメントに書かれていないけど...

 - **line://nv/things/deviceLink**
   - LINE アプリ内でメッセージとして送る場合はこちら
 - **https://line.me/R/nv/things/deviceLink**
   - QR コードでは、こちらのほうが認識率が高いかも

## リッチメニューを使って LIFF を開く

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29906/3452ecab-6598-f286-6d31-a464784b538d.png" width="320">


一度 LINE Things デバイス連携をすると、そのときに "今すぐ利用" ボタンが出てきて簡単に登録した LIFF を開くことができます。
しかし、一度デバイス連携画面閉じてしまうと、そのあともう一度開くには "設定 -> LINE Things -> デバイス名" と辿らなければならず面倒です。
また、なぜ LINE Things のために LINE を使うのかよくわからない感じの使い方になってしまいます。

そこで、LINE Bot の **リッチメニュー** を使って、上手に LINE のチャットと LINE Things を連携してあげましょう。
上記の例では、"2. 印刷" というリッチメニューの画像を押すと、LIFF が開くようになっています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29906/12168f20-30ee-bc3c-f17a-a9c418ce9fa6.png" width="480">

リッチメニューの設定は、[LINE Official Account Manager](https://manager.line.biz/) の "あいさつメッセージ" から行うことができます。
いろいろな数やサイズのリッチメニューを画像で設定することができるので、プログラミング不要で手軽に設定できます。

もちろん、上で紹介した **あいさつメッセージ** で LIFF のリンクを送ったり、[**デバイス連携イベント**](https://developers.line.biz/ja/reference/messaging-api/#device-link-event) を活用して LIFF のリンクを送信するのも有効です。
ぜひ、こちらもリッチメニューと併用してみてください。

また、連携画面からは1つの LIFF しか開くことができませんが、リッチメニューを使うと用途別に複数の LIFF を用意することができます。
例えば、プリンターの例では名刺モード、写真モード、テキストモードで、別の LIFF を用意するとかですかね？
多機能なものを作ろうと思ったときに便利だと思います。

## 自動通信のメッセージを LIFF を開くきっかけに使う

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29906/5552900e-e45e-6b77-4662-75b1b6a4fda1.png" width="320">

LINE Things では、現状では自動通信を用いても Messaging API を通じた双方向通信はできません。
できるのは、デバイス側からの Notify を受け取るか、接続時・半定期的に固定値を送信することだけです。
これは、LINE Things の仕様上の制限なので仕方ありません。

そのため、自動通信への応答として送信するメッセージは、ユーザーに LIFF を開かせるきっかけとして使うのが良いでしょう。
上記の CO2 センサーの例では、定期的にセンサーの値をメッセージしつつ、詳しく見たいなら LIFF を開いてねと **LIFF のリンク** をメッセージに同時に送信しています。

なにか状態の変化を自動通信のメッセージで飛ばして、ユーザに LIFF 上でのアクションを促すという使い方が、有効活用できて良いと思います。
例としては以下のようなものが挙げられると思います。

 - 接続時に自動通信を受け取り、あいさつや LIFF を開きたくなるようなメッセージを送る
   - スマートライト: おかえりメッセージを送信しつつ、LIFF から電気をつけませんかと案内する
 - なにか異常な値であるときにアラートをメッセージして、LIFF を開いて対処してもらう
   - 加湿器: 湿度が低下して乾燥しているので、LIFF から加湿器のスイッチを入れることをおすすめする
   - バッテリーを使うもの: デバイスのバッテリー低下の通知を自動通信で送る、LIFF から省電力モードにする

## 自動通信をデータは、返信しないで蓄積だけもできる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29906/76c02292-28ab-9027-3d1d-479c618a32f2.png" width="320">

自動通信の Webhook にはリプライトークンがついているので、返信したくなりますが必ずしも返信する必要がありません。
サーバーにデータを蓄積するだけででもよく、ユーザーが必要なときに取り出せるように Bot を実装することができます。

上記の例では、**クイックリプライ** 機能を使って、CO2 センサーのデータを過去のデータをすぐに確認できるようになっています。
ボタンを押すとすぐに bot から過去の蓄積したデータを送信してくれるようになっています。
クイックリプライの詳しい使い方は、[クイックリプライを使う - LINE Developers](https://developers.line.biz/ja/docs/messaging-api/using-quick-reply/) を参照してください。

LINE にたくさんメッセージを送ると邪魔なので、自動通信は頻度が高めで情報を送信しつつ、実際にメッセージ送信をするのは少なめにする。
その代わりに、クイックリプライなどの仕組みを通じて頻度高めに取得した過去データを手軽に要求できる。
このような自動通信の使い方もありだと思います。

## ユーザーの位置情報を取得するには

LINE の Messaging API にはユーザーの位置情報を自動で取得できる機能はありません。

ただし、ユーザーに位置情報の送信を要求する事はできます。
位置情報を LINE Things で組み合わせて使いたい場合、ユーザーに位置情報を要求できる方法は以下のようなものあります。

 - LIFF の中で JavaScript の [Geolocation API](https://developer.mozilla.org/ja/docs/Web/API/Geolocation/Using_geolocation) を使う
 - クイックリプライで、[位置情報アクション](https://developers.line.biz/ja/reference/messaging-api/#location-action) を要求する
 - 自発的に LINE の位置情報送信機能を利用してを送ってもらうように案内する
 - デバイスに GPS 受信機を搭載する (自動通信でユーザーの操作なしで取得するにはこの方法以外ない)

## 友達と一緒に遊べるデバイスを作るには

LINE なので、ただ Bot とコミュニケーションするだけでなく、友達と一緒に遊んだり触れるデバイスを作りたいものです。
BLE のハードウェアによっては、複数人が同時接続可能なものもあります。([Adafruit Bluefruit nRF52 で複数の BLE コネクションを張るには](https://qiita.com/hktechno/items/02a58ff972a8e68db32d))

友達とのチャットの中に、LINE Things を組み込むには現状2つの方法があります。
主に、友達と同時に LIFF を開いて遊んでもらうことになります。

 - 友達とのチャットに、デバイスの Bot を招待する
   - Bot がデバイス連携や、LIFF のリンクを案内する
 - 友達とのチャットの中に、LIFF のリンクを投下する
   - Bot の追加・デバイス連携は、それ以前に終わらせておく必要がある
   - Bot を入れる必要がないので、会話・トークルームが途切れない

友達とのトークの中で LIFF を開くと、LIFF 内からはそのトークルームへ自由に[メッセージが送信](https://developers.line.biz/ja/reference/liff/#send-messages)できます。
つまり、デバイスから取得した情報や、画像などを気軽に友達へ送信することができるようになります。
例えば、カメラデバイスなどで、友達に画像を直接送信したい場合、友達とのトークルームで LIFF を開くと、LIFF からメッセージを送信できます。

# まとめ

LINE Things も、うまく LINE Bot と連携させると更に面白いプロダクトが作れそうだよ！

本当は、LIFF をどこかにお気に入り登録したりして、友達とのチャットの中から開ける機能があるといいのですが、そういうのはなさそうですね...
今後に期待？