8.8 KiB
🗓️ Panduan Sistem Penjadwalan Fleksibel
✨ Fitur Baru
Sistem penjadwalan sekarang fully flexible:
- ✅ Dynamic schedules: Tambah jadwal_1, jadwal_2, ... jadwal_N
- ✅ Per-schedule pot selection: Setiap jadwal bisa pilih pot mana yang aktif
- ✅ Per-schedule configuration: Tiap jadwal punya durasi & pompa sendiri
- ✅ Enable/Disable: Bisa matikan jadwal tanpa hapus data
- ✅ No code change needed: Tambah/ubah jadwal langsung di Firebase!
📋 Struktur Firebase Baru
Contoh Sesuai Kebutuhan User:
{
"kontrol": {
"waktu": true,
"jadwal_1": {
"aktif": true,
"waktu": "08:00",
"durasi": 60,
"pot_aktif": [1, 2, 3],
"pompa_air": true,
"pompa_pupuk": false
},
"jadwal_2": {
"aktif": true,
"waktu": "09:00",
"durasi": 45,
"pot_aktif": [4, 5],
"pompa_air": true,
"pompa_pupuk": true
},
"jadwal_3": {
"aktif": true,
"waktu": "16:00",
"durasi": 30,
"pot_aktif": [1, 2, 3, 4, 5],
"pompa_air": true,
"pompa_pupuk": true
}
}
}
Penjelasan Field:
| Field | Tipe | Wajib? | Default | Keterangan |
|---|---|---|---|---|
aktif |
boolean | ❌ | true |
Enable/disable jadwal |
waktu |
string | ✅ | - | Format "HH:MM" (24 jam) |
durasi |
number | ❌ | 60 |
Durasi penyiraman (detik) |
pot_aktif |
array | ✅ | - | Array pot yang aktif: [1, 2, 3] |
pompa_air |
boolean | ❌ | true |
Nyalakan pompa air |
pompa_pupuk |
boolean | ❌ | false |
Nyalakan pompa pupuk |
🚀 Cara Setup di Firebase
1. Buka Firebase Console
- Go to: https://console.firebase.google.com
- Pilih project ApsGo
- Klik Realtime Database
- Klik Data tab
2. Setup Struktur Awal
Klik di path /kontrol dan edit JSON:
{
"kontrol": {
"waktu": true,
"sensor": false,
"otomatis": true,
"jadwal_1": {
"aktif": true,
"waktu": "08:00",
"durasi": 60,
"pot_aktif": [1, 2, 3],
"pompa_air": true,
"pompa_pupuk": false
},
"jadwal_2": {
"aktif": true,
"waktu": "09:00",
"durasi": 45,
"pot_aktif": [4, 5],
"pompa_air": true,
"pompa_pupuk": true
},
"jadwal_3": {
"aktif": true,
"waktu": "16:00",
"durasi": 30,
"pot_aktif": [1, 2, 3, 4, 5],
"pompa_air": true,
"pompa_pupuk": true
}
}
}
3. Tambah Jadwal Baru
Untuk tambah jadwal baru, tinggal tambah jadwal_4, jadwal_5, dst:
"jadwal_4": {
"aktif": true,
"waktu": "12:00",
"durasi": 40,
"pot_aktif": [2, 4],
"pompa_air": true,
"pompa_pupuk": false
}
Tidak perlu restart worker! Worker akan otomatis detect jadwal baru.
4. Disable Jadwal Sementara
Ubah aktif jadi false:
"jadwal_3": {
"aktif": false,
"waktu": "16:00",
...
}
Jadwal tidak akan trigger, tapi data tetap tersimpan.
📱 Contoh Penggunaan
Skenario 1: Pagi & Sore
Kebutuhan:
- Pagi (08:00): Semua pot disirami
- Sore (16:00): Hanya pot 1, 3, 5
Setup:
"jadwal_1": {
"aktif": true,
"waktu": "08:00",
"durasi": 60,
"pot_aktif": [1, 2, 3, 4, 5],
"pompa_air": true,
"pompa_pupuk": false
},
"jadwal_2": {
"aktif": true,
"waktu": "16:00",
"durasi": 45,
"pot_aktif": [1, 3, 5],
"pompa_air": true,
"pompa_pupuk": true
}
Skenario 2: Per-Pot Berbeda
Kebutuhan:
- Pot 1 & 2: Pagi (07:00), Siang (12:00), Sore (17:00)
- Pot 3 & 4: Pagi (08:00), Sore (16:00)
- Pot 5: Hanya pagi (09:00)
Setup:
"jadwal_1": {
"aktif": true,
"waktu": "07:00",
"durasi": 60,
"pot_aktif": [1, 2],
"pompa_air": true,
"pompa_pupuk": false
},
"jadwal_2": {
"aktif": true,
"waktu": "08:00",
"durasi": 60,
"pot_aktif": [3, 4],
"pompa_air": true,
"pompa_pupuk": false
},
"jadwal_3": {
"aktif": true,
"waktu": "09:00",
"durasi": 60,
"pot_aktif": [5],
"pompa_air": true,
"pompa_pupuk": false
},
"jadwal_4": {
"aktif": true,
"waktu": "12:00",
"durasi": 45,
"pot_aktif": [1, 2],
"pompa_air": true,
"pompa_pupuk": true
},
"jadwal_5": {
"aktif": true,
"waktu": "16:00",
"durasi": 50,
"pot_aktif": [3, 4],
"pompa_air": true,
"pompa_pupuk": true
},
"jadwal_6": {
"aktif": true,
"waktu": "17:00",
"durasi": 40,
"pot_aktif": [1, 2],
"pompa_air": true,
"pompa_pupuk": false
}
Skenario 3: Testing
Kebutuhan: Test pot 3 saja setiap 15 menit
Setup:
"jadwal_test_1": {
"aktif": true,
"waktu": "09:00",
"durasi": 10,
"pot_aktif": [3],
"pompa_air": true,
"pompa_pupuk": false
},
"jadwal_test_2": {
"aktif": true,
"waktu": "09:15",
"durasi": 10,
"pot_aktif": [3],
"pompa_air": true,
"pompa_pupuk": false
},
"jadwal_test_3": {
"aktif": true,
"waktu": "09:30",
"durasi": 10,
"pot_aktif": [3],
"pompa_air": true,
"pompa_pupuk": false
}
🔍 Monitoring & Logs
Log yang Normal:
⏱️ CHECK #15: 08:00:05 | Mode: ✅
📋 Total Jadwal: 3
✅ jadwal_1: 08:00 → Pot [1, 2, 3] 🔔 MATCH!
✅ jadwal_2: 09:00 → Pot [4, 5]
✅ jadwal_3: 16:00 → Pot [1, 2, 3, 4, 5]
🕐 JADWAL_1 TRIGGERED: 08:00
🎯 Pot aktif: [1, 2, 3]
⏱️ Durasi: 60s
💧 Pompa Air: ON
🌿 Pompa Pupuk: OFF
✅ Successfully added to queue: jadwal_1_2026-02-16_08_00
Log Jika Jadwal Disabled:
⏱️ CHECK #15: 08:00:05 | Mode: ✅
📋 Total Jadwal: 3
❌ jadwal_1: 08:00 → Pot [1, 2, 3]
✅ jadwal_2: 09:00 → Pot [4, 5]
✅ jadwal_3: 16:00 → Pot [1, 2, 3, 4, 5]
Log Error/Warning:
⚠️ jadwal_4: Invalid structure, skipping
⚠️ jadwal_5: No active pots defined, skipping
⚙️ Advanced Configuration
Limit Maksimal Jadwal
Tidak ada limit! Bisa tambah jadwal_1 sampai jadwal_100 kalau perlu.
Rekomendasi:
- Normal use: 3-10 jadwal
- Complex greenhouse: 10-20 jadwal
- Maximum tested: 50 jadwal (still fast!)
Naming Convention
Worker detect semua key yang mulai dengan jadwal_:
- ✅
jadwal_1,jadwal_2,jadwal_3 - ✅
jadwal_pagi,jadwal_sore,jadwal_malam - ✅
jadwal_test_1,jadwal_test_2 - ❌
schedule_1(tidak akan terdetect)
Validasi Otomatis
Worker otomatis validasi:
- ✅
aktiffield (skip jikafalse) - ✅
waktufield (skip jika tidak ada atau tidak match) - ✅
pot_aktifarray (skip jika kosong atau invalid) - ✅ Default values untuk field opsional
🔄 Migration dari Format Lama
Format Lama (Legacy):
{
"kontrol": {
"waktu": true,
"waktu_1": "08:00",
"durasi_1": 60,
"waktu_2": "16:00",
"durasi_2": 45
}
}
Masih supported! Worker tetap baca waktu_1 dan waktu_2.
Migrasi Bertahap:
- Tetap pakai format lama sambil test format baru
- Tambah jadwal baru dengan format baru
- Disable format lama setelah yakin
- Hapus format lama setelah beberapa hari
Contoh Transisi:
{
"kontrol": {
"waktu": true,
// Format lama (masih jalan!)
"waktu_1": "08:00",
"durasi_1": 60,
// Format baru
"jadwal_2": {
"aktif": true,
"waktu": "09:00",
"durasi": 45,
"pot_aktif": [4, 5],
"pompa_air": true,
"pompa_pupuk": true
}
}
}
🛠️ Troubleshooting
Jadwal tidak trigger
Check:
- ✅
kontrol.waktu=true? - ✅
jadwal_X.aktif=true? - ✅
jadwal_X.waktuformat "HH:MM" (2 digit)? - ✅
jadwal_X.pot_aktifarray tidak kosong? - ✅ Worker running di Railway?
Pot salah yang menyala
Check:
- ✅
pot_aktifarray benar?[1, 2, 3]bukan["1", "2", "3"] - ✅ Tidak ada jadwal lain yang trigger di waktu sama?
- ✅ Check logs: "Pot aktif: [...]"
Durasi tidak sesuai
Check:
- ✅
durasidalam detik (bukan menit!) - ✅ Format number bukan string:
60bukan"60"
📊 Performa
- Check interval: 60 detik
- Detection time: < 1 detik
- Queue processing: Sequential (1 job at a time)
- Max schedules tested: 50 jadwal
- Memory impact: Minimal (~5MB per 10 jadwal)
🚀 Deploy
Setelah edit struktur Firebase:
- Worker otomatis detect jadwal baru (dalam 60 detik)
- No restart needed
- Check logs untuk verifikasi
Push perubahan worker.js ke Railway:
cd railway-worker
git add worker.js
git commit -m "feat: Add flexible multi-schedule support"
git push origin main
Railway auto-deploy dalam 2-3 menit.
📝 Summary
✅ Flexible: Tambah jadwal kapanpun tanpa ubah kode
✅ Scalable: Support 1-100+ jadwal
✅ Per-schedule config: Tiap jadwal bisa beda settingan
✅ Backward compatible: Format lama tetap jalan
✅ Easy to use: Setup langsung di Firebase
✅ Production ready: Sudah include error handling & validation
Need help? Check logs di Railway atau Firebase console untuk debug.