TKK_E32231503/SOLUSI_DATA_TIDAK_MASUK_MYS...

415 lines
7.9 KiB
Markdown

# 🔧 SOLUSI: Data ESP32 Tidak Masuk ke MySQL Railway
## 🎯 Masalah
ESP32 sudah publish data ke MQTT, tapi data **tidak masuk ke MySQL** di Railway.
---
## 🔍 Penyebab
### Arsitektur yang Salah:
```
❌ SEBELUM:
ESP32 → HiveMQ (broker.hivemq.com)
(data hilang di sini)
Backend Railway (Aedes Broker Internal - DISABLED)
MySQL (tidak ada data)
```
**Masalah:**
1. ESP32 publish ke **HiveMQ** public broker
2. Backend Railway menggunakan **Aedes** (MQTT broker internal)
3. Aedes **DISABLED** di Railway (tidak bisa bind port 1883)
4. Backend **TIDAK connect** ke HiveMQ
5. Backend **TIDAK subscribe** ke topic ESP32
6. **Data hilang** karena tidak ada yang terima
---
## ✅ Solusi
### Arsitektur yang Benar:
```
✅ SESUDAH:
ESP32 → HiveMQ (broker.hivemq.com)
Backend Railway (MQTT Client)
↓ (subscribe & save)
MySQL Database
```
**Perubahan:**
1. Backend connect ke **HiveMQ sebagai MQTT Client**
2. Backend **subscribe** ke topic ESP32
3. Backend **terima data** dari ESP32
4. Backend **save ke MySQL**
---
## 🛠️ Perubahan yang Sudah Dilakukan
### 1. **Install Package MQTT Client**
```bash
npm install mqtt
```
### 2. **Update `server.js`**
- Tambah import `mqtt` client
- Connect ke HiveMQ sebagai client
- Subscribe ke topic: `novil/pengering/data`, `status`, `button`
- Handle message dan save ke MySQL
- Publish command via HiveMQ
### 3. **Update `.env`**
- Tambah `MQTT_BROKER_URL=mqtt://broker.hivemq.com:1883`
- Tambah template untuk MySQL credentials
---
## 🚀 Cara Deploy
### 1. **Test Lokal (Optional)**
```bash
cd backend
npm install
npm start
```
**Expected Output:**
```
✅ Connected to MQTT Broker (HiveMQ)
✅ Subscribed to topics:
- novil/pengering/data
- novil/pengering/status
- novil/pengering/button
🚀 REST API running on port 3000
```
### 2. **Push ke GitHub**
```bash
cd backend
git add .
git commit -m "Fix: Backend connect to HiveMQ as MQTT client"
git push
```
### 3. **Configure Railway**
Di Railway Dashboard:
1. Buka project → **Variables**
2. Tambahkan variable baru:
- **Key:** `MQTT_BROKER_URL`
- **Value:** `mqtt://broker.hivemq.com:1883`
3. MySQL credentials sudah otomatis dari Railway MySQL Plugin (tidak perlu diubah)
### 4. **Wait for Auto-Deploy**
Railway akan otomatis deploy setelah push ke GitHub.
---
## 🧪 Testing
### 1. **Check MQTT Connection**
```bash
curl https://your-app.railway.app/api/stats
```
**Expected Response:**
```json
{
"success": true,
"stats": {
"mqttConnected": true, // ← HARUS TRUE
"sensorDataCount": 0,
"statusHistoryCount": 0,
...
}
}
```
**Jika `mqttConnected: false`:**
- Check Railway logs
- Pastikan `MQTT_BROKER_URL` sudah ditambahkan
- Redeploy
---
### 2. **Test dengan ESP32**
1. **Upload sketch ESP32** (tidak perlu diubah)
2. **Buka Serial Monitor** (115200 baud)
3. **Tekan button** untuk start pengeringan
4. **Tunggu 5 detik** (scan berat)
5. **Check Serial Monitor:**
```
MQTT Data Sent: {"suhu":28.5,"berat":450,"target":315}
MQTT Data Sent: {"suhu":28.6,"berat":448,"target":315}
```
---
### 3. **Check Data di MySQL**
```bash
curl https://your-app.railway.app/api/data/latest
```
**Expected Response:**
```json
{
"success": true,
"data": {
"suhu": 28.5,
"berat": 450.0,
"target": 315.0,
"status": "RUNNING",
"timestamp": "2026-05-28T10:30:00.000Z"
}
}
```
**Jika data masih kosong:**
- Check Railway logs untuk error
- Pastikan ESP32 sudah publish data
- Check MySQL credentials
---
### 4. **Check History**
```bash
curl https://your-app.railway.app/api/data/history?limit=10
```
**Expected Response:**
```json
{
"success": true,
"count": 10,
"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"
},
...
]
}
```
---
### 5. **Test Send Command**
```bash
curl -X POST https://your-app.railway.app/api/control \
-H "Content-Type: application/json" \
-d '{"command":"HEATER_ON"}'
```
**Expected Response:**
```json
{
"success": true,
"message": "Command sent successfully",
"command": "HEATER_ON"
}
```
**Check ESP32 Serial Monitor:**
```
MQTT Message [novil/pengering/control] : HEATER_ON
HEATER ON
```
---
## 📊 Monitoring
### Railway Logs
Di Railway Dashboard → Deployments → View Logs
**Expected Logs:**
```
🔄 Connecting to MQTT Broker: mqtt://broker.hivemq.com:1883
✅ Connected to MQTT Broker (HiveMQ)
✅ Subscribed to topics:
- novil/pengering/data
- novil/pengering/status
- novil/pengering/button
📨 MQTT Message received:
Topic: novil/pengering/data
Message: {"suhu":28.5,"berat":450,"target":315}
✅ Data saved to MySQL database
📨 MQTT Message received:
Topic: novil/pengering/status
Message: PENGERINGAN DIMULAI
✅ Status saved to MySQL database
```
---
## 🔍 Troubleshooting
### Problem 1: `mqttConnected: false`
**Penyebab:** Backend tidak bisa connect ke HiveMQ
**Solusi:**
1. Check Railway logs untuk error message
2. Pastikan variable `MQTT_BROKER_URL` sudah ditambahkan
3. Pastikan value: `mqtt://broker.hivemq.com:1883` (bukan `http://`)
4. Redeploy
---
### Problem 2: Data masih tidak masuk ke MySQL
**Penyebab:** Database credentials salah atau database belum diinit
**Solusi:**
1. **Test database connection:**
```bash
curl https://your-app.railway.app/api/database/test
```
2. **Initialize database tables:**
```bash
curl -X POST https://your-app.railway.app/api/database/init
```
3. **Check MySQL credentials di Railway:**
- `MYSQLHOST`
- `MYSQLPORT`
- `MYSQLUSER`
- `MYSQLPASSWORD`
- `MYSQLDATABASE`
---
### Problem 3: ESP32 tidak terima command
**Penyebab:** ESP32 tidak subscribe atau MQTT disconnect
**Solusi:**
1. **Check ESP32 Serial Monitor:**
```
MQTT Connected
Subscribed to: novil/pengering/control
```
2. **Restart ESP32**
3. **Check WiFi connection**
---
### Problem 4: Railway logs error "Cannot find module 'mqtt'"
**Penyebab:** Package `mqtt` belum terinstall
**Solusi:**
1. **Pastikan `package.json` sudah update:**
```json
"dependencies": {
"mqtt": "^5.3.5",
...
}
```
2. **Push ke GitHub lagi:**
```bash
git add package.json
git commit -m "Add mqtt package"
git push
```
---
## ✅ Checklist
### Pre-Deploy:
- [x] Package `mqtt` sudah ditambahkan di `package.json`
- [x] `server.js` sudah diupdate dengan MQTT client
- [x] `.env` sudah ada template MySQL credentials
- [x] `npm install` berhasil
### Deploy:
- [ ] Push ke GitHub
- [ ] Tambahkan `MQTT_BROKER_URL` di Railway Variables
- [ ] Wait for auto-deploy (2-3 menit)
- [ ] Check Railway logs untuk "Connected to MQTT Broker"
### Testing:
- [ ] Test `/api/stats``mqttConnected: true`
- [ ] Upload ESP32 sketch
- [ ] Test ESP32 publish data
- [ ] Test `/api/data/latest` → ada data
- [ ] Test `/api/data/history` → ada history
- [ ] Test send command → ESP32 terima
---
## 📝 Catatan Penting
1. **ESP32 tidak perlu diubah** - sketch tetap sama
2. **MySQL credentials** sudah otomatis dari Railway MySQL Plugin
3. **HiveMQ** adalah public broker, gratis, tidak perlu registrasi
4. **Backend sekarang sebagai MQTT Client**, bukan broker
5. **Aedes broker tetap ada** tapi disabled (untuk future use)
---
## 🎯 Expected Result
Setelah deploy:
1. ✅ Backend connect ke HiveMQ
2. ✅ Backend subscribe ke topic ESP32
3. ✅ ESP32 publish data → Backend terima
4. ✅ Backend save data ke MySQL
5. ✅ Data history tersimpan
6. ✅ Status history tersimpan
7. ✅ Command dari Flutter → ESP32 berfungsi
---
## 📞 Support
Jika masih ada masalah:
1. **Check Railway Logs** untuk error detail
2. **Check ESP32 Serial Monitor** untuk MQTT status
3. **Test API endpoints** untuk verify data
4. **Baca dokumentasi lengkap** di `backend/FIX_MQTT_MYSQL.md`
---
Selamat mencoba! 🚀🎉