242 lines
6.5 KiB
Markdown
242 lines
6.5 KiB
Markdown
# 🐛 Debugging Guide - Railway Worker
|
||
|
||
## Masalah yang Ditemukan
|
||
|
||
### 1️⃣ **Log Scheduler Tidak Muncul**
|
||
|
||
**Penyebab:**
|
||
- Kondisi logging `now.getSeconds() < 60` tidak efektif
|
||
- Interval check 60 detik tidak sinkron dengan menit yang tepat
|
||
- Tidak ada konfirmasi bahwa fungsi `checkScheduledWatering()` berjalan
|
||
|
||
**Solusi:**
|
||
✅ Tambah counter untuk track setiap check
|
||
✅ Log setiap kali fungsi dipanggil: `⏱️ CHECK #X`
|
||
✅ Log detail setiap 3 check atau setiap 5 menit
|
||
✅ Jalankan check pertama kali setelah 5 detik (tidak tunggu 60 detik)
|
||
|
||
---
|
||
|
||
### 2️⃣ **Aktuator Tidak Trigger**
|
||
|
||
**Kemungkinan Penyebab:**
|
||
- Node `/aktuator` tidak ada di Firebase
|
||
- Format waktu tidak match dengan jadwal
|
||
- Queue tidak menjalankan job
|
||
- Firebase update gagal tanpa error log
|
||
|
||
**Solusi:**
|
||
✅ Validasi node aktuator saat startup
|
||
✅ Log verbose untuk setiap Firebase update
|
||
✅ Verify state aktuator setelah update
|
||
✅ Log queue status (active/waiting jobs)
|
||
|
||
---
|
||
|
||
## 📊 Log Baru yang Akan Muncul
|
||
|
||
### Saat Startup (5 detik pertama):
|
||
```
|
||
🔧 RUNNING DIAGNOSTIC CHECKS...
|
||
🕐 CURRENT TIME ANALYSIS:
|
||
Server Local: Wed Feb 11 2026 10:20:05 GMT+0700
|
||
Asia/Jakarta: 11/2/2026, 10.20.05
|
||
TZ Env: Asia/Jakarta
|
||
HH:MM Format: 10:20
|
||
|
||
📋 FIREBASE KONTROL:
|
||
Mode Waktu: ENABLED ✅
|
||
Waktu 1: 10:18
|
||
Waktu 2: 09:00
|
||
|
||
🔍 CHECKING AKTUATOR NODE...
|
||
✅ Aktuator node exists:
|
||
mosvet_1: false
|
||
mosvet_2: false
|
||
...
|
||
|
||
🚀 Running first schedule check immediately...
|
||
```
|
||
|
||
### Setiap 60 Detik:
|
||
```
|
||
⏱️ CHECK #1: 10:20:15 | Mode: ✅
|
||
⏱️ CHECK #2: 10:21:15 | Mode: ✅
|
||
⏱️ CHECK #3: 10:22:15 | Mode: ✅
|
||
📅 Date: 2026-02-11
|
||
🕐 Current: 10:22 (11/2/2026, 10.22.15)
|
||
Mode Waktu: ✅ ENABLED
|
||
Jadwal 1: 10:18
|
||
Jadwal 2: 09:00
|
||
```
|
||
|
||
### Saat Jadwal Match:
|
||
```
|
||
⏱️ CHECK #8: 10:25:00 | Mode: ✅
|
||
📅 Date: 2026-02-11
|
||
🕐 Current: 10:25 (11/2/2026, 10.25.00)
|
||
Mode Waktu: ✅ ENABLED
|
||
Jadwal 1: 10:25 🔔 MATCH!
|
||
Jadwal 2: 09:00
|
||
|
||
🕐 JADWAL 1 TRIGGERED: 10:25
|
||
🎯 Attempting to add job to queue...
|
||
✅ Successfully added to queue: jadwal_1_2026-02-11_10:25
|
||
📊 Queue status: 1 active, 0 waiting
|
||
|
||
💧 Processing Job: jadwal_1_2026-02-11_10:25
|
||
Type: waktu_jadwal_1
|
||
Pots: [1, 2, 3, 4, 5]
|
||
Duration: 300s
|
||
🔛 Turning ON: mosvet_1, mosvet_2, mosvet_3, mosvet_4, mosvet_5, mosvet_6, mosvet_7
|
||
📌 Firebase path: aktuator
|
||
📝 Updates: {
|
||
"mosvet_1": true,
|
||
"mosvet_2": true,
|
||
...
|
||
}
|
||
✅ Firebase update successful
|
||
🔍 Verified aktuator state: { ... }
|
||
⏳ 300s remaining...
|
||
⏳ 290s remaining...
|
||
...
|
||
```
|
||
|
||
### Saat Sensor Trigger:
|
||
```
|
||
🌡️ SENSOR CHECK #10 | Mode Otomatis: ✅
|
||
|
||
🌡️ SENSOR TRIGGERED: POT 1
|
||
Soil moisture: 35% < 40%
|
||
Mode: smart, Duration: 600s
|
||
📌 Added to queue: sensor-pot-1-...
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Cara Testing
|
||
|
||
### Test 1: Verifikasi Worker Berjalan
|
||
1. Check Railway logs untuk `CHECK #X` setiap menit
|
||
2. Pastikan counter naik: `CHECK #1, #2, #3...`
|
||
3. Jika tidak ada, worker crash atau interval tidak jalan
|
||
|
||
### Test 2: Test Jadwal Manual
|
||
1. Lihat log `CURRENT TIME ANALYSIS` untuk waktu saat ini
|
||
2. Set `waktu_1` di Firebase = waktu saat ini + 2 menit
|
||
- Contoh: Sekarang 10:30 → set `waktu_1: "10:32"`
|
||
3. Tunggu 2 menit
|
||
4. Harus muncul log `JADWAL 1 TRIGGERED: 10:32`
|
||
|
||
### Test 3: Verifikasi Queue
|
||
1. Saat jadwal trigger, cek log `Queue status:`
|
||
2. Pastikan ada `1 active` atau `1 waiting`
|
||
3. Kemudian lihat `Processing Job:` muncul
|
||
|
||
### Test 4: Verifikasi Firebase Aktuator
|
||
1. Saat job running, buka Firebase Console
|
||
2. Lihat node `/aktuator`
|
||
3. Pastikan mosvet yang relevan = `true`
|
||
4. Setelah durasi selesai, harus kembali `false`
|
||
|
||
---
|
||
|
||
## 🚨 Troubleshooting
|
||
|
||
### Problem: Log CHECK tidak muncul
|
||
**Diagnosis:** Worker crash atau interval tidak jalan
|
||
**Solution:**
|
||
- Check Railway logs untuk error
|
||
- Restart worker di Railway Dashboard
|
||
|
||
### Problem: CHECK muncul tapi tidak TRIGGERED
|
||
**Diagnosis:** Format waktu tidak match
|
||
**Solution:**
|
||
- Cek log detail (setiap 3 check): lihat "Current: HH:MM"
|
||
- Bandingkan dengan "Jadwal 1: HH:MM" di Firebase
|
||
- Pastikan format sama persis (2 digit: "09:00" bukan "9:00")
|
||
|
||
### Problem: TRIGGERED tapi tidak Processing
|
||
**Diagnosis:** Queue error atau Redis disconnect
|
||
**Solution:**
|
||
- Cek log `HEALTH CHECK` untuk Redis status
|
||
- Cek log `Successfully added to queue`
|
||
- Restart Redis service jika perlu
|
||
|
||
### Problem: Processing tapi aktuator tidak ON
|
||
**Diagnosis:** Firebase update gagal atau node tidak ada
|
||
**Solution:**
|
||
- Cek log `Firebase update successful`
|
||
- Cek log `Verified aktuator state`
|
||
- Lihat Firebase Console untuk konfirmasi nilai
|
||
|
||
---
|
||
|
||
## 📝 Checklist Debugging
|
||
|
||
- [ ] Worker menghasilkan log `CHECK #X` setiap menit
|
||
- [ ] Counter naik terus (tidak reset tanpa alasan)
|
||
- [ ] Mode Waktu menunjukkan ✅ ENABLED di Firebase
|
||
- [ ] Format waktu di log match dengan jadwal (HH:MM)
|
||
- [ ] Saat match, muncul "🔔 MATCH!"
|
||
- [ ] Muncul "JADWAL X TRIGGERED"
|
||
- [ ] Muncul "Successfully added to queue"
|
||
- [ ] Queue status menunjukkan job active/waiting
|
||
- [ ] Muncul "Processing Job:"
|
||
- [ ] Muncul "Firebase update successful"
|
||
- [ ] Muncul "Verified aktuator state"
|
||
- [ ] Node `/aktuator` di Firebase berubah nilai
|
||
- [ ] Setelah durasi, aktuator OFF dan muncul log history
|
||
|
||
---
|
||
|
||
## 🎯 Expected Behavior
|
||
|
||
**Normal Flow:**
|
||
1. Worker start → Diagnostic checks (5 detik)
|
||
2. First check immediately → CHECK #1
|
||
3. Check setiap 60 detik → CHECK #2, #3, #4...
|
||
4. Saat match → TRIGGERED
|
||
5. Add to queue → Queue status updated
|
||
6. Worker process job → Aktuator ON
|
||
7. Wait duration → Progress logs setiap 10s
|
||
8. Duration done → Aktuator OFF
|
||
9. Log history → Complete
|
||
|
||
**Timeline Example:**
|
||
```
|
||
10:20:05 - Worker start + diagnostics
|
||
10:20:10 - First check (CHECK #1)
|
||
10:21:10 - CHECK #2
|
||
10:22:10 - CHECK #3 (detail log)
|
||
10:23:10 - CHECK #4
|
||
10:24:10 - CHECK #5
|
||
10:25:10 - CHECK #6 (detail log) + JADWAL TRIGGERED!
|
||
10:25:15 - Job processing started
|
||
10:25:15 - Aktuator ON
|
||
10:30:15 - Aktuator OFF (after 300s)
|
||
10:30:15 - History logged
|
||
10:30:15 - Job completed
|
||
```
|
||
|
||
---
|
||
|
||
## 💡 Tips
|
||
|
||
1. **Monitor Railway logs secara real-time** saat testing
|
||
2. **Gunakan waktu + 2 menit** untuk test (beri waktu buffer)
|
||
3. **Cek Firebase Console** bersamaan dengan Railway logs
|
||
4. **Screenshot error logs** jika ada masalah untuk analisis
|
||
5. **Restart worker** setelah update kode atau environment variable
|
||
|
||
---
|
||
|
||
## 📞 Support
|
||
|
||
Jika masih ada masalah setelah ikuti guide ini:
|
||
1. Export Railway logs (10 menit terakhir)
|
||
2. Screenshot Firebase `/kontrol` node
|
||
3. Screenshot Firebase `/aktuator` node
|
||
4. Catat waktu test dilakukan
|
||
5. Dokumentasikan expected vs actual behavior
|