TKK_E32231503/backend/API_DOCUMENTATION.md

8.0 KiB

📡 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:

{
  "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:

{
  "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:

{
  "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:

{
  "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:

{
  "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:

{
  "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:

{
  "success": true,
  "message": "Command sent successfully",
  "command": "HEATER_ON"
}

6. GET /api/stats - Get Statistics

Ambil statistik server dan database.

Response:

{
  "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:

{
  "success": true,
  "message": "History cleared successfully"
}

8. POST /api/database/init - Initialize Database

Buat tabel database (hanya perlu sekali).

Response:

{
  "success": true,
  "message": "Database tables initialized successfully"
}

9. GET /api/database/test - Test Database Connection

Test koneksi ke MySQL.

Response:

{
  "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

curl https://web-production-47eb.up.railway.app/

Test Get Latest Data

curl https://web-production-47eb.up.railway.app/api/data/latest

Test Send Command

curl -X POST https://web-production-47eb.up.railway.app/api/control \
  -H "Content-Type: application/json" \
  -d '{"command":"HEATER_ON"}'

Test Get History

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:

cd backend
git add .
git commit -m "Update backend untuk ESP32 MQTT integration"
git push

Railway akan auto-deploy!