React + Go + PostgreSQL + MQTT + Docker Compose + M5Stack Fire を使った IoT Web アプリのサンプルです。
このリポジトリでは、以下をローカルで再現できます。
- Web UI でデバイス一覧、テレメトリ、コマンド履歴を確認
- Go API で MQTT メッセージを受け取り DB に保存
- Mosquitto を使った MQTT Broker 運用
- M5Stack Fire からの
telemetry/heartbeat/cmd/cmd_ack - Web UI からの
LED_SET/SAMPLING_INTERVAL_SET
M5Stack Fire 実機で telemetry / heartbeat / cmd / cmd_ack の4経路を確認済みです。コマンド履歴の SENT / ACK / FAIL / TIMEOUT 更新、および Wi-Fi / MQTT 再接続後の復帰も確認済みです。
- Frontend: React + TypeScript
- Backend: Go (
net/http) - Database: PostgreSQL
- Broker: Eclipse Mosquitto
- Infra: Docker Compose
- Device: M5Stack Fire
このリポジトリは Windows + WSL2 + Docker Desktop を前提にしています。
最低限必要なもの:
- Windows 11 または Windows 10
- WSL2
- Ubuntu などの WSL ディストリビューション
- Visual Studio Code
- Git
- Docker Desktop
- Arduino IDE
PowerShell を管理者で開いて、WSL をインストールします。
wsl --installインストール後、PC の再起動を求められた場合は再起動してください。
WSL の状態確認:
wsl -l -vVERSION が 2 になっていれば OK です。
Ubuntu を初回起動したら、ユーザー名とパスワードを設定してください。
Windows 側に Visual Studio Code をインストールしてください。
- ダウンロード: https://code.visualstudio.com/
インストール後、以下の拡張機能を入れておくと扱いやすいです。
WSLDocker
- VS Code を起動
- 左下の緑色のアイコンをクリック
Connect to WSLを選択- WSL に接続した状態で
File->Open Folder...を選ぶ - あとで clone したフォルダを開く
この README に出てくるコマンドは、基本的に次の2種類です。
powershellと書いてあるもの: Windows の PowerShell で実行bashと書いてあるもの: WSL の Ubuntu ターミナルで実行
VS Code を WSL 接続で開いている場合、Terminal -> New Terminal で開くターミナルは通常 bash です。以後の bash コマンドはそこで実行できます。
WSL のターミナルで Git を入れます。
sudo apt update
sudo apt install -y git任意ですが、Git のユーザー設定もしておくと扱いやすいです。
git config --global user.name "YOUR_NAME"
git config --global user.email "YOUR_EMAIL@example.com"リポジトリを clone します。
cd ~
git clone https://github.com/iorithe2009/M5stack-IoT-Web-fox.git
cd M5stack-IoT-Web-foxWSL 接続済みの VS Code で、以下のどちらかで開いてください。
方法 1:
cd ~/M5stack-IoT-Web-fox
code .方法 2:
- VS Code の
File->Open Folder... /home/<あなたのユーザー名>/M5stack-IoT-Web-foxを選択
Windows 側で Docker Desktop をインストールしてください。
- ダウンロード: https://www.docker.com/products/docker-desktop/
- インストール後、Docker Desktop を起動
- Settings で WSL Integration を有効化
確認ポイント:
Settings->Generalで Docker Desktop が起動しているSettings->Resources->WSL Integrationで使用するディストリビューションを有効化
WSL 側で Docker が使えるか確認します。
docker --version
docker compose version
docker psエラーが出なければ準備完了です。
リポジトリ直下で以下を実行します。
docker compose up --build初回はイメージのビルドに少し時間がかかります。
起動後のアクセス先:
- Web: http://localhost:3000
- API 動作確認: http://localhost:8080/api/hello
バックグラウンドで起動したい場合:
docker compose up -d --build停止:
docker compose downVS Code のターミナルで上の docker compose up --build を実行できます。
起動後、VS Code を使っている場合は Docker 拡張機能の Containers 一覧から対象コンテナを右クリックして Open in Browser を使うと開きやすいです。
まずは API が応答するか確認します。
curl http://localhost:8080/api/helloデバイス一覧 API 確認:
curl http://localhost:8080/api/devices| メソッド | URL | 機能 |
|---|---|---|
| GET | /api/hello |
文字列を返す |
| GET | /api/messages |
DB のメッセージ一覧 |
| POST | /api/messages |
DB にメッセージ追加 |
| GET | /api/devices |
IoT デバイス一覧(online 状態・最新値) |
| GET | /api/devices/{device_key}/telemetry |
テレメトリ履歴(?metric=temp&duration=1h) |
| POST | /api/devices/{device_key}/commands |
コマンド送信(LED_SET / SAMPLING_INTERVAL_SET) |
| GET | /api/devices/{device_key}/commands |
コマンド履歴取得(?limit=20) |
| WS | /ws |
リアルタイム Push(device_state_changed / device_event / command_updated) |
M5Stack がなくても、まずは MQTT publish で API 連携を確認できます。
docker compose exec mqtt mosquitto_pub -h localhost -p 1883 \
-t "iot/m5-001/telemetry" \
-m '{"ts":"2026-03-09T12:00:00Z","metrics":{"temp":26.1,"ax":0.02},"unit":{"temp":"C","ax":"g"}}'docker compose exec mqtt mosquitto_pub -h localhost -p 1883 \
-t "iot/m5-001/heartbeat" \
-m '{"ts":"2026-03-09T12:00:00Z","fw":"1.0.0","ip":"192.168.0.10"}'curl -X POST http://localhost:8080/api/devices/m5-001/commands \
-H "Content-Type: application/json" \
-d '{"commandType":"LED_SET","payload":{"ledOn":true}}'curl http://localhost:8080/api/devices/m5-001/commands?limit=20- Arduino IDE をインストール
- Arduino IDE のボードマネージャ URL に以下を追加
https://m5stack.oss-cn-shenzhen.aliyuncs.com/resource/arduino/package_m5stack_index.json
- ライブラリマネージャから以下をインストール
M5UnifiedAdafruit NeoPixelPubSubClientArduinoJson
m5_stack/secrets.h.example をコピーして m5_stack/secrets.h を作成します。
cp m5_stack/secrets.h.example m5_stack/secrets.hsecrets.h を開いて以下を設定してください。
| 項目 | 説明 |
|---|---|
WIFI_SSID |
接続する Wi-Fi の SSID |
WIFI_PASSWORD |
Wi-Fi のパスワード |
MQTT_HOST |
Windows ホストの LAN IP アドレス |
MQTT_PORT |
MQTT ポート。通常は 1883 |
DEVICE_KEY |
サーバー側と一致させるデバイス ID。例: m5-001 |
M5Stack は LAN 上の外部デバイスなので、MQTT_HOST には WSL2 の 172.x.x.x ではなく、Windows ホストの LAN IP を設定してください。
Windows 側で確認:
ipconfig出力例:
IPv4 Address. . . . . . . . . . . : 192.168.11.20
この 192.168.11.20 を MQTT_HOST に設定します。
m5_stack/phase4_m5stack_fire_sample.inoを Arduino IDE で開く- ボードを
M5Stack-Fireに設定 - M5Stack Fire を USB 接続する
- 正しいシリアルポートを選ぶ
- 書き込みを実行する
telemetryを 10 秒ごとに送信heartbeatを 5 秒ごとに送信LED_SETを受信して LED を ON/OFFSAMPLING_INTERVAL_SETを受信して送信周期を変更cmd_ackを返却BtnA: LED ローカルトグルBtnB: telemetry 即時送信BtnC: heartbeat 即時送信
- Docker Desktop が起動しているか確認
- WSL Integration が有効か確認
docker psが動くか確認
MQTT_HOSTに WSL の IP を入れていないか確認- Windows ホストの LAN IP を設定しているか確認
- M5Stack と PC が同じネットワークにいるか確認
1883ポートにアクセスできるか確認
docker compose logs apiを確認- MQTT テスト publish を実行して DB / API まで流れるか確認
device_keyがm5-001で揃っているか確認
m5_stack/secrets.hは.gitignoreで除外されています- この公開版リポジトリには内部設計メモや作業計画書は含めていません
- 公開内容は再現用サンプルと実装コードを中心に整理しています