TKK_E32230814/SOLUSI_PENJADWALAN.md

309 lines
8.0 KiB
Markdown

# 🚨 SOLUSI LENGKAP: Penjadwalan Tidak Masuk Railway
## 📋 HASIL ANALISIS
### ✅ Yang SUDAH BENAR:
1. **Flutter Code** - Data penjadwalan ditulis dengan benar ke Firebase
2. **Worker Code** - Logic membaca dan execute sudah benar
3. **Format Data** - Compatible antara Flutter dan Worker
4. **Git Repository** - railway-worker sudah di-commit dan push
### ❌ KEMUNGKINAN MASALAH:
1. **Railway Root Directory belum di-set**
2. **Environment Variables belum lengkap/salah**
3. **Redis service belum di-add ke Railway**
4. **Data penjadwalan belum di-set dari Flutter**
---
## 🔧 LANGKAH PERBAIKAN (STEP-BY-STEP)
### **STEP 1: Verifikasi Data Di Firebase Console**
1. Buka [Firebase Console](https://console.firebase.google.com)
2. Pilih project: **project-ta-951b4**
3. Klik **Realtime Database** di sidebar
4. Cek path `/kontrol/`
**Yang HARUS ADA:**
```json
{
"kontrol": {
"waktu": true, MUST BE TRUE!
"waktu_1": "07:30", Format HH:mm string
"waktu_2": "17:00", Format HH:mm string
"durasi_1": 60, Integer (seconds)
"durasi_2": 60, Integer (seconds)
"otomatis": false,
"batas_bawah": 40,
"batas_atas": 100
}
}
```
**Jika data TIDAK ADA atau `waktu` = false:**
- Buka Flutter app
- Masuk ke **Kontrol Waktu**
- Set jadwal
- **Toggle "Aktif" menjadi ON**
- Klik **Simpan**
---
### **STEP 2: Test Firebase Connection Dari Local**
Di folder railway-worker, buat file `.env`:
```bash
cd f:\ApsGo\ApsGo\railway-worker
```
Create `.env` file (copy dari .env.example):
```env
FIREBASE_PROJECT_ID=project-ta-951b4
FIREBASE_CLIENT_EMAIL=firebase-adminsdk-xxxxx@project-ta-951b4.iam.gserviceaccount.com
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nYourKeyHere\n-----END PRIVATE KEY-----\n"
FIREBASE_DATABASE_URL=https://project-ta-951b4-default-rtdb.firebaseio.com
```
**Cara dapat Firebase credentials:**
1. Firebase Console → Project Settings
2. Service Accounts tab
3. Klik "Generate New Private Key"
4. Download JSON file
5. Copy value dari JSON:
- `project_id` → FIREBASE_PROJECT_ID
- `client_email` → FIREBASE_CLIENT_EMAIL
- `private_key` → FIREBASE_PRIVATE_KEY (ganti \n dengan \\n)
- Database URL bisa dari Realtime Database page
**Test connection:**
```powershell
cd railway-worker
npm install
node test-firebase-connection.js
```
**Expected output:**
```
✅ Firebase initialized
✅ DATA FOUND! Structure:
✅ DATA STRUCTURE VALID
✅ WAKTU MODE ENABLED
```
**Jika error:**
- Check credentials (terutama PRIVATE_KEY format)
- Pastikan Database URL benar
- Pastikan Firebase Rules mengizinkan read/write
---
### **STEP 3: Setup Railway - Root Directory**
1. **Login ke Railway:** https://railway.app
2. **Select Project:** mellow-cat
3. **Select Service:** myreppril
4. **Klik tab "Settings"**
5. **Scroll ke section "Build"**
6. **Cari field "Root Directory"**
7. **Isi dengan:** `railway-worker`
8. **Save** (auto-save)
**PENTING:** Tanpa ini, Railway akan build dari root folder dan gagal!
---
### **STEP 4: Add Redis Database**
1. Di Railway project dashboard
2. Klik tombol **"+ New"**
3. Pilih **"Database"**
4. Pilih **"Add Redis"**
5. Tunggu provisioning selesai
Railway akan auto-inject environment variables:
- `REDIS_HOST`
- `REDIS_PORT`
- `REDIS_PASSWORD`
---
### **STEP 5: Set Environment Variables**
Di Railway → Service myreppril → Tab **"Variables"**
**ADD THESE:**
| Variable Name | Value |
|--------------|-------|
| `FIREBASE_PROJECT_ID` | `project-ta-951b4` |
| `FIREBASE_CLIENT_EMAIL` | `firebase-adminsdk-xxxxx@project-ta-951b4.iam.gserviceaccount.com` |
| `FIREBASE_PRIVATE_KEY` | `-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----` |
| `FIREBASE_DATABASE_URL` | `https://project-ta-951b4-default-rtdb.firebaseio.com` |
**⚠️ PENTING untuk PRIVATE_KEY:**
- Harus dalam format string dengan `\n` (backslash-n), BUKAN newline sebenarnya
- Contoh: `-----BEGIN PRIVATE KEY-----\nMIIEvQIBADA...\n-----END PRIVATE KEY-----\n`
- Copy dari JSON file service account, tapi ganti newline dengan `\n`
**Cara mudah:**
```javascript
// Di PowerShell atau Node.js console
const fs = require('fs');
const key = JSON.parse(fs.readFileSync('service-account.json')).private_key;
console.log(key); // Ini sudah format dengan \n
```
---
### **STEP 6: Redeploy Railway**
1. Setelah set Root Directory & Variables
2. Klik tab **"Deployments"**
3. Klik **"Redeploy"** atau biarkan auto-deploy
4. Tunggu build selesai (2-3 menit)
---
### **STEP 7: Monitor Logs**
1. Klik tab **"Logs"** (di navigation bar atas)
2. Enable "Follow logs" (toggle di kanan atas)
**Expected logs saat startup:**
```
🚀 Starting ApsGo Railway Worker...
📡 Firebase Project: project-ta-951b4
📦 Redis: redis.railway.internal:6379
✅ Firebase Admin initialized
✅ Redis connected
✅ Waktu Mode scheduler started (check every 30s)
✅ Sensor Mode monitoring started
✨ ApsGo Railway Worker is running!
```
**Jika ada error:**
- `Firebase initialization failed` → Check credentials
- `Redis error` → Pastikan Redis database sudah di-add
- `Cannot find module` → Check Root Directory setting
---
### **STEP 8: Test Penjadwalan**
**Cara 1: Set jadwal dekat waktu sekarang**
1. Buka Flutter app
2. Kontrol Waktu → Set Jadwal 1 = (waktu sekarang + 2 menit)
3. Durasi = 10 detik
4. **Toggle "Aktif" = ON**
5. Simpan
6. Tunggu 2 menit
7. Cek Railway logs
**Expected di logs:**
```
🕐 JADWAL 1 TRIGGERED: 14:30
📌 Added to queue: jadwal_1_2026-02-10_14:30
💧 Processing Job: jadwal_1_...
Type: waktu_jadwal_1
Pots: [1, 2, 3, 4, 5]
Duration: 10s
🔛 Turning ON: mosvet_1, mosvet_3, mosvet_4, mosvet_5, mosvet_6, mosvet_7
⏳ Waiting 10s...
🔚 Turning OFF: mosvet_1, mosvet_3, mosvet_4, mosvet_5, mosvet_6, mosvet_7
✅ Worker completed job jadwal_1_...
📊 History logged: 2026-02-10 14:30
```
**Cara 2: Check Firebase langsung**
1. Firebase Console → Realtime Database
2. Monitor path `/kontrol/waktu`
3. Monitor path `/aktuator/` (harus berubah dari false → true → false)
---
## 🐛 TROUBLESHOOTING CHECKLIST
### ❌ "No logs at all in Railway"
- [ ] Root directory = `railway-worker`?
- [ ] Environment variables complete?
- [ ] Redis database added?
- [ ] Check Deployments tab for build errors
### ❌ "Logs show but no schedule triggers"
- [ ] Firebase `/kontrol/waktu` = true?
- [ ] Jadwal sudah di-set di Flutter?
- [ ] Format waktu benar (HH:mm string)?
- [ ] Current time match jadwal?
### ❌ "Firebase initialization failed"
- [ ] FIREBASE_PRIVATE_KEY format benar (dengan \n)?
- [ ] SERVICE_ACCOUNT email benar?
- [ ] Database URL benar?
- [ ] Firebase Rules allow read/write?
### ❌ "Redis connection error"
- [ ] Redis database sudah di-add di Railway?
- [ ] REDIS_HOST/PORT/PASSWORD auto-injected?
---
## 📊 CARA CEK DATA FIREBASE DARI FLUTTER
Tambahkan button debug di Flutter (temporary):
```dart
ElevatedButton(
onPressed: () async {
final data = await FirebaseDatabase.instance.ref('kontrol').get();
print('KONTROL DATA: ${data.value}');
},
child: Text('Debug: Print Kontrol Data'),
)
```
Check debug console untuk melihat data yang tersimpan.
---
## 🎯 QUICK TEST SCRIPT
Jalankan dari terminal:
```powershell
# Test 1: Check Firebase data
cd f:\ApsGo\ApsGo\railway-worker
node test-firebase-connection.js
# Test 2: Check queue (if worker running)
node check-queue.js
```
---
## 📞 LANGKAH SELANJUTNYA
Setelah mengikuti STEP 1-8:
1. **Screenshot Railway Logs** yang muncul
2. **Screenshot Firebase Console** (path /kontrol/)
3. **Screenshot Railway Settings** (Root Directory & Variables)
Dengan screenshot tersebut, saya bisa bantu troubleshoot lebih lanjut jika masih ada masalah!
---
## ✅ CHECKLIST FINAL
Sebelum test:
- [ ] Data jadwal ada di Firebase `/kontrol/`
- [ ] `waktu` = true di Firebase
- [ ] Railway root directory = `railway-worker`
- [ ] 4 Firebase env variables di Railway
- [ ] Redis database added di Railway
- [ ] Worker logs muncul di Railway
- [ ] Jadwal set 2-3 menit dari sekarang untuk test
**Jika semua checked, penjadwalan PASTI jalan!**