MQTT×Supabase農業IoTダッシュボード:収集から可視化まで


MQTT×Supabase農業IoTダッシュボード:収集から可視化まで

はじめに:農業IoTにおけるデータ活用の重要性

水耕栽培の収量と品質を安定させるには、環境データのリアルタイム把握が欠かせません。EC値(養液濃度)、pH、水温、CO2濃度といった指標がわずかにずれるだけで、植物の成長速度や品質は大きく変化します。

Optiensでは、Raspberry Pi 4Bを中心としたIoTシステムでこれらのデータを24時間収集し、MQTT(Mosquitto)→ Python → Supabaseというパイプラインでクラウドに蓄積・可視化しています。本記事では、その技術的な仕組みを詳しく解説します。


MQTTとは:IoTの標準プロトコル

MQTT(Message Queuing Telemetry Transport)は、IoTデバイス間の通信に特化した軽量プロトコルです。TCP/IP上で動作し、以下の特徴を持ちます。

  • Pub/Subモデル: センサー(Publisher)がトピックにデータを発行し、サーバー(Subscriber)が購読
  • 低帯域・低消費電力: センサーデバイスへの負荷が最小限
  • QoS対応: 通信品質(0/1/2)を用途に応じて選択可能

OptiensではMosquitto(オープンソースのMQTTブローカー)をRaspberry Pi上で動かし、全センサーデータの中継点として使用しています。

トピック設計

センサー種別ごとにトピックを分割し、可読性とスケーラビリティを確保しています。

optiens/sensors/ec          # EC値(mS/cm)
optiens/sensors/ph          # pH値
optiens/sensors/water_temp  # 水温(℃)
optiens/sensors/air_temp    # 気温(℃)
optiens/sensors/humidity    # 湿度(%)
optiens/sensors/co2         # CO2濃度(ppm)
optiens/sensors/lux         # 照度(lux)
optiens/control/pump        # ポンプ制御コマンド
optiens/control/led         # LED制御コマンド

センサー値はJSON形式のペイロードで送信します。

{
  "value": 1.85,
  "timestamp": "2026-03-25T09:30:00+09:00",
  "unit": "mS/cm"
}

タイムスタンプをデバイス側で付与することで、ブローカー側でのデータ欠損を防ぎます。


Supabaseへのデータ蓄積

Supabaseは、PostgreSQLをベースにしたオープンソースのBaaSです。無料枠でも以下の機能が使えます。

  • PostgreSQLデータベース: 構造化データの長期蓄積
  • リアルタイムサブスクリプション: WebSocketでダッシュボードへ即時反映
  • REST API / JavaScript SDK: クライアントからのシンプルなアクセス

テーブル設計

時系列データの読み取り性能を重視したシンプルな設計にしています。

