211 lines
5.2 KiB
Markdown
211 lines
5.2 KiB
Markdown
# 🔍 ANALISIS MASALAH PENJADWALAN
|
|
|
|
## ❌ MASALAH TERIDENTIFIKASI
|
|
|
|
### 1. **Railway Worker TIDAK TERINSTALL DI RAILWAY**
|
|
|
|
Dari screenshot Railway Anda sebelumnya:
|
|
- **Source Repo:** `awisnuu/myreppril`
|
|
- **Branch:** `main`
|
|
- **Root Directory:** TIDAK DI-SET
|
|
|
|
**PROBLEM:** Railway mencoba build dari root folder, tapi kode worker ada di subfolder `railway-worker/`
|
|
|
|
### 2. **File package.json Tidak Di-Push ke GitHub**
|
|
|
|
Railway membutuhkan:
|
|
- ✅ `worker.js`
|
|
- ✅ `package.json`
|
|
- ✅ `railway.json` atau root directory config
|
|
|
|
Kalau file tidak ada di GitHub repo, Railway tidak bisa build.
|
|
|
|
---
|
|
|
|
## ✅ YANG SUDAH BENAR
|
|
|
|
### Flutter Side (Sudah Oke ✓)
|
|
```dart
|
|
// waktu_config_page.dart line 578-583
|
|
await _dbService.updateKontrolConfig({
|
|
'waktu_1': _jadwalPenyiraman[0]['jamMulai'], // Format: "07:30"
|
|
'waktu_2': _jadwalPenyiraman[1]['jamMulai'], // Format: "17:00"
|
|
'durasi_1': durasi1Detik, // Dalam detik
|
|
'durasi_2': durasi2Detik, // Dalam detik
|
|
'waktu': _isWaktuModeActive, // true/false
|
|
});
|
|
```
|
|
|
|
**Path Firebase:** `/kontrol/`
|
|
- ✅ `waktu` = true/false (toggle mode)
|
|
- ✅ `waktu_1` = "07:30" (string HH:mm)
|
|
- ✅ `waktu_2` = "17:00" (string HH:mm)
|
|
- ✅ `durasi_1` = 60 (integer seconds)
|
|
- ✅ `durasi_2` = 60 (integer seconds)
|
|
|
|
### Worker Side (Sudah Oke ✓)
|
|
```javascript
|
|
// worker.js line 175-204
|
|
const kontrolConfig = snapshot.val();
|
|
if (!kontrolConfig || !kontrolConfig.waktu) return;
|
|
|
|
const currentTime = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}`;
|
|
|
|
// Check Jadwal 1
|
|
if (kontrolConfig.waktu_1 && kontrolConfig.waktu_1 === currentTime) {
|
|
// Trigger penyiraman
|
|
}
|
|
```
|
|
|
|
**Worker membaca path yang SAMA:** `/kontrol/`
|
|
- ✅ Format waktu cocok: "HH:mm"
|
|
- ✅ Check interval: 30 detik
|
|
- ✅ Debouncing: Prevent double trigger
|
|
|
|
---
|
|
|
|
## 🚨 ROOT CAUSE
|
|
|
|
**Railway worker TIDAK JALAN** karena:
|
|
|
|
### Issue #1: Root Directory Tidak Di-Set
|
|
Railway tidak tahu folder mana yang harus di-build.
|
|
|
|
**Solution:** Set Root Directory di Railway Settings:
|
|
```
|
|
railway-worker
|
|
```
|
|
|
|
### Issue #2: File Belum Di-Push ke GitHub
|
|
Worker files mungkin hanya ada di local, belum di-commit/push.
|
|
|
|
**Solution:**
|
|
```bash
|
|
git add railway-worker/
|
|
git commit -m "Add Railway worker for 24/7 scheduling"
|
|
git push origin main
|
|
```
|
|
|
|
### Issue #3: Environment Variables Belum Di-Set
|
|
Railway butuh Firebase credentials.
|
|
|
|
**Solution:** Add di Railway Variables:
|
|
- `FIREBASE_PROJECT_ID`
|
|
- `FIREBASE_CLIENT_EMAIL`
|
|
- `FIREBASE_PRIVATE_KEY`
|
|
- `FIREBASE_DATABASE_URL`
|
|
|
|
---
|
|
|
|
## 🎯 FORMAT DATA YANG BENAR
|
|
|
|
### Firebase `/kontrol/` Structure:
|
|
```json
|
|
{
|
|
"kontrol": {
|
|
"waktu": true, // ← Mode waktu ON/OFF
|
|
"waktu_1": "07:30", // ← Jadwal 1 (HH:mm string)
|
|
"waktu_2": "17:00", // ← Jadwal 2 (HH:mm string)
|
|
"durasi_1": 60, // ← Durasi 1 (seconds integer)
|
|
"durasi_2": 60, // ← Durasi 2 (seconds integer)
|
|
"otomatis": false, // ← Mode sensor ON/OFF
|
|
"batas_bawah": 40,
|
|
"batas_atas": 100
|
|
}
|
|
}
|
|
```
|
|
|
|
### Worker Logic:
|
|
```javascript
|
|
// Cek setiap 30 detik
|
|
if (kontrolConfig.waktu === true) {
|
|
const now = new Date();
|
|
const currentTime = "07:30"; // Format sama dengan waktu_1/waktu_2
|
|
|
|
if (kontrolConfig.waktu_1 === currentTime) {
|
|
// TRIGGER PENYIRAMAN
|
|
}
|
|
}
|
|
```
|
|
|
|
**✅ Format sudah MATCH antara Flutter dan Worker!**
|
|
|
|
---
|
|
|
|
## 🔧 LANGKAH PERBAIKAN
|
|
|
|
### Step 1: Push Worker Files ke GitHub
|
|
```bash
|
|
cd f:\ApsGo\ApsGo
|
|
git status
|
|
git add railway-worker/
|
|
git commit -m "Add Railway worker for 24/7 automation"
|
|
git push origin main
|
|
```
|
|
|
|
### Step 2: Set Root Directory di Railway
|
|
1. Railway Dashboard → Select service `myreppril`
|
|
2. Settings tab
|
|
3. Cari "Root Directory" atau "Build" section
|
|
4. Set: `railway-worker`
|
|
5. Save
|
|
|
|
### Step 3: Add Environment Variables
|
|
Di Railway Settings → Variables:
|
|
```
|
|
FIREBASE_PROJECT_ID=project-ta-a119e
|
|
FIREBASE_CLIENT_EMAIL=firebase-adminsdk-xxxxx@project-ta-a119e.iam.gserviceaccount.com
|
|
FIREBASE_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----
|
|
FIREBASE_DATABASE_URL=https://project-ta-a119e-default-rtdb.firebaseio.com
|
|
```
|
|
|
|
### Step 4: Redeploy
|
|
Railway akan auto-redeploy setelah:
|
|
- Root directory di-set
|
|
- Environment variables ditambahkan
|
|
|
|
### Step 5: Monitor Logs
|
|
Railway Logs → Harus muncul:
|
|
```
|
|
🚀 Starting ApsGo Railway Worker...
|
|
✅ Firebase Admin initialized
|
|
✅ Redis connected
|
|
✅ Waktu Mode scheduler started (check every 30s)
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 TESTING
|
|
|
|
### Test Manual:
|
|
1. Set jadwal di APK (misalnya 2 menit dari sekarang)
|
|
2. Pastikan `/kontrol/waktu` = true di Firebase
|
|
3. Tunggu 2 menit
|
|
4. Cek Railway logs → Harus ada:
|
|
```
|
|
🕐 JADWAL 1 TRIGGERED: 07:30
|
|
📌 Added to queue: jadwal_1
|
|
💧 Processing Job...
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 KESIMPULAN
|
|
|
|
### ✅ TIDAK ADA MASALAH DI:
|
|
- [x] Flutter code (sudah benar menulis ke Firebase)
|
|
- [x] Worker code (sudah benar membaca dari Firebase)
|
|
- [x] Format data (sudah compatible)
|
|
- [x] Path Firebase (sama-sama `/kontrol/`)
|
|
|
|
### ❌ MASALAH DI:
|
|
- [ ] Railway deployment (worker belum jalan)
|
|
- [ ] Root directory belum di-set
|
|
- [ ] Environment variables mungkin belum lengkap
|
|
|
|
### 🎯 ACTION REQUIRED:
|
|
1. Push railway-worker ke GitHub
|
|
2. Set root directory di Railway
|
|
3. Verify environment variables
|
|
4. Redeploy & monitor logs
|