383 lines
8.0 KiB
Markdown
383 lines
8.0 KiB
Markdown
# 📡 API Documentation - Pengering Ikan Backend
|
|
|
|
## 🔌 Koneksi
|
|
|
|
### MQTT Broker
|
|
- **Host:** `broker.hivemq.com` (public) atau Railway URL (jika deploy)
|
|
- **Port:** `1883` (TCP) atau `8883` (WebSocket)
|
|
- **Client ID:** `ESP32_PENGERING` (untuk ESP32)
|
|
|
|
### REST API
|
|
- **Base URL:** `https://web-production-47eb.up.railway.app`
|
|
- **Local:** `http://localhost:3000`
|
|
|
|
---
|
|
|
|
## 📨 MQTT Topics
|
|
|
|
### 1. **novil/pengering/data** (ESP32 → Backend)
|
|
ESP32 publish data sensor setiap 1 detik saat pengeringan berjalan.
|
|
|
|
**Format:**
|
|
```json
|
|
{
|
|
"suhu": 28.5,
|
|
"berat": 450.0,
|
|
"target": 315.0
|
|
}
|
|
```
|
|
|
|
**Field:**
|
|
- `suhu` (float): Suhu dalam Celsius
|
|
- `berat` (float): Berat saat ini dalam gram
|
|
- `target` (float): Target berat akhir dalam gram
|
|
|
|
---
|
|
|
|
### 2. **novil/pengering/status** (ESP32 → Backend)
|
|
ESP32 publish status/event penting.
|
|
|
|
**Format:** Plain text string
|
|
|
|
**Contoh pesan:**
|
|
- `"ESP32 CONNECTED"` - ESP32 berhasil connect
|
|
- `"PENGERINGAN SIAP"` - Mode ready
|
|
- `"PENGERINGAN DIMULAI"` - Pengeringan mulai
|
|
- `"SCAN BERAT..."` - Sedang scan berat ikan
|
|
- `"PENGERINGAN BERJALAN - Awal:500g Target:350g"` - Berat tersimpan
|
|
- `"PENGERINGAN SELESAI"` - Target tercapai
|
|
- `"DHT ERROR"` - Sensor DHT error
|
|
|
|
---
|
|
|
|
### 3. **novil/pengering/button** (ESP32 → Backend)
|
|
ESP32 publish event button press.
|
|
|
|
**Format:** Plain text string
|
|
|
|
**Contoh pesan:**
|
|
- `"BUTTON PRESSED"` - Button ditekan
|
|
- `"START_BUTTON"` - Button untuk start
|
|
- `"RESET_BUTTON"` - Button untuk reset
|
|
|
|
---
|
|
|
|
### 4. **novil/pengering/control** (Backend → ESP32)
|
|
Backend/Flutter publish command untuk kontrol relay dan sistem.
|
|
|
|
**Format:** Plain text string
|
|
|
|
**Valid Commands:**
|
|
- `"HEATER_ON"` - Nyalakan heater (RELAY1)
|
|
- `"HEATER_OFF"` - Matikan heater
|
|
- `"FAN_ON"` - Nyalakan fan (RELAY2)
|
|
- `"FAN_OFF"` - Matikan fan
|
|
- `"LAMP_ON"` - Nyalakan lamp (RELAY3)
|
|
- `"LAMP_OFF"` - Matikan lamp
|
|
- `"EXHAUST_ON"` - Nyalakan exhaust (RELAY4)
|
|
- `"EXHAUST_OFF"` - Matikan exhaust
|
|
- `"START"` - Mulai pengeringan (dari aplikasi)
|
|
- `"RESET"` - Reset ke mode ready (dari aplikasi)
|
|
|
|
---
|
|
|
|
## 🌐 REST API Endpoints
|
|
|
|
### 1. **GET /** - Health Check
|
|
Cek status server.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"status": "OK",
|
|
"message": "Pengering Ikan Backend Server",
|
|
"version": "1.0.0",
|
|
"uptime": 12345.67,
|
|
"timestamp": "2026-05-28T10:30:00.000Z"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 2. **GET /api/data/latest** - Get Latest Data
|
|
Ambil data sensor terbaru.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"data": {
|
|
"suhu": 28.5,
|
|
"berat": 450.0,
|
|
"target": 315.0,
|
|
"relay1": true,
|
|
"relay2": true,
|
|
"relay3": true,
|
|
"relay4": false,
|
|
"status": "RUNNING",
|
|
"timestamp": "2026-05-28T10:30:00.000Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Status Values:**
|
|
- `CONNECTED` - ESP32 terhubung
|
|
- `READY` - Siap untuk pengeringan
|
|
- `RUNNING` - Pengeringan berjalan
|
|
- `SCANNING` - Sedang scan berat
|
|
- `COMPLETED` - Pengeringan selesai
|
|
- `ERROR` - Ada error
|
|
|
|
---
|
|
|
|
### 3. **GET /api/data/history?limit=50** - Get Data History
|
|
Ambil riwayat data sensor.
|
|
|
|
**Query Parameters:**
|
|
- `limit` (optional): Jumlah data (default: 50)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"count": 50,
|
|
"data": [
|
|
{
|
|
"id": 1,
|
|
"suhu": 28.5,
|
|
"berat": 450.0,
|
|
"target": 315.0,
|
|
"relay1": true,
|
|
"relay2": true,
|
|
"relay3": true,
|
|
"relay4": false,
|
|
"status": "RUNNING",
|
|
"timestamp": "2026-05-28 10:30:00"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 4. **GET /api/status/history?limit=50** - Get Status History
|
|
Ambil riwayat status/event.
|
|
|
|
**Query Parameters:**
|
|
- `limit` (optional): Jumlah data (default: 50)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"count": 50,
|
|
"data": [
|
|
{
|
|
"id": 1,
|
|
"message": "PENGERINGAN DIMULAI",
|
|
"timestamp": "2026-05-28 10:30:00"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 5. **POST /api/control** - Send Control Command
|
|
Kirim command ke ESP32 via MQTT.
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"command": "HEATER_ON"
|
|
}
|
|
```
|
|
|
|
**Valid Commands:**
|
|
- `HEATER_ON`, `HEATER_OFF`
|
|
- `FAN_ON`, `FAN_OFF`
|
|
- `LAMP_ON`, `LAMP_OFF`
|
|
- `EXHAUST_ON`, `EXHAUST_OFF`
|
|
- `START` (mulai pengeringan)
|
|
- `RESET` (reset ke ready)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Command sent successfully",
|
|
"command": "HEATER_ON"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 6. **GET /api/stats** - Get Statistics
|
|
Ambil statistik server dan database.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"stats": {
|
|
"connectedClients": 2,
|
|
"sensorDataCount": 1234,
|
|
"statusHistoryCount": 567,
|
|
"controlCommandsCount": 89,
|
|
"latestData": { ... },
|
|
"uptime": 12345.67,
|
|
"timestamp": "2026-05-28T10:30:00.000Z"
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 7. **DELETE /api/history/clear** - Clear History
|
|
Hapus semua riwayat data.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "History cleared successfully"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 8. **POST /api/database/init** - Initialize Database
|
|
Buat tabel database (hanya perlu sekali).
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Database tables initialized successfully"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### 9. **GET /api/database/test** - Test Database Connection
|
|
Test koneksi ke MySQL.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"message": "Database connection successful"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 🔄 Flow Komunikasi
|
|
|
|
### Skenario 1: Pengeringan Normal (via Button ESP32)
|
|
|
|
1. **ESP32 Connect**
|
|
- ESP32 → MQTT: `novil/pengering/status` = `"ESP32 CONNECTED"`
|
|
- Backend: Update status = `CONNECTED`
|
|
|
|
2. **User Tekan Button (Ready → Start)**
|
|
- ESP32 → MQTT: `novil/pengering/button` = `"START_BUTTON"`
|
|
- ESP32 → MQTT: `novil/pengering/status` = `"PENGERINGAN DIMULAI"`
|
|
- Backend: Update status = `RUNNING`
|
|
|
|
3. **Scan Berat Ikan**
|
|
- ESP32 → MQTT: `novil/pengering/status` = `"SCAN BERAT..."`
|
|
- Backend: Update status = `SCANNING`
|
|
|
|
4. **Berat Tersimpan**
|
|
- ESP32 → MQTT: `novil/pengering/status` = `"PENGERINGAN BERJALAN - Awal:500g Target:350g"`
|
|
- Backend: Update status = `RUNNING`
|
|
|
|
5. **Kirim Data Sensor (setiap 1 detik)**
|
|
- ESP32 → MQTT: `novil/pengering/data` = `{"suhu":28.5,"berat":450,"target":315}`
|
|
- Backend: Simpan ke database
|
|
|
|
6. **Target Tercapai**
|
|
- ESP32 → MQTT: `novil/pengering/status` = `"PENGERINGAN SELESAI"`
|
|
- Backend: Update status = `COMPLETED`
|
|
|
|
7. **User Tekan Button (Selesai → Ready)**
|
|
- ESP32 → MQTT: `novil/pengering/button` = `"RESET_BUTTON"`
|
|
- ESP32 → MQTT: `novil/pengering/status` = `"PENGERINGAN SIAP"`
|
|
- Backend: Update status = `READY`
|
|
|
|
---
|
|
|
|
### Skenario 2: Kontrol dari Flutter App
|
|
|
|
1. **Flutter Subscribe MQTT**
|
|
- Subscribe: `novil/pengering/data`
|
|
- Subscribe: `novil/pengering/status`
|
|
- Terima data real-time
|
|
|
|
2. **Flutter Kirim Command START**
|
|
- Flutter → API: `POST /api/control` body: `{"command":"START"}`
|
|
- Backend → MQTT: `novil/pengering/control` = `"START"`
|
|
- ESP32: Terima command, mulai pengeringan
|
|
|
|
3. **Flutter Kirim Command HEATER_ON**
|
|
- Flutter → API: `POST /api/control` body: `{"command":"HEATER_ON"}`
|
|
- Backend → MQTT: `novil/pengering/control` = `"HEATER_ON"`
|
|
- ESP32: Nyalakan RELAY1
|
|
|
|
4. **Flutter Get Latest Data**
|
|
- Flutter → API: `GET /api/data/latest`
|
|
- Backend: Return data terbaru
|
|
|
|
---
|
|
|
|
## 🛠️ Testing dengan cURL
|
|
|
|
### Test Health Check
|
|
```bash
|
|
curl https://web-production-47eb.up.railway.app/
|
|
```
|
|
|
|
### Test Get Latest Data
|
|
```bash
|
|
curl https://web-production-47eb.up.railway.app/api/data/latest
|
|
```
|
|
|
|
### Test Send Command
|
|
```bash
|
|
curl -X POST https://web-production-47eb.up.railway.app/api/control \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"command":"HEATER_ON"}'
|
|
```
|
|
|
|
### Test Get History
|
|
```bash
|
|
curl https://web-production-47eb.up.railway.app/api/data/history?limit=10
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 Catatan Penting
|
|
|
|
1. **ESP32 hanya menggunakan MQTT**, tidak ada HTTP request ke Railway
|
|
2. **Flutter bisa menggunakan:**
|
|
- MQTT untuk real-time data (subscribe topics)
|
|
- REST API untuk kontrol dan history
|
|
3. **Backend menerima data dari ESP32 via MQTT** dan menyimpan ke MySQL
|
|
4. **Semua command dari Flutter dikirim via REST API**, backend forward ke ESP32 via MQTT
|
|
|
|
---
|
|
|
|
## 🚀 Deploy ke Railway
|
|
|
|
Setelah perubahan, push ke GitHub:
|
|
|
|
```bash
|
|
cd backend
|
|
git add .
|
|
git commit -m "Update backend untuk ESP32 MQTT integration"
|
|
git push
|
|
```
|
|
|
|
Railway akan auto-deploy! ✅
|