SORACOM LTE-M Button から LogicApps へつなげたい（トリガー連携まで）

# Update 2019.05.10

SORACOM Beam/Funnel/Harvest を直接利用できる「しろボタン」こと [SORACOM LTE-M Button for Enterprise](https://soracom.jp/products/gadgets/enterprise_button/) と、「ひげボタン」こと　[SORACOM LTE-M Button Plus](https://soracom.jp/products/gadgets/button_plus/) が発売されました。

![しろボタン](https://soracom.jp/img/products_soracom-lte-button-enterprise_01.jpg)
![ひげボタン](https://soracom.jp/img/products_soracom-lte-button-plus.png)


セルラー通信ボタンデバイスで Logic Apps/Flow を実行したい方は、こちらのボタンを購入したほうが**圧倒的に楽です！**
SORACOM Beam から Azure Logic Apps/Microsoft Flow への接続は、以下記事を御覧ください

* [SORACOM Beam をトリガーとして Microsoft Flow を動かす方法](https://qiita.com/ko2a/items/cfee52310562f51247c2)
* [SORACOM Beam をトリガーとして Azure Logic Apps を動かす方法](https://qiita.com/ko2a/items/254b8bfffee5a62f5f10)

# はじめに

[#あのボタン](https://twitter.com/search?q=%23%E3%81%82%E3%81%AE%E3%83%9C%E3%82%BF%E3%83%B3) こと [SORACOM LTE-M Button powered by AWS](https://soracom.jp/products/gadgets/aws_button/) の Advent Calendar 2018 の 24 日目担当の @ko2a です。

お仕事で炎上しまくった挙句、先週からぎっくり背中で寝てばかりの生活でコンセプト以外何も仕上がってなく、クリスマスイブの夜にひーひー言いながら本記事を書いていますorz

Windows 歴長い ＋ .NETer な私にとって、AWS も興味津々ですが、 Azure も当然ながら興味津々です。
ということで、ボタン押下を [Azure LogicApps](https://azure.microsoft.com/ja-jp/services/logic-apps/) のトリガーにしてしまおうというのが本記事の目標です。

といっても、サンプルのコードをつぎはぎして突貫工事したので、LogicApps のトリガーとして使えるレベルに持っていくのでタイムアップとなってしまいました。
payload の中身とかは追々時間あったら対応しましょうかね。

# 前提条件・おことわり

* ソラコム公式の "Getting Started with SORACOM LTE-M Button" をベースにいじいじしています。<br>[SORACOM LTE-M Button powered by AWS をクリックしてSlackに通知する](https://dev.soracom.io/jp/start/aws_button_slack/)
* そのため、基本的なとこはかなーり端折ってます。
* 本コードを参考にしてトラブル・問題に巻き込まれても当方は一切責任を負いませんのであしからず。

# 準備
## 1. LogicApps 

Logic App を追加します。
![004.png](https://qiita-image-store.s3.amazonaws.com/0/49240/a59efe64-3eba-7cd2-a1bd-e0920f37841c.png)

追加した Logic App を選択してデザイナーを起動します。
![005.png](https://qiita-image-store.s3.amazonaws.com/0/49240/08997470-8bf7-e850-944d-571b4d62dcd4.png)

「空のロジック アプリ」を選択します。
![006.png](https://qiita-image-store.s3.amazonaws.com/0/49240/597f97c3-cd09-e814-296d-f20139d2e5d7.png)

トリガーに「要求 / HTTP 要求の受信時」を、アクションとして確認用に「Outlook.com / メールの送信」を選択し、保存します。
（実行確認できるアクションなら、ここではどれでもよいです）
![011.png](https://qiita-image-store.s3.amazonaws.com/0/49240/30482113-22f2-61dd-6e81-6166e60d66ec.png)

保存すると「HTTP POST の URL」が払い出されるので、コピーしておきます。
![012.png](https://qiita-image-store.s3.amazonaws.com/0/49240/7087b446-c95a-a47e-36a5-c5c36ff2e778.png)


## 2. AWS Lambda

これ以降の流れは、[SORACOM LTE-M Button powered by AWS をクリックしてSlackに通知する
](https://dev.soracom.io/jp/start/aws_button_slack/#slack) の 「ステップ 5: Lambda関数を作成してSlackに通知する」の流れをほぼほぼ踏襲します。

プロジェクトの作成・構成はまんま踏襲します。
![010.png](https://qiita-image-store.s3.amazonaws.com/0/49240/54787ccd-0632-62cb-1c4e-4e8770c7dae2.png)

Lambda 関数は LogicApps 用にちょこっと弄ったものを使用します。
（というか、動作確認したいので slack 用のコード削除と変数名を修正してるダケー）

```javascript
const https = require('https');
const url = require('url');
const defaultLogicAppsUrl = process.env['LOGIC_APPS_URL']
const defaultMessage = {
    "SINGLE": "Single Click",
    "DOUBLE": "Double Click",
    "LONG": "Long Click"
}

exports.handler = (event, context, callback) => {
    console.log('Received event:', JSON.stringify(event, null, 2));
    var logicAppsUrl = (event.placementInfo.attributes.logicAppsUrl)? event.placementInfo.attributes.logicAppsUrl:defaultLogicAppsUrl
    if (!logicAppsUrl) {

    }
    var logicAppsReqOptions = url.parse(logicAppsUrl);
    logicAppsReqOptions.method = 'POST';
    logicAppsReqOptions.headers = {'Content-Type': 'application/json'};
    var text = event.placementInfo.attributes[event.deviceEvent.buttonClicked.clickType]
    if (text) {
        var text = event.placementInfo.attributes[event.deviceEvent.buttonClicked.clickType]
        var payload = {'text': text}
    } else {
        var text = defaultMessage[event.deviceEvent.buttonClicked.clickType]
        var payload = {'text': text, "attachments":[{"text":JSON.stringify(event, null, 2)}] }
    }
    var body = JSON.stringify(payload);
    logicAppsReqOptions.headers = {
        'Content-Type': 'application/json',
        'Content-Length': Buffer.byteLength(body),
    };
    var req = https.request(logicAppsReqOptions, function(res) {
        if (res.statusCode === 200) {
            console.log('Post to LogicApps');
            callback(null, {"result":"ok"});
        } else {
            callback(false, {"result":"ng", "reason":'Failed to post LogicApps ' + res.statusCode})
        }
        return res;
    });
    req.write(body);
    req.end();
};
```

環境変数へ「LOGIC_APPS_URL」と、先程 LogicApps で払い出された URL を貼り付けて保存します。

![013.png](https://qiita-image-store.s3.amazonaws.com/0/49240/25aa224c-e0d5-27ce-21f8-ce4bb68d3137.png)


## 3. AWS IoT 1-Click

ここもソラコム公式の資料をまるっと踏襲します。

プロジェクト作成して
![001.png](https://qiita-image-store.s3.amazonaws.com/0/49240/761293f8-f2f2-73b6-3ac0-a097b6017ac6.png)

プレイスメントのテンプレートの定義で、さっき作成した Lambda 関数を設定して
![014.png](https://qiita-image-store.s3.amazonaws.com/0/49240/66bf43bb-14dd-45f0-5b0a-1b4c4fface68.png)

プレイスメントを設定して
![015.png](https://qiita-image-store.s3.amazonaws.com/0/49240/b93cc4f3-96fc-e19d-4c67-f9f03d7098a9.png)

使うボタンデバイスのプロジェクトと配置を確認。
![016.png](https://qiita-image-store.s3.amazonaws.com/0/49240/1e86c2b6-3a82-e92e-0546-783493931823.png)

# 動作確認

さて、ボタンを押して確認！

問題なく設定できてれば、 AWS IoT 1-Click 上で、「ボタンのクリック」と「成功した Lambda 関数呼び出し」が表示されます。
![017.png](https://qiita-image-store.s3.amazonaws.com/0/49240/72ceb2b6-5cc2-96b6-1136-715fc228ffab.png)

Azure Portal の当該ロジックアプリを見ると、実行の履歴に「成功」のログが表示されます。
![018.png](https://qiita-image-store.s3.amazonaws.com/0/49240/92c62cd3-cc9d-3c79-5d5a-b9438f409e4a.png)

成功したログをクリックすると、 「HTTP 要求の受信時」に Lambda 関数からのデータが格納されています。
（attachments/text の中身はきちんと作ってないので気にしない気にしない・・・）
![019.png](https://qiita-image-store.s3.amazonaws.com/0/49240/35a91f23-91e2-d653-8001-4093791d79d9.png)

```json
{
    "headers": {
        "Connection": "close",
        "Host": "prod-XX.japaneast.logic.azure.com",
        "Content-Length": "794",
        "Content-Type": "application/json"
    },
    "body": {
        "text": "Single Click",
        "attachments": [
            {
                "text": "{\n  \"deviceInfo\": {\n    \"deviceId\": \"7MFXXXXXXXXXXXXX\",\n    \"type\": \"button\",\n    \"remainingLife\": 91.99145,\n    \"attributes\": {\n      \"projectRegion\": \"ap-northeast-1\",\n      \"projectName\": \"ButtonToLogicApps\",\n      \"placementName\": \"AdventCalendar2018-No1\",\n      \"deviceTemplateName\": \"AdventCalendar2018\"\n    }\n  },\n  \"deviceEvent\": {\n    \"buttonClicked\": {\n      \"clickType\": \"SINGLE\",\n      \"reportedTime\": \"2018-12-24T13:09:03.418Z\"\n    }\n  },\n  \"placementInfo\": {\n    \"projectName\": \"ButtonToLogicApps\",\n    \"placementName\": \"AdventCalendar2018-No1\",\n    \"attributes\": {},\n    \"devices\": {\n      \"AdventCalendar2018\": \"7MFXXXXXXXXXXXXX\"\n    }\n  }\n}"
            }
        ]
    }
}
```

長押し、ダブルクリック時もちゃんと連携できてます。
![020.png](https://qiita-image-store.s3.amazonaws.com/0/49240/3207dc8c-975f-26a0-97a2-d2152ff23db9.png)
![021.png](https://qiita-image-store.s3.amazonaws.com/0/49240/819fc53f-7241-c4c7-89cb-4532e73cebef.png)

# 残課題
attachments/text の中身は時間あったら作ろうか・・・
（node.js 苦手やん・・・つらい）

# おわりに
**なんとかまにあったー！**

じゃなくて。

トリガーの設定するまでは大変ですが、設定の仕方を確立させてしまえば後はノンプログラミングでできるのが LogicApps のよいところ？
でもこの連携組んでて思ったのは、結構面倒なピタゴラ装置っぽくなってしまったので、シンプルさを求めるなら AWS で完結するのが望ましいのかもしれない、と思ったのはナイショですよ。

クリック種別やデバイス ID も連携できるので、LogicApps 側で判定処理とか入れればある程度動作を振り分けることもできるし、アクション側であれこれ対応してもよさそうな雰囲気。

まあ、attachments/text のあたりをきれいにするのが先ですね。
いつ対応するかは未定。