LineBot(LINE Messaging API)からUiFlow経由でM5StackBASICを制御する

## 本記事について
先日参加したハッカソンでM5StackとLineBotを連携するために行ったことについてまとめます。

[【増枠！】M5Stackハッカソン by #ヒーローズリーグ](https://mashupawards.connpass.com/event/188452/)

なお、この記事はハッカソン当日に技術サポートを担当していただいたProtoOut Studioで講師を務めている[小野さん](@tkyko13)から指導していただいた内容を記録したものです。
改めて小野さんにお礼を申し上げます。

## M5Stack→Line Notifyに関する記事は結構あるのですが
[IFTTTで簡単IoT！M5StackとLINEを連携する方法](http://kyokucho1989.chillout.jp/2019/11/09/ifttt%E3%81%A7%E7%B0%A1%E5%8D%98iot%EF%BC%81m5stack%E3%81%A8line%E3%82%92%E9%80%A3%E6%90%BA%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
[プリンを守る技術 ～その１：LINEへの通知～]
(https://qiita.com/nnn112358/items/8d2021bce1113d7e60ce)
[M5StackからLINEでデータを送信](https://blog.lilytrans.info/2019/03/29/m5stack%E3%81%8B%E3%82%89line%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E9%80%81%E4%BF%A1/)
(▼こちらはかなり最近投稿されたものですね。LGTM!▼)
[【初心者向け】M5StackのUiFlowからLINEに通知を送れるようにする方法【LINE Notify】](https://qiita.com/twtjudy1128/items/e4980be7ffd1b465144a)
## 今回やりたいのは逆なのです
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">LineBot(LineMessagingAPI)から送った値を使用してM5Stackを制御する方法ってあるのでしょうか。<br>Botから1っておくったらM5Stackの画面を赤にするとか、そういう感じです。。。！<a href="https://twitter.com/hashtag/%E3%83%92%E3%83%BC%E3%83%AD%E3%83%BC%E3%82%BA%E3%83%AA%E3%83%BC%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#ヒーローズリーグ</a>　<a href="https://twitter.com/hashtag/protoout?src=hash&amp;ref_src=twsrc%5Etfw">#protoout</a></p>&mdash; ウーリズム (@Uh_rhythm) <a href="https://twitter.com/Uh_rhythm/status/1307480122094571521?ref_src=twsrc%5Etfw">September 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


すでに小野さんは答えを持っていたようで！
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">皆さん思ったよりM5Stackへ通知送りたいようですね...MQTTかリモートだけども、どちらで行くか… <a href="https://twitter.com/hashtag/%E3%83%92%E3%83%BC%E3%83%AD%E3%83%BC%E3%82%BA%E3%83%AA%E3%83%BC%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#ヒーローズリーグ</a></p>&mdash; るしわん (@tkyko13) <a href="https://twitter.com/tkyko13/status/1307484488096604160?ref_src=twsrc%5Etfw">September 20, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

という訳で教えていた内容をまとめていきます。

##準備
###UiFlow側
1.Remoteメニューよりボタンを作成
2.デプロイする
3.QRコードからURLを取得
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/614d7919-59e5-21b5-1149-1e0f4463d563.png" width="50%">

4.URLにアクセス。検証ツールからエンドポイントのURLを取得する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164405/2a2c10df-3d4a-6c3e-8fdd-1151e7af8bc9.png" width="50%">


###LineBot(LINE Messaging API,Node.js)側
1.おうむ返しbotなどをあらかじめ作っておく
2.axiosを使いBotから投稿されたメッセージによりUiFlowのエンドポイントを呼び出す

__コードはこんな感じです__

```javascript

'use strict';

const express = require('express');
const line = require('@line/bot-sdk');
const axios = require('axios');
const PORT = process.env.PORT || 3000;

const config = {
    channelSecret: '{CHANNELSECRET}',
    channelAccessToken: '{CHANNELACCESSTOKEN}'
};

const app = express();

app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない)
app.post('/webhook', line.middleware(config), (req, res) => {
    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

const client = new line.Client(config);
var message = "Hello M5Stack";
async function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }
  if (event.message.text == "1") {
  // エンドポイントに先ほどのButtonのURLを設定する  
  axios.get('http://api.m5stack.com/v1/{APIKEY}/call?func=_remote_ButtonName1()')
  }
  console.log(event.message.text)
  return client.replyMessage(event.replyToken, {
        type: 'text',
        text: message
  });
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);
```


## まとめ
これはAPIの知識さえあれば実装はすぐ理解できますがUiFlowにはなれていなかっためこれができなければ当日の制作は成り立ちませんでした。
人に聞くことの大事さを改めて学ぶとともに、今いる環境に感謝したいと思いました。