# Supabase に MQTT データを取り込む

Supabase は、開発者が迅速にアプリケーションを構築・デプロイできるよう設計されたオープンソースの Backend as a Service（BaaS）プラットフォームです。リアルタイムデータベース、ユーザー認証、ファイルストレージなどのバックエンド機能を提供します。

Supabase はオープンソースソフトウェアとして公開されています。プロジェクトの詳細や Supabase オープンソースコミュニティへの参加は、[GitHub](https://github.com/supabase/supabase)をご覧ください。

本ドキュメントでは、Supabase を MQTT サーバーに接続し、EMQX Cloud のデータ統合を使って MQTT メッセージを処理・変換し、Supabase のデータベースに書き込む方法について説明します。

## はじめに

このセクションでは、EMQX Cloud で Supabase のデータ統合を作成するために必要な準備について説明します。

### 前提条件

以下の内容に慣れていることを前提とします。

- [データ統合](./introduction.md) の基本概念と使い方
- [ルール](./rules.md) の基本原理と設定方法

### ネットワーク設定

EMQX Cloud が Supabase サービスに正常にアクセスできるように、デプロイ管理ページの **ネットワーク管理** で **NAT ゲートウェイ** 機能を有効にしてください。詳細は[こちら](../vas/nat-gateway.md)を参照してください。

### Supabase のデプロイ

Supabase は以下の2つのデプロイモードをサポートしています。

- セルフホスト型デプロイ
- マネージドクラウドデプロイ

本チュートリアルでは、マネージドクラウドデプロイを対象とします。セルフホスト型デプロイが必要な場合は、[Supabase ドキュメント – セルフホスティング](https://supabase.com/docs/guides/self-hosting)を参照してください。

1. [Supabase コンソール](https://supabase.com/dashboard/sign-in)にアクセスし、登録とログインを完了します。

2. 画面の指示に従い、組織とプロジェクトを作成します。

   ![Supabase Project](_assets/supabase_project.png)

3. ビジネス要件に応じてデータベーステーブルを作成します。

   本チュートリアルでは、コネクテッドビークルのシナリオを例に、車両の経度、緯度、速度、バッテリーレベル、モーター温度、記録タイムスタンプを格納する **車両リアルタイムデータテーブル** を作成します。

   ![Table Columns](_assets/supabase_columns.png)

### 接続パラメータの取得

Supabase は3つのデータベース接続方法を提供しています。

- 直接接続
- トランザクションプーラー
- セッションプーラー

直接接続は無料プランで IPv6 ドメインのみサポートしていますが、EMQX Cloud は現在 IPv4 DNS 解決のみ対応しています。そのため、**IPv4 アドオン**を有効にするか、トランザクションプーラーまたはセッションプーラーを代替として利用してください。

本チュートリアルでは **セッションプーラー** を例に説明します。プロジェクトページ上部の **Connect** ボタンをクリックし、接続情報を表示してコネクター作成に必要なパラメータを取得します。

![Connection](_assets/supabase_connection.png)

## コネクターの作成

EMQX Cloud では、PostgreSQL コネクターを使って Supabase データベースにアクセスできます。

1. デプロイの **データ統合** ページに移動し、**PostgreSQL** を選択します。既に他のコネクターが存在する場合は、**新規コネクター** をクリックしてから **PostgreSQL** を選択してください。

2. 先ほど取得した接続パラメータを使ってコネクターを設定します。**パスワード** は Supabase プロジェクト作成時に設定したデータベースのパスワードです。

   ![Supabase Connector](_assets/supabase_connector.png)

3. 暗号化接続を確立したい場合は、**TLS を有効にする** スイッチをオンにします。

4. **接続テスト** をクリックし、PostgreSQL サービスにアクセス可能であれば成功メッセージが表示されます。

5. **作成** をクリックしてコネクター作成を完了します。

## ルールの作成

このセクションでは、EMQX Cloud で MQTT トピック `test/vehicle` からリアルタイムの車両データメッセージを処理し、PostgreSQL Sink を使って処理済みデータを Supabase データベースに書き込むルールの作成方法を説明します。

1. コネクター一覧の **アクション** 列にある **ルール作成** アイコンをクリックするか、**ルール** ページの **ルール作成** をクリックしてルール作成ワークフローに入ります。

2. SQL エディターに以下のルール SQL を入力します。

   ```sql
   SELECT
     payload.vehicle_id        AS vehicle_id,
     payload.longitude         AS longitude,
     payload.latitude          AS latitude,
     payload.speed             AS speed,
     payload.battery_level     AS battery_level,
     payload.motor_temperature AS motor_temperature
   FROM
     "test/vehicle"
   ```

   :::

   SQL を初めて使う場合は、**SQL Examples** をクリックするか、**Try It Out** を有効にしてルール SQL の結果を学習・テストできます。

   :::

3. **次へ** をクリックして、PostgreSQL Sink を含むアクションを作成します。

4. **コネクター** のドロップダウンリストから、先ほど作成した PostgreSQL（Supabase）コネクターを選択します。

5. **SQL テンプレート** に、処理済みデータを Supabase テーブルに挿入するための以下の SQL を入力します。

   これは前処理用の SQL 文です。フィールド名はクォートせず、SQL 文の末尾にセミコロン（`;`）を付けないでください。

   ```sql
   INSERT INTO vehicle_realtime_data (
     vehicle_id,
     longitude,
     latitude,
     speed,
     battery_level,
     motor_temperature
   )
   VALUES (
     ${vehicle_id},
     ${longitude},
     ${latitude},
     ${speed},
     ${battery_level},
     ${motor_temperature}
   )
   ```

6. 必要に応じて詳細オプションを設定します（任意）。

7. **確認** をクリックしてアクション設定を完了します。

8. **新規ルール作成成功** ダイアログで **ルールに戻る** をクリックし、データ統合の設定を完了します。

9. **Flowデザイナー** で完成したデータパイプラインを確認できます。

   ![Flow](_assets/supabase_flow.png)

## ルールのテスト

[MQTTX](https://mqttx.app/) を使って車両データのパブリッシュをシミュレートすることを推奨します。他の MQTT クライアントを使用しても構いません。

1. MQTTX でデプロイに接続し、事前に定義したトピック（例：`test/vehicle`）に車両リアルタイムデータメッセージをパブリッシュします。

   ![MQTTX](_assets/supabase_mqttx.png)

2. Supabase のテーブルエディターで、新たにパブリッシュされたデータが正常にテーブルに挿入されていることを確認できます。

   ![Table Result](_assets/supabase_table_result.png)

## さらに詳しく

これで Supabase と EMQX Cloud の連携が完了し、MQTT メッセージを処理・変換して Supabase に書き込むことが可能になりました。

Supabase の機能について詳しくは、[Supabase ドキュメント](https://supabase.com/docs)をご覧ください。

また、[GitHub](https://github.com/emqx/MQTT-Client-Examples)では、さまざまなプログラミング言語の MQTT クライアント例も公開されています。
