Beebotte で外向きの HTTPリクエスト（Webhook）が扱える BeeRule（BeeRules Engine）を使う

過去に、以下の記事でも扱った [Beebotte](https://beebotte.com/) に関する記事の 第4弾となるものです。

- [Beebotte の REST API と MQTT の組み合わせを公式情報を見つつ試す（curl と Node.js）【2022年4月版】 - Qiita](https://qiita.com/youtoy/items/be1ffffa2f003082bef8)
- [MQTTブローカーとしても使える Beebotte で MQTT.js を使った Pub/Sub（Node.js で実装）【2022年4月版】 - Qiita](https://qiita.com/youtoy/items/e2539558b67e708b905d)
- [Beebotte のダッシュボードで M5StickC から送った数値をグラフ化する（UIFlow ＋ MQTT でデータ送信） - Qiita](https://qiita.com/youtoy/items/b65ddfc89a03117a0ee3)

## 今回の記事の内容
今回扱うのは、以下の [BeeRules Engine](https://beebotte.com/docs/beerules) です。
![BeeRules Engine](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/40cb1ee9-004d-5dda-d30d-35a9e978225d.png)

公式ドキュメントの右にあるメニューを見ると、現状はベータ版の機能のようです。
![ベータ版の表示](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/384e1f93-a4e0-0226-e7eb-8f2f35528559.png)

こちらで webhook という項目があり、それを見てみると外向きの HTTPリクエストが使えそうだったので試してみたという話です。
![トリガーとアクション](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/90b11ed6-ae6b-202b-1152-d6e49912677b.png)
内向きの HTTPリクエストについては、冒頭に掲載した過去記事で書いた [REST API によるパブリッシュ](https://beebotte.com/docs/publish) で実現できます。

なお、Qiita の記事にはできてなかったですが、とあるイベントでの LT では「BeeRules Engine」について話をしたことがありました。

<script async class="speakerdeck-embed" data-id="98845a3a5b7b46b69e8435d313e80ff6" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

### 余談： Qiita のタグ設定
Qiita のタグで、「BeeRules」にするか「BeeRule」にするか少し悩んだのですが、webhooks と webhook について「webhook」のほうが多かったので、「BeeRule」のほうにしてみました。
機能の名称が「BeeRules」で、その機能の中で使われる「trigger・condition・action」のセットのルール決めのようなところが「BeeRule」となりそうな感じなので「BeeRules」のほうにするかな、というのも悩みつつ...

## 公式ドキュメントを見てみる
### BeeRules Engine
今回扱う「BeeRules Engine」の公式ドキュメントは、以下です。

https://beebotte.com/docs/beerules

内容について、おおまかな挙動だけを見ると IFTTT的な動作を実現するものっぽいです。
もちろん、IFTTT のように様々なサービスをつなぐ機能はなく、あくまで Beebotte への入力をトリガーにしつつ、限定的なアクションにつなぐ、という入出力しか選択できません。それと、IFTTT の有料版で利用できる「マルチアクション（query と filter）」のような、入出力間での条件設定ができたりもするようです。
![IFTTTの処理の流れ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/1a459dd0-c9f7-a179-8024-7f5316bb77e9.png)

処理の段階として「trigger・condition・action」の 3つがあるのですが、それぞれについて軽く見ていこうと思います。

### trigger
トリガーは、BeeRules Engine の処理を始めるきっかけの部分にあたるもののようです。
トリガーにできるイベントは、以下に一覧になっています。Beebotte での Pub/Sub や、接続・切断などのイベントをトリガーにできるみたいですが、自分がやりたいことが機器間・サービス間でのメッセージングになるので、パブリッシュをトリガーにしたものを使うことになりそうです。
![trigger](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/230a75d3-705c-d9bb-c643-c4baa1d4afec.png)

### condition
コンディションは、日本語に訳した場合に「条件」という意味がありますが、そのままの内容になりそうです。
上記のトリガーの後に、何らか条件分岐をさせて、この後に出てくるアクションを実行するかどうかを決めるところのようです。以下の記載の中で、「The condition is a true/false expression applied on the event data or metadata.」という記載があるため、条件判定の結果は 2値になるものという制約があるようです。
![condition](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/d32e2d23-f649-c1a3-6ba6-a48509e156ef.png)

### action
アクションは、BeeRules Engine で実行する処理の内容にあたります。
以下のとおり、「パブリッシュしたメッセージを保持するようにする（write）・メッセージのパブリッシュ」・「webhook」・「Firebase のメッセージング・メール送信」といった処理を選択できるようです。上でも書いていた自分の用途では、「webhook」が便利そうです。
![action](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/fd307137-f9a9-ecb5-e158-4b2107a5f46d.png)

## Beebotte の Webhook を試す
それでは、上記の「trigger・condition・action」を設定して、Beebotte へのパブリッシュをトリガーにした、Beebotte 外部への webhook　を作ってみようと思います。

### channel の準備
まずは、[冒頭で掲載していた過去記事](https://qiita.com/youtoy/items/e2539558b67e708b905d)で書いていた、MQTT を利用するための準備をします。準備を終えると、MQTT での通信を行うための情報として、以下がそろうと思います。

- MQTT の接続先： mqtt://mqtt.beebotte.com
- MQTT用のポート番号（SSL の利用なし）： 1883
- 認証方法： Channel token
   - 「user name: 【Channel token】、 password： 【（空）】」、または、「user name・password: 【Channel token】」を設定
- MQTT のトピック
   - 【channel/resource】

こちらの準備ができたら、まずは「trigger」の設定から行っていきます。

### ルールの新規作成と trigger の設定
以下の画面の左にある「Beerules」を選び、その後に出てくる画面右上の「New Beerules Recipe」と書かれたボタンを押します。
![Beerules のレシピ作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/69f2ae62-34ff-8697-748e-c8faac229d8b.png)

そうすると、以下のような画面が表示されます。
「Rule name」のテキストボックスは、後で分かりやすい名前を何か設定しましょう。
![ルールの作成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/b77f0dda-bba4-26f5-a0d1-fdc3ec98719e.png)

「Trigger」の部分の一番左は、デフォルトの「Publish to」のままにしておきます。
その右は、今回用に利用するチャンネルの名前とリソース名をそれぞれ入力します。

### condition の設定
「Condition」の部分は、デフォルトでは「data」が何らかの値と等しいという条件を設定する形になっています。
また、この画面を見ていると、ON/OFF用の UI があり、無条件でアクションへつなげることもできるようです。今回は「Condition」の部分を OFF　にして、使ってみようと思います。

### action の設定
「Action」の部分は、デフォルトでは「Publish to Channel」が選ばれており、パブリッシュを行うチャンネル・リソースや、パブリッシュするメッセージを設定する形になっています。

ここは、「Publish to Channel」を「Webhook Notification」に変更します。そうすると、POST先の URL を入力するテキストボックスが表示されるので、何らか POST　する先の URL を設定しましょう。

ここまでの手順が完了したら、画面左下の「Save」ボタンを押します。

### 動作確認
あとは、「Trigger」で設定したチャンネル・リソースへのパブリッシュを行い、「Action」で設定した POST 先に HTTPリクエストが行われるかを確認してみましょう。
（それ以外に、「Beerules」の一覧で先ほど作成したルールを選択すると、動作テスト用の画面が表示されるので、そこから動作確認をすることもできるようです）

過去の記事でも使った、以下のプログラムを用いて MQTT でパブリッシュをします。

```javascript
const mqtt = require("mqtt");

const client = mqtt.connect("mqtt://mqtt.beebotte.com", {
  clientId: "javascript_pub",
  username: "【Channel token】",
  password: "",
});

client.on("connect", function () {
  console.log("connected!");

  setInterval(function () {
    client.publish(
      "【channel/resource】",
      "BeeRules Engine のテスト"
    );
    console.log("done!");
  }, 2000);
});
```

__本来、ここで無事に Webhook が実現できたのを確認して終わり、としたかったのですが、なぜか Webhook が動いておらず...__

ちなみに、動作テスト用画面で処理を実行すると、Webhook の処理が行われていました。どうやらトリガーが意図通りにうまく動いていないようでした（もしくは、自分が想定した挙動と BeeRules Engine ｎ挙動とが何か違っているか...）。

## Beebotte の Webhook を試す 【その2】
上記でトリガーがうまく動いてなさそうだったので、トリガーの内容を変更して試してみました。

具体的には、「Publish to」を「Connect」にして、その時にデフォルトで入力された値（Channel も Resource も「Any」）に変更しました。再度、上記のプログラムを使って MQTT のパブリッシュを行ってみます。
今度は、Beebotte への接続時点で「Trigger」が動作したようで、Webhook の処理が行われているのが確認できました。

## Beebotte の Webhook を試す 【その3】
この後、「Subscribe to」を選んでみて、過去の記事で使った MQTT のサブスクライブのプログラムを実行した場合も、Webhook の処理が行われているのが確認できました。最初に試そうとして「Publish to」が想定通りの動作にならなかったのは謎のままですが、とりあえず「BeeRules Engine」を使ってみて動作が行われるのを確認するのはできました。