【NoCode 2020】 MQTTブローカーの shiftr.io と IFTTT の Webhook をつなぐ（shiftr.io の HTTP Interface）

内容は表題のとおりで、IoT でよく利用される MQTT と HTTPリクエストベースの Webhook とをつなぐ、という話です。

IFTTT が絡むネタなので、後付けで [NoCode Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nocode) の 25日目に登録してみました。

## MQTTブローカーの shiftr.io
IoT でよく利用される MQTT は、MQTTブローカーという仲介役を介してデータのやりとりを行います。自分自身も、過去に IoT関連の仕組みを使う際やデバイス・サービス間連携の試作をする中でよく利用している仕組みです（過去に書いた Qiitaの記事でも何度も登場しています）。

その仲介役になる部分は自前で用意する方法もあるのですが、クラウド上で提供されているサービスを利用することもできます。そのサービスの中の 1つがタイトルにも登場している「shiftr.io」です。現在は、クラウド上のサービスと、デスクトップ上で動くアプリの提供が行われていたりします（[「そのあたりの話について書いた記事」](https://qiita.com/youtoy/items/8cbc9e6fa1cd46ca2c3c
)もありますので、よろしければご覧ください）。

### shiftr.io の HTTP Interface
今回は、この MQTTブローカーサービスの中で提供されている「HTTP Interface」の話です。

この話は、11月の中頃にサービスのリニューアルの話をチェックしていた際に、以下の内容を見かけて調べていました。
<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">あれ？<br>もしや新バージョンっぽいもの、クラウド版はWebhook対応してる？<br>●<a href="https://t.co/8lBLAbEaDK">https://t.co/8lBLAbEaDK</a><br>　<a href="https://t.co/k1zVij5xq4">https://t.co/k1zVij5xq4</a> <a href="https://t.co/K4ssl8SsN4">pic.twitter.com/K4ssl8SsN4</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1327430969536647168?ref_src=twsrc%5Etfw">November 14, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

そして、直近で書いた記事では、以下の IFTTT を使った AIアシスタント連携機能と MQTTブローカーの間をつなぐために利用していたりします。IFTTT の出力側（アクション）を Webhook にして shiftr.io に HTTPリクエスト（POST）を送り、shiftr.io の HTTP Interface で受け取ったものを MQTT にして連携させていたデバイスへ送る、ということをやっていました。

●【スマートスピーカー 2020】 IFTTT で Alexa・Google Assistant を利用して IFTTT Pro の新機能（クエリー・フィルター）との組み合わせも試す - Qiita
　https://qiita.com/youtoy/items/ab6747622d137fcadead

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">shiftr の HTTP Interface を活用。<br><br>IFTTT を組み合わせて、 <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> ＋ <a href="https://twitter.com/hashtag/UIFlow?src=hash&amp;ref_src=twsrc%5Etfw">#UIFlow</a> から <a href="https://twitter.com/hashtag/Noodl?src=hash&amp;ref_src=twsrc%5Etfw">#Noodl</a> につないでいた部分を、Alexa からつなぐようにできた！<br><br>トリガーというキーワードが入るのは、IFTTT を使ったことによる仕様です。<a href="https://twitter.com/hashtag/Noodl%E3%82%82%E3%81%8F%E3%82%82%E3%81%8F%E4%BC%9A?src=hash&amp;ref_src=twsrc%5Etfw">#Noodlもくもく会</a> <a href="https://t.co/6lAt67SpT2">pic.twitter.com/6lAt67SpT2</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1335047509777940480?ref_src=twsrc%5Etfw">December 5, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

公式ドキュメントの URL は以下となります。

●HTTP Interface - shiftr.io
　https://www.shiftr.io/docs/broker/http-interface/

そして、Publish を curl で行う場合のやり方が以下の部分に書かれています。

![HTTP_Interface_-_shiftr_io.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d4eeca4f-bf9c-3729-f286-2f11c97b6778.jpeg)

上の画像では記載が途切れていますが、この中の 1つ目は以下の内容となっています。

```bash
curl -X POST 'https://public:public@public.cloud.shiftr.io/broker/foo/bar' -d 'Hello World!'
```

あとは、上記の HTTPリクエスト（POST）を IFTTT の Webhook から送ってやれば OK という形です。

## IFTTT の Webhook から shiftr.io の HTTP Interface へ
この記事の途中で紹介した、[IFTTT の AIアシスタント連携機能を用いた記事](https://qiita.com/youtoy/items/ab6747622d137fcadead)の話で、Webhook の設定をした部分を掲載してみます。

こちらの「トリガーがAlexa連携」で「アクションが Webhook」というアプレットの、アクション側の設定の話です。
![IFTTT_Alexa_Webhook.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d06c0624-153a-be3b-1270-101d86770111.jpeg)

一部マスクしつつ、設定画面を掲載します。
![IFTTTのアクション.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d7080e21-9042-95bb-3413-b3e7b3cac485.jpeg)

以下の curl を使った例で太字にした部分は、上記の画像で赤で下線をひいた部分に対応する部分ですが、これらはご自身が shiftr.io で設定をする中で取得できる情報（@ 前後にあるそれぞれの部分）と、任意に設定する部分（以下の foo/bar の部分）になりますので、置きかえが必要です。

> curl -X POST 'https://**public:public**@**public**.cloud.shiftr.io/broker/**foo/bar**' -d 'Hello World!'

あとは、上記の例では POST で、テキストを text/plain で送っているようなので、そのように設定します。
また、上記の `-d 'Hello World!' ` で送っている内容は、送信されるメッセージで、自分は「Hello」という内容にしています。
（MQTT の受信側で、この「Hello」というメッセージを受け取る想定での処理を書いている部分があります）

全体構成を図にすると以下のようになります。
![202012末_構成図を記事用に.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/8dc693b2-cded-e4f9-db52-bd5f8d5bf179.png)

## まとめ
以上の仕組みを利用することで、サービス・デバイス間をつなぐ仲介役について、入力側は HTTPリクエスト（POST）による Webhook、出力側が MQTT となる構成をとることができました。

他サービスでも似た仕組みを提供しているサービスがありますが、その話はまた別の機会に。