MESHとIBM Cloud Functions連携してみた

# MESH きたー！(ﾟ∀ﾟ)
Sonyが提供しているIoTブロックの[MESH](https://meshprj.com/jp/)はご存知でしょうか？
ブロック毎に機能が異なるIoTデバイスで、ボタンが押されたら、ブロックが動いたら、人が通ったら、温度が変わったら、といった変化を検知して、Blootothで接続されたPCやタブレット、スマートフォンのアプリと連動して、音を鳴らしたり、ブロックに指示を与えたり、はたまた[IFTTT](https://ifttt.com/)を利用してインターネット上のサービスと連動することができます。IoTやプログラムの教育で利用するのも良いかもしれません。

というわけで、買っちゃったー　(Amazonで **38,683円** 、安くない・・・)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/d85a055f-25fc-cafd-f7e3-a9a7e887d767.png)

# さっそく繋いでみよう
Node-REDのように一覧からブロックを選んで、画面にぽいっと。ブロックとブロックの間は、Fromの端をドラッグすると選んだブロックに接続できます。
ボタンブロックは、以下のトリガーを選べます。今回は`1回押されたら`を選択

- 1回押されたら
- 長押しされたら
- 2連続で押されたら

LEDブロックは、以下の4つから、 `点灯する` を選択、デフォルトのままですが、発光色や、明るさ、時間も指定できます。

- 点灯する
- ふわっと光る
- 点滅する
- 消灯する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/b8ca9290-e731-018e-8260-f0e670ee8238.png)

よし、じゃあボタンをぽちっと・・・光ったー！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/45793aeb-c3ab-de82-df86-9c32af8b35af.png)

アーキテクチャ的にはこんな感じで、ブロック同士が直接連携しているのではなく、Bluetoothでアプリ実行環境(今回はノートPC)に接続して、MESHのアプリケーションを介して連携されるものになります。つまりブロックはどこでも使えるかというとそうではなく、MESHのアプリ実行環境と近くにある必要があります。Bluetoothだし、家庭内でも電子レンジ近くとか危険ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/72532442-cebd-e19f-ad64-a263320c556f.png)

おおぉ、簡単だし、面白い。温度、湿度をブロックでチェックしたりもできるので、何かいろいろ出来そう。オラ、ワクワクすっぞ！

# よし、部屋の室温と湿度を教えてもらおう
我が家には室温、湿度を教えてくれる機器が無いので、教えてもらおう。
こんな感じで、ボタンをトリガーに、温度・湿度ブロックでそれぞれ現在の温度、湿度を検知して、その結果をIFTTTで連携します。
温度・湿度ブロックは、温度や湿度が指定範囲から外れたら、といったトリガーの動きも可能ですが、今回のように、別のトリガーから呼び出して温度や湿度情報を取得することも可能です。
IFTTTのブロックでは、IFTTTに連携する`イベントID`と`テキスト`を設定します。今回は、ボタン押された時に表示したい通知内容を設定しています。
MESHアプリから、IFTTTを呼び出すには事前に、MESHのアカウント登録と、MESHで発行されるキーをIFTTT側へ設定しておくことが必要です。
サポートにも[情報が載っています](https://support.meshprj.com/hc/ja/articles/213673088-IFTTT%E9%80%A3%E6%90%BA%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84)が、手順はとても簡単ですよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/241b8f18-6ad5-1a0b-8330-9e364edddf1d.png)

続いて、IFTTT側で、連携の作成、まずはLINEアカウントと連携して、LINEに通知してみよう。
IFTTTでLINE通知を行うには、自身のLINEアカウントで `LINE Notify`の設定が必要です。
手順は、[こちら](https://ferret-plus.com/5355)をご参考に、とても簡単ですよ。これで、IFTTTでLINE連携すると、こちらのLINE Notifyで私に通知が来ます。LINE Notifyは、他の人を招待してグループチャット化もできます。家族で通知を共有するとかできますね！

IFTTTでは、IF `This` 何をトリガーに `Then` 何のサービスを呼び出すか、を順番に定義します。他のアカウントが公開している連携もコピーして自分で使うこともできますよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/fac10cef-fdc0-9c24-49bf-04f7cab79bcf.png)
今回は、ThisにMESH、ThenにLINEを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/0edcb264-95d0-a90b-ce09-d075e49343f3.png)
このように、MESHからIFTTTに受け取るIDを`test1`にして、LINEへのメッセージは通知内容を設定します。`{{Text}}`を入れることで、MESHのIFTTTで設定したテキストをそのまま転送することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/3c72735e-275a-1122-bec6-35fdfdd31022.png)
では、これらを有効化して、ぽちっとボタンを押してみましょう。
だいたいボタンを押して10秒弱くらいで、通知が飛んできました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/3314090a-1796-3d8c-7174-369e11a6b572.png)


