TKK_E32230814/JADWAL_FLUTTER_GUIDE.md

285 lines
6.9 KiB
Markdown

# 📱 Panduan Sistem Penjad walan Baru - Flutter App
## ✨ Fitur Baru
Sistem penjadwalan ApsGo telah diupgrade dengan fitur:
**Multiple Jadwal** - Tidak lagi terbatas 2 jadwal saja
**Flexible Pot Selection** - Setiap jadwal bisa pilih pot mana yang aktif
**Per-Schedule Config** - Tiap jadwal punya durasi & pompa sendiri
**Enable/Disable** - Matikan jadwal tanpa hapus data
**Real-time Sync** - Langsung sync dengan Firebase & Railway Worker
## 📁 File Baru yang Dibuat
### Models
- `lib/models/jadwal_model.dart` - Data model untuk jadwal
### Services
- `lib/services/jadwal_service.dart` - CRUD operations untuk jadwal Firebase
### Screens
- `lib/screens/jadwal_management_page.dart` - List & manage all jadwal
- `lib/screens/jadwal_form_page.dart` - Add/edit jadwal form
### Config
- `firebase-structure-complete.json` - Struktur Firebase lengkap
## 🗄️ Struktur Firebase Baru
```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
}
}
}
```
## 🚀 Cara Setup
### 1. Copy Struktur Firebase
1. Buka Firebase Console → Realtime Database
2. Edit `/kontrol` node
3. Tambahkan jadwal sesuai contoh di atas
4. Atau import dari `firebase-structure-complete.json`
### 2. Update Dependency (Jika Perlu)
Pastikan `pubspec.yaml` sudah punya:
```yaml
dependencies:
firebase_database: ^latest_version
shared_preferences: ^latest_version
```
### 3. Update Navigation
File `lib/screens/kontrol_page.dart` sudah diupdate untuk navigasi ke JadwalManagementPage.
## 📱 Cara Menggunakan di App
### Akses Jadwal Management
1. Buka app ApsGo
2. Tap tab **Kontrol**
3. Tap button **Waktu**
4. Akan muncul **Jadwal Management Page**
### Tambah Jadwal Baru
1. Di Jadwal Management Page, tap tombol **+ Tambah Jadwal**
2. Isi form:
- **Waktu**: Pilih jam berapa jadwal akan jalan
- **Durasi**: Berapa menit penyiraman (auto convert ke detik)
- **Pilih Pot**: Centang pot mana yang akan disiram
- **Pompa Air**: Toggle on/off
- **Pompa Pupuk**: Toggle on/off
- **Status Jadwal**: Aktif or nonaktif
3. Tap **TAMBAH JADWAL**
### Edit Jadwal
1. Di list jadwal, tap button **Edit**
2. Ubah settingan yang diinginkan
3. Tap **SIMPAN PERUBAHAN**
### Aktifkan/Nonaktifkan Jadwal
Gunakan **Switch** di kanan atas setiap jadwal card untuk toggle on/off cepat.
### Duplikat Jadwal
1. Tap button **Duplikat** di jadwal yang ingin dicopy
2. Jadwal baru otomatis dibuat dengan ID baru (status: nonaktif)
3. Edit jadwal baru sesuai kebutuhan
### Hapus Jadwal
1. Tap icon **🗑️** (trash) di jadwal yang ingin dihapus
2. Konfirmasi penghapusan
## 🎨 UI Features
### Jadwal Management Page
- **Mode Waktu Toggle**: Enable/disable semua jadwal sekaligus
- **Jadwal Cards**: Menampilkan semua jadwal dengan info lengkap
- **Color Coding**: Hijau = aktif, Abu-abu = nonaktif
- **Real-time Updates**: Pull to refresh untuk sync terbaru
### Jadwal Form Page
- **Time Picker**: Native Android/iOS time picker
- **Duration Input**: Input menit, auto convert ke detik
- **Pot Selection**: Visual checkboxes untuk 5 pot
- **Quick Actions**: "Pilih Semua" & "Bersihkan"
- **Validation**: Auto validasi sebelum save
## ⚠️ Catatan Penting
### Kompatibilitas dengan Worker
Worker Railway sudah updated untuk support format baru. Kedua sistem (lama & baru) masih compatible:
**Format Lama** (masih jalan):
```json
{
"waktu_1": "08:00",
"durasi_1": 60
}
```
**Format Baru** (recommended):
```json
{
"jadwal_1": {
"aktif": true,
"waktu": "08:00",
"durasi": 60,
"pot_aktif": [1, 2, 3],
"pompa_air": true,
"pompa_pupuk": false
}
}
```
### Migration Path
Tidak perlu migrate semua sekaligus. Sistem bisa pakai campuran format lama & baru.
**Recommended migration:**
1. Biarkan format lama tetap jalan
2. Tambah jadwal baru dengan format baru
3. Test jadwal baru beberapa hari
4. Hapus format lama setelah yakin
## 🔧 Troubleshooting
### Jadwal tidak muncul di app
**Check:**
1. Firebase connected? (Check Firebase console)
2. Struktur Firebase benar?
3. Node path: `/kontrol/jadwal_X`
### Jadwal tidak trigger di worker
**Check:**
1. Worker running di Railway?
2. `kontrol.waktu` = `true`?
3. `jadwal_X.aktif` = `true`?
4. Format waktu "HH:MM" (2 digit)?
5. Check Railway logs
### Pot tidak menyala
**Check:**
1. `pot_aktif` array benar? `[1, 2, 3]`
2. Pot number 1-5 (bukan 0-4)
3. Check aktuator di Firebase
4. Hardware connection OK?
## 📊 Testing Checklist
Sebelum production, test:
- [ ] Add jadwal baru
- [ ] Edit jadwal existing
- [ ] Toggle jadwal aktif/nonaktif
- [ ] Duplikat jadwal
- [ ] Hapus jadwal
- [ ] Toggle mode waktu on/off
- [ ] Test jadwal trigger di waktu yang ditentukan
- [ ] Test multiple pot selection
- [ ] Test pompa air on/off per jadwal
- [ ] Test pompa pupuk on/off per jadwal
- [ ] Test pull to refresh
- [ ] Test dengan 5+ jadwal sekaligus
## 🎯 Contoh Use Case
### Use Case 1: Rumah simple
**Kebutuhan**: Siram semua pot 2x sehari (pagi & sore)
**Setup**:
```
Jadwal 1: 08:00 → Pot [1,2,3,4,5] → 60s
Jadwal 2: 16:00 → Pot [1,2,3,4,5] → 60s
```
### Use Case 2: Per-pot berbeda
**Kebutuhan**:
- Pot 1&2: 3x sehari (pagi, siang, sore)
- Pot 3&4: 2x sehari (pagi, sore)
- Pot 5: 1x sehari (pagi)
**Setup**:
```
Jadwal 1: 07:00 → Pot [1,2] → 60s
Jadwal 2: 08:00 → Pot [3,4,5] → 60s
Jadwal 3: 12:00 → Pot [1,2] → 45s
Jadwal 4: 16:00 → Pot [3,4] → 50s
Jadwal 5: 17:00 → Pot [1,2] → 40s
```
### Use Case 3: Different durations
**Kebutuhan**: Setiap pot punya durasi berbeda
**Setup**:
```
Jadwal 1: 08:00 → Pot [1] → 30s (Fast)
Jadwal 2: 08:05 → Pot [2] → 60s (Medium)
Jadwal 3: 08:10 → Pot [3] → 90s (Long)
Jadwal 4: 08:15 → Pot [4] → 45s
Jadwal 5: 08:20 → Pot [5] → 75s
```
## 📝 Best Practices
1. **Naming Convention**: Gunakan `jadwal_1`, `jadwal_2`, dst (agar auto-detect worker)
2. **Time Format**: Selalu 2 digit "HH:MM" (misal: "08:00" bukan "8:0")
3. **Duration**: Input dalam menit di app, akan auto convert ke detik
4. **pot_aktif**: Gunakan array number [1, 2, 3], bukan string
5. **Testing**: Test jadwal baru dengan status nonaktif dulu sebelum aktifkan
## 🔗 Related Files
- Worker: `railway-worker/worker.js` (sudah updated)
- Firebase Guide: `railway-worker/FLEXIBLE_SCHEDULE_GUIDE.md`
- Example Firebase: `firebase-structure-complete.json`
---
## 💡 Tips
- Gunakan **Duplikat** untuk cepat bikin jadwal mirip
- **Pull to refresh** untuk sync perubahan dari Firebase/Worker
- **Mode Waktu toggle** untuk disable semua jadwal sekaligus
- Jadwal dengan **pot kosong** akan di-skip otomatis
Selamat menggunakan sistem penjadwalan baru! 🚀🌱