# ๐Ÿ”ง 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! ๐Ÿš€๐ŸŽ‰