# じゃあIBM Cloud Functionsに連携してみよう
元々LINEじゃなくて、Slackへ連携したかったのですが、Slack連携しようとしたときにIFTTTでSlack連携するためには、以下のような画面が出てきて、IFTTTアプリをワークスペースに入れないとダメみたい。間違いなく会社のポリシー的にアウトなので、IBM Cloud Functionsを経由してSlackに投稿させることにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/3d20ef63-526e-90a7-7353-0c9759003cb2.png)
まず、MESHでのIFTTTブロックへのイベントIDを別のものに書き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/41599a1f-85e5-bdb6-a4b1-27d830a798cb.png)

IFTTTでは、受取の`This`のサービスはMESHですが、`Then`は、Functionsをキックする必要があるので、`Webhook`を選択します。
設定は、以下のように、MESHの受取るイベントIDは新たに設定した`test2`、FunctionsにAPIを作成して、実行する際に`Method`,`Body`,`URL`,`Content Type`をAPIに合わせて定義しましょう。
`Body`にはJSONを渡したいので`{"text":"{{Text}}"}`とすることで、MESHで設定したIFTTTのメッセージをJSON化します。
IBM Cloud FunctionsにAPI作成したこと無い方は、下記の記事を参考にしてください。

- [IBM Cloud Functons 動かしてみた](https://qiita.com/katahiro/items/4b515c12e42e98e17eb7)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/82eae779-438c-ecf1-c8b3-ce31d34a9001.png)
試しに、API側で実行時のパラメータの`text`をログに出力するようにして、ボタンをぽちっと。
IBM Cloud側のモニターに反映されるまで時間かかりますが、無事にFunctionsのAPIを呼び出せてますし、ログを見る限り、JSONで渡された`text`の内容もハンドリングできているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/7c71f864-98dc-e085-1159-866a2e9c712d.png)

では、FunctionsのAPIをSlackにIncoming Webhookを利用して投稿できるようにしましょう。
ささっと、以下のコードを書いて、Functionsに反映させましょう。
反映のさせ方がわからない場合は、以前のこちらの記事を確認ください。

- [IBM Cloud FunctionsでNode.jsのパッケージを利用してみた](https://qiita.com/katahiro/items/1d483030527367338574)

```Javascript:package.json
{
  "name": "qiita-action",
  "version": "1.0.0",
  "main": "action.js",
  "dependencies": {
    "request": "^2.88.0"
  }
}
```


```Javascript:action.js
const main = async ( params ) => {
  const incomingWebhookUrl = "https://hooks.slack.com/services/XXXXX/XXXXX/XXXXX"; // ご自身が利用するIncoming Webhookを設定してください

  // textのパラメータが存在する場合にのみ限定
  if(params.text){
      // Slack通知 チャンネルは投稿先のチャンネルIDを指定してください
      const slackMessage = {
        "text"       : "[ MESH通知 ] " + params.text,
        "channel"    : "xxxxx",
        "username"   : "IFTTT",
        "icon_emoji" : ":high-temperature:",
      }
      
      const slackSendOption = {
        method: 'POST',
        url: incomingWebhookUrl,
        encoding: null,
        headers: {
          "Content-type": "application/json",
        },
        json: slackMessage
      };
      const slackResult = await callAPI(slackSendOption);

    return {"ok":true};
  }
  return {"ok":true};
}

const callAPI = (httpOption) => {
  return new Promise((resolve,reject) => {
    const request = require( 'request' );
    request( httpOption, ( err, res, buf ) => {
      if( err ){
        reject( { status: false, error: err } );
      }else{
        resolve(res);
      }
    });
  })
}

exports.main = main;
```

よしよし、ではボタンをぽちっとな・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/c60944c7-6279-b68e-64be-b52b1d1a6e31.png)

Slackに通知きたーーー！(ﾟ∀ﾟ)

# さいごに
いかがでしたでしょうか？MESHとIFTTT、IBM Cloud Functionsを利用して、IoTがさくっと作れました。そんなに難しくないですし、トリガーを温度の変化にして、室温が29℃以上になったら、そろそろエアコン付けたらどうですか？なんて通知を飛ばすことも可能です。
MESH + IFTTTの連携は、かなり期待が持てるので、これからも暇を見つけては弄りたいですね！