CREATE TABLE sensor_readings (
  id          BIGSERIAL PRIMARY KEY,
  sensor_type TEXT        NOT NULL,   -- 'ec', 'ph', 'water_temp' など
  value       NUMERIC     NOT NULL,
  unit        TEXT,
  recorded_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

-- 時系列クエリの高速化
CREATE INDEX ON sensor_readings (sensor_type, recorded_at DESC);

将来的に栽培エリアが複数になった場合は、zone_id カラムを追加することで同一スキーマのまま拡張できます。

MQTTブリッジスクリプト

Pythonスクリプトでメッセージをサブスクライブし、Supabaseに書き込みます。paho-mqttsupabase-py を使用します。

import json
import paho.mqtt.client as mqtt
from supabase import create_client

SUPABASE_URL = "https://xxxx.supabase.co"
SUPABASE_KEY = "your-anon-key"
MQTT_BROKER  = "localhost"

supabase = create_client(SUPABASE_URL, SUPABASE_KEY)
client   = mqtt.Client()

TOPIC_MAP = {
    "optiens/sensors/ec":         ("ec",         "mS/cm"),
    "optiens/sensors/ph":         ("ph",         ""),
    "optiens/sensors/water_temp": ("water_temp", "℃"),
    "optiens/sensors/air_temp":   ("air_temp",   "℃"),
    "optiens/sensors/humidity":   ("humidity",   "%"),
    "optiens/sensors/co2":        ("co2",        "ppm"),
    "optiens/sensors/lux":        ("lux",        "lux"),
}

def on_message(client, userdata, msg):
    if msg.topic in TOPIC_MAP:
        sensor_type, unit = TOPIC_MAP[msg.topic]
        payload = json.loads(msg.payload)
        supabase.table("sensor_readings").insert({
            "sensor_type": sensor_type,
            "value":       payload["value"],
            "unit":        unit,
            "recorded_at": payload.get("timestamp"),
        }).execute()

client.on_message = on_message
client.connect(MQTT_BROKER, 1883)
for topic in TOPIC_MAP:
    client.subscribe(topic)
client.loop_forever()

このスクリプトをsystemdサービスとして登録することで、Raspberry Pi起動時に自動的にデータ収集が開始されます。障害時の自動再起動設定(Restart=on-failure)を加えることで、運用の信頼性が向上します。


リアルタイムダッシュボードの構築

Supabaseのリアルタイム機能(WebSocket)を利用して、センサーデータの変化をブラウザに即時反映します。

構成:

  • フロントエンド: Astro + Chart.js
  • 更新方式: Supabase Realtime(INSERT イベントを購読)
  • 表示項目: 現在値カード、24時間トレンドグラフ、アラートバナー

アラート条件の例:

センサー下限上限アクション
EC値1.5 mS/cm2.5 mS/cm養液補充・交換を通知
pH5.57.0pH調整液の添加を通知
水温15℃28℃ヒーター/冷却ファン制御
CO2400 ppm1500 ppm換気ファン制御

アラートはMQTT経由でRaspberry Piに制御コマンドとして送返し、デバイスが自律的に応答します。


Optiensでの設計目標

Phase 1(自宅テスト栽培)では、60秒間隔でのセンサーデータ収集を目標にパイプラインを構築中です。

  • 1日あたりの想定レコード数: 約10,000件(7センサー × 1,440回/日)
  • 累積データ量(想定): 3ヶ月でSupabaseの無料枠(500MB)の10%未満に収まる計算
  • 活用予定: 水温とEC値の日変動からポンプ稼働サイクルとの相関を分析し、施肥タイミングの最適化に活用する

稼働後はClaude Code(AI)のMCP経由で自然言語クエリに対応する予定です。「今週のEC値の平均は?」「昨日pHが急変した時間帯は?」といった問い合わせにAIが即座に回答し、栽培管理を支援します。

Phase 2以降は複数の栽培エリアに同一アーキテクチャで展開予定です。スケーラビリティを意識した設計が、今後の拡張コストを抑える鍵になります。


まとめ:農業IoTデータパイプラインの設計指針

MQTT + Supabaseの組み合わせは、農業IoTのデータパイプラインとして高い実用性を持っています。

要素採用技術採用理由
ブローカーMosquitto軽量・Raspberry Piで安定稼働
データ蓄積SupabasePostgreSQL互換・リアルタイム・無料枠あり
ブリッジPython (paho-mqtt)豊富なライブラリ・RPiとの親和性
可視化Astro + Chart.js軽量・静的サイト生成で高速表示

農業IoTは「センサーをつなぐ」だけでなく、収集したデータをどう活用するかが本質的な価値を生みます。適切なデータパイプライン設計が、AIによる意思決定支援の品質を左右します。

センサーから収穫まで、すべてをデータで繋ぐ。Optiensが目指す農業のDXは、こうした技術の積み重ねから始まります。


参考資料:

  • Eclipse Mosquitto — An open source MQTT broker
  • Supabase Documentation — Database, Realtime, Auth
  • Eclipse Paho — MQTT Python Client Library