TKK_E32231503/backend/PERUBAHAN_BACKEND.md

6.5 KiB

🔄 Perubahan Backend untuk ESP32

Perubahan yang Dilakukan

1. Update MQTT Handler di server.js

Handler untuk novil/pengering/data

Sebelum:

// Hanya parse JSON dan simpan
latestData = { ...data, timestamp: new Date().toISOString() };

Sesudah:

// Parse JSON dengan field yang sesuai ESP32
latestData = {
  suhu: data.suhu || 0,
  berat: data.berat || 0,
  target: data.target || 0,
  relay1: false,  // Akan diupdate dari status
  relay2: false,
  relay3: false,
  relay4: false,
  status: latestData.status,
  timestamp: new Date().toISOString()
};

Alasan: ESP32 hanya kirim suhu, berat, target (tidak kirim relay status)


Handler untuk novil/pengering/status

Ditambahkan: Auto-update status berdasarkan pesan

if (message.includes('ESP32 CONNECTED')) {
  latestData.status = 'CONNECTED';
} else if (message.includes('PENGERINGAN SIAP')) {
  latestData.status = 'READY';
} else if (message.includes('PENGERINGAN DIMULAI')) {
  latestData.status = 'RUNNING';
} else if (message.includes('PENGERINGAN BERJALAN')) {
  latestData.status = 'RUNNING';
} else if (message.includes('PENGERINGAN SELESAI')) {
  latestData.status = 'COMPLETED';
} else if (message.includes('SCAN BERAT')) {
  latestData.status = 'SCANNING';
} else if (message.includes('DHT ERROR')) {
  latestData.status = 'ERROR';
}

Alasan: Status otomatis terupdate sesuai pesan dari ESP32


Handler untuk novil/pengering/button (BARU)

Ditambahkan: Handler untuk event button

if (topic === 'novil/pengering/button') {
  console.log('🔘 Button Event:', message);
  await db.insertStatusHistory(`BUTTON: ${message}`);
}

Alasan: ESP32 publish event button press ke topic ini


2. Update Endpoint /api/control

Ditambahkan: Command START dan RESET

const validCommands = [
  'HEATER_ON', 'HEATER_OFF',
  'FAN_ON', 'FAN_OFF',
  'LAMP_ON', 'LAMP_OFF',
  'EXHAUST_ON', 'EXHAUST_OFF',
  'START',  // ← BARU
  'RESET'   // ← BARU
];

Alasan: Flutter bisa start/reset pengeringan via API


3. Fix Timestamp Format di database.js

Sebelum:

data.timestamp || new Date()  // ❌ Format ISO tidak diterima MySQL

Sesudah:

const date = new Date(data.timestamp);
const mysqlTimestamp = date.toISOString().slice(0, 19).replace('T', ' ');
// Hasil: '2026-05-28 10:30:00' ✅

Alasan: MySQL DATETIME tidak terima format ISO dengan 'Z'


📡 MQTT Topics yang Digunakan

Topic Direction Format Keterangan
novil/pengering/data ESP32 → Backend JSON Data sensor (suhu, berat, target)
novil/pengering/status ESP32 → Backend String Status/event penting
novil/pengering/button ESP32 → Backend String Event button press
novil/pengering/control Backend → ESP32 String Command kontrol relay/sistem

🌐 REST API Endpoints

Endpoint untuk Flutter App:

  1. GET /api/data/latest - Ambil data terbaru
  2. GET /api/data/history?limit=50 - Ambil riwayat data
  3. GET /api/status/history?limit=50 - Ambil riwayat status
  4. POST /api/control - Kirim command (START, RESET, HEATER_ON, dll)
  5. GET /api/stats - Ambil statistik
  6. DELETE /api/history/clear - Hapus riwayat

Endpoint untuk Testing:

  1. GET / - Health check
  2. POST /api/database/init - Init database (sekali saja)
  3. GET /api/database/test - Test koneksi database

🔄 Flow Komunikasi

ESP32 → Backend (via MQTT)

ESP32 publish:
├── novil/pengering/data      → Data sensor setiap 1 detik
├── novil/pengering/status    → Status/event penting
└── novil/pengering/button    → Event button press

Backend:
├── Terima via MQTT
├── Update latestData
└── Simpan ke MySQL

Flutter → ESP32 (via Backend)

Flutter:
└── POST /api/control {"command":"HEATER_ON"}

Backend:
├── Terima REST API
├── Simpan command ke database
└── Publish ke MQTT: novil/pengering/control

ESP32:
└── Subscribe novil/pengering/control
    └── Eksekusi command (nyalakan relay)

🚀 Cara Deploy

1. Push ke GitHub

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

2. Railway Auto-Deploy

Railway akan otomatis detect perubahan dan deploy ulang.

3. Test Endpoint

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

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

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

📝 Catatan Penting

Yang Sudah Kompatibel:

  • MQTT topics sesuai dengan ESP32
  • Format data JSON sesuai
  • Command START dan RESET tersedia
  • Status auto-update dari pesan ESP32
  • Timestamp format MySQL sudah fix

⚠️ Yang Perlu Diperhatikan:

  1. ESP32 tidak kirim relay status di topic data

    • Backend tidak bisa tahu relay ON/OFF dari data
    • Solusi: Tracking relay status di backend saat kirim command
  2. MQTT Broker

    • ESP32 pakai: broker.hivemq.com (public)
    • Railway mungkin tidak bisa host MQTT broker sendiri
    • Solusi: Tetap pakai HiveMQ public atau upgrade Railway plan
  3. Database Connection

    • Pastikan Railway MySQL sudah setup
    • Environment variables harus diisi:
      • DB_HOST
      • DB_PORT
      • DB_USER
      • DB_PASSWORD
      • DB_NAME

🧪 Testing Checklist

  • ESP32 connect ke MQTT broker
  • ESP32 publish data ke novil/pengering/data
  • Backend terima dan simpan data ke MySQL
  • ESP32 publish status ke novil/pengering/status
  • Backend update status otomatis
  • Flutter kirim command via /api/control
  • ESP32 terima command dari novil/pengering/control
  • Relay ON/OFF sesuai command
  • Flutter ambil data via /api/data/latest
  • Flutter ambil history via /api/data/history

📚 File yang Berubah

  1. server.js - Update MQTT handlers dan endpoint
  2. database.js - Fix timestamp format
  3. API_DOCUMENTATION.md - Dokumentasi lengkap API (BARU)
  4. PERUBAHAN_BACKEND.md - Ringkasan perubahan (BARU)

🎯 Next Steps

  1. Push ke GitHub dan deploy ke Railway
  2. Test ESP32 connection
  3. Update Flutter app untuk pakai endpoint baru
  4. Test end-to-end flow

Selamat mencoba! 🚀