# ルールエンジン

EMQXは、データ処理のためのルールエンジン機能を提供しており、[データ統合](./data-bridges.md)と連携してIoTデータの抽出、フィルタリング、強化、変換、保存を行います。これにより、アプリケーション統合が加速し、ビジネスのイノベーションを促進します。

![data-integration-arch](./assets/rules/data-integration-arch.png)

EMQXのルールエンジンは、特に受信したメッセージの変換や経路変更に有効です。例えば、不要なデータをフィルタリングしたり、変換を行ったり、特定のイベントや条件に基づいてアラートや通知をトリガーするルールを作成できます。

本章では、ルールエンジンの詳細な機能と使い方について解説します。

## ルールエンジンの仕組み

ルールは、**データソース**からデータを取得し、**データ変換**を行い、その結果に対して適用する**アクション**を指定します。

<img src="./assets/sql_process.png" alt="sql_process" style="zoom:50%;" />

- **データソース**：ルールのデータソースはメッセージ、イベント、または外部データシステムが対象となります。ルールのSQLの`FROM`句でデータソースを指定し、`WHERE`句で処理対象のメッセージに対する追加条件を設定します。

  サポートされる各種データソースや`WHERE`句で参照可能なフィールドの詳細は、[データソースとフィールド](./rule-sql-events-and-fields.md)をご参照ください。

  EMQX 6.0.3以降、ネームスペースが有効な場合、ルールエンジンはデフォルトでネームスペースによるルールのトリガー制限を行います。ネームスペースに属するルールは、同じネームスペース内のクライアントからのメッセージやクライアント関連イベントのみでトリガーされます。詳細は[ネームスペース](../../guides/multi-tenancy/namespace-overview.md#isolation-mechanisms)を参照してください。

- **データ変換**：データ変換は入力メッセージの変換処理を指します。SQLの`SELECT`句で入力メッセージからデータを抽出・変換します。埋め込みSQLのサンプル文を用いて、出力メッセージにタイムスタンプを追加するなどの高度な変換も実装可能です。

  SQL構文や組み込みSQL関数の詳細は、[ルールSQLリファレンス](./rule-sql-syntax.md)および[組み込みSQL関数](./rule-sql-builtin-functions.md)をご覧ください。

- **アクション**：入力が指定されたルールに従って処理された後、1つ以上のアクションを定義してSQL実行結果を処理します。ルールエンジンは順次対応するアクションを実行し、処理結果をデータベースに保存したり、別のMQTTトピックに再パブリッシュしたりします。サポートされるアクションは以下の通りです。

  - [メッセージの再パブリッシュ](./rule-get-started.md#add-republish-action)：結果を指定したMQTTトピックにパブリッシュする。
  - [コンソール出力](./rule-get-started.md#add-console-output-action)：結果をコンソールやログに出力する。
  - [シンクへの転送](./data-bridges.md#add-forwarding-with-sinks-action)：結果をMQTTサービス、Kafka、PostgreSQLなどの外部データシステムに送信する。

EMQXダッシュボードでのルール作成手順については、[ルールの作成](./rule-get-started.md)をご参照ください。

## ルールSQLの例

ルールSQLは、ルールのデータソースを指定し、データ処理の手順を定義するために使用します。以下はSQL文の例です。

```sql
SELECT
    payload.data as d
FROM
    "t/#"
WHERE
    clientid = 'foo'
```

上記SQL文では、

- データソース：トピック`t/#`のメッセージ
- データ処理：メッセージ送信者のクライアントIDが`foo`の場合、メッセージ内容の`data`フィールドを抽出し、新しい変数`d`に割り当てる

::: tip

`.`構文はデータがJSONまたはMap形式であることが前提です。別のデータ型の場合は、SQL関数を用いてデータ型変換を行う必要があります。

:::

ルールSQL文の形式や使い方の詳細は、[SQLマニュアル](./rule-sql-syntax.md)をご参照ください。

## ルールの典型的な適用シナリオ

- **アクション監視**：スマートホームのインテリジェントロック開発において、ネットワーク障害や電源切れ、破壊行為によりロックがオフラインになると機能異常が発生します。ルールでオフラインイベントを監視し、障害情報をアプリケーションサービスにプッシュすることで、アクセス層での即時障害検知を実現できます。
- **データフィルタリング**：コネクテッドビークルのトラック車両管理では、車両センサーが大量の運行データを収集・報告します。アプリケーションプラットフォームは車速が40km/hを超えた場合のデータのみを重視します。この場合、ルールで条件付きフィルタリングを行い、関連データだけを業務用メッセージキューに書き込みます。
- **メッセージルーティング**：スマート課金アプリケーションでは、端末デバイスが異なるトピックで業務種別を区別します。ルールを設定することで、課金関連メッセージを課金用メッセージキューに振り分け、端末到着時に業務システムへ確認通知を送信します。非課金情報は他のメッセージキューに振り分けることで、業務メッセージのルーティング設定を実現します。
- **メッセージのエンコード／デコード**：他のパブリック／プライベートTCPプロトコルアクセスや産業用途では、ルール内のローカル処理機能（EMQX上でカスタム開発可能）を用いてバイナリや特殊フォーマットのメッセージボディをエンコード／デコードします。メッセージをルール経由でサーバーレス関数などの外部計算リソースにルーティングし（ユーザー開発可能）、業務アプリケーションが扱いやすいJSON形式に変換することも可能です。これにより、プロジェクトの統合難易度を軽減し、迅速なアプリケーション開発・提供を支援します。

## 主なメリット

EMQXのルールエンジン機能は、ユーザーに以下のメリットを提供します。

**データ処理の簡素化**

SQLライクな構文とストリーム処理機能により、カスタムコードや追加ツールなしでデータのフィルタリング、変換、配信を効率化します。

**リアルタイムの洞察とアクション**

特定条件に基づくアクションのトリガーにより、リアルタイムの洞察取得と適切な対応を可能にします。

**開発時間と労力の削減**

豊富な組み込み機能を備え、カスタムコードやメンテナンスの負担を軽減してIoTアプリケーション開発を支援します。

**スケーラビリティと信頼性**

高スループットと多数の接続デバイスに対応できる設計で、性能や信頼性を損なうことなくIoTソリューションのスケールアップを実現します。
