285 lines
7.4 KiB
Markdown
285 lines
7.4 KiB
Markdown
# 📋 RINGKASAN SISTEM SCHEDULER OTOMATIS PANEN
|
|
|
|
## 🎯 Apa yang Sudah Dibuat
|
|
|
|
### ✅ 1. Dependency Update
|
|
**File:** `pubspec.yaml`
|
|
```yaml
|
|
dependencies:
|
|
workmanager: ^0.5.1
|
|
```
|
|
|
|
### ✅ 2. Tiga Service Files Baru
|
|
|
|
#### A. `lib/services/panen_scheduler.dart`
|
|
**Fungsi:** Background scheduler yang menjalankan task jam 09:00 dan 15:00
|
|
- Setup periodic tasks menggunakan workmanager
|
|
- Hitung delay ke jam target berikutnya
|
|
- Execute callback saat schedule hit
|
|
|
|
#### B. `lib/services/panen_auto_capture_service.dart`
|
|
**Fungsi:** Bridge antara scheduler dan provider
|
|
- `triggerMorningCapture()` - Eksekusi panen pagi
|
|
- `triggerAfternoonCapture()` - Eksekusi panen sore dengan delta
|
|
- `initialize()` - Restore state saat app start
|
|
|
|
### ✅ 3. PanenProvider Update (Existing File)
|
|
**File:** `lib/providers/panen_provider.dart`
|
|
|
|
**Tambahan:**
|
|
```dart
|
|
// Snapshot tracking
|
|
Map<String, int> _snapshotPagiHariIni = {};
|
|
Map<String, int> _snapshotSoreHariIni = {};
|
|
|
|
// Methods baru:
|
|
getPanenPagiTodayValue(candangId) // Get nilai pagi
|
|
getPanenSoreTodayValue(kandangId) // Get nilai sore
|
|
isPanenPagiRecordedToday(kandangId) // Cek sudah record pagi
|
|
isPanenSoreRecordedToday(kandangId) // Cek sudah record sore
|
|
resetDailySnapshots() // Reset snapshot harian
|
|
captureScheduledPanenPagi(...) // Auto-capture pagi
|
|
captureScheduledPanenSore(...) // Auto-capture sore (dengan delta)
|
|
_savePanenToFirebase(panen) // Save ke Firebase
|
|
loadTodaySnapshots() // Load snapshot dari Firebase
|
|
restorePanenHistoryFromFirebase() // Restore data historical
|
|
```
|
|
|
|
---
|
|
|
|
## 📂 File-File yang Harus Dikerjakan
|
|
|
|
### HARUS DIKERJAKAN:
|
|
1. ✅ `pubspec.yaml` - Sudah diupdate
|
|
2. ✅ `lib/services/panen_scheduler.dart` - Sudah dibuat
|
|
3. ✅ `lib/services/panen_auto_capture_service.dart` - Sudah dibuat
|
|
4. ✅ `lib/providers/panen_provider.dart` - Sudah diupdate
|
|
5. ⏳ `lib/main.dart` - **KAMU EDIT SEKARANG** (lihat QUICK_START_SCHEDULER.md)
|
|
6. ⏳ `android/app/src/main/AndroidManifest.xml` - Tambah permissions
|
|
|
|
### DOKUMENTASI (Reference):
|
|
- `QUICK_START_SCHEDULER.md` - Quick setup (3-5 menit)
|
|
- `SCHEDULER_IMPLEMENTATION_GUIDE.md` - Detail lengkap & troubleshooting
|
|
- `MAIN_DART_EXAMPLE.dart` - Contoh lengkap main.dart
|
|
- `PENJELASAN_DASHBOARD_RIWAYAT.md` - Penjelasan existing system
|
|
|
|
---
|
|
|
|
## 🔧 LANGKAH IMPLEMENTASI
|
|
|
|
### Step 1: Install Dependencies
|
|
```bash
|
|
cd d:\KULIAH\TA\TelurKu\telurku
|
|
flutter pub get
|
|
```
|
|
|
|
### Step 2: Update main.dart
|
|
Buka `lib/main.dart` dan ikuti template di:
|
|
- `QUICK_START_SCHEDULER.md` (short version) - 5 menit
|
|
- `MAIN_DART_EXAMPLE.dart` (full example) - reference
|
|
|
|
**Key changes:**
|
|
```dart
|
|
// Import
|
|
import 'lib/services/panen_scheduler.dart';
|
|
import 'lib/services/panen_auto_capture_service.dart';
|
|
|
|
// Di main()
|
|
await PanenScheduler.initialize();
|
|
|
|
// Di _MyAppState.initState()
|
|
await PanenAutoCaptureService.initialize(_panenProvider);
|
|
```
|
|
|
|
### Step 3: Update AndroidManifest.xml
|
|
Tambah di `android/app/src/main/AndroidManifest.xml`:
|
|
```xml
|
|
<uses-permission android:name="android.permission.INTERNET" />
|
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
|
```
|
|
|
|
### Step 4: Test
|
|
```bash
|
|
flutter run
|
|
```
|
|
|
|
Tunggu hingga jam 09:00 atau 15:00, atau gunakan test button untuk manual trigger.
|
|
|
|
---
|
|
|
|
## 📊 ALUR KERJA OTOMATIS
|
|
|
|
```
|
|
JAM 09:00 (Pagi)
|
|
↓
|
|
Workmanager detect → Execute PanenScheduler task
|
|
↓
|
|
Read Firebase sensor (infra1, infra2)
|
|
↓
|
|
PanenAutoCaptureService.triggerMorningCapture()
|
|
↓
|
|
Loop setiap kandang → captureScheduledPanenPagi()
|
|
↓
|
|
Add to _panens + Save to Firebase
|
|
↓
|
|
✅ PANEN PAGI RECORDED
|
|
|
|
─────────────────────────────────
|
|
|
|
JAM 15:00 (Sore)
|
|
↓
|
|
Workmanager detect → Execute PanenScheduler task
|
|
↓
|
|
Read Firebase sensor (infra1, infra2)
|
|
↓
|
|
PanenAutoCaptureService.triggerAfternoonCapture()
|
|
↓
|
|
Loop setiap kandang → captureScheduledPanenSore()
|
|
↓
|
|
DELTA CALCULATION: sensorValue - snapshotPagi
|
|
↓
|
|
Add to _panens + Save to Firebase
|
|
↓
|
|
Reset daily snapshots
|
|
↓
|
|
✅ PANEN SORE RECORDED (dengan delta)
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 KEY FEATURES
|
|
|
|
### Time-Windowing ✅
|
|
- **Pagi (09:00)**: Akumulasi telur dari 15:01 kemarin hingga 09:00 hari ini (~18 jam)
|
|
- **Sore (15:00)**: Akumulasi telur dari 09:01 hingga 15:00 hari ini (~6 jam)
|
|
|
|
### Snapshot Mechanism ✅
|
|
- Simpan nilai pagi agar bisa calculate delta sore
|
|
- Cegah duplikasi data
|
|
- Per-kandang tracking
|
|
|
|
### Delta Calculation ✅
|
|
```
|
|
Pagi: sensor_value = nilai teleor (langsung)
|
|
Sore: sensor_value - nilai_pagi = telur baru yang disimpan
|
|
```
|
|
|
|
### Firebase Integration ✅
|
|
- `/riwayat/` - Simpan history panen
|
|
- `/panen_snapshot/{date}` - Simpan snapshot pagi & sore
|
|
- Auto-restore saat app start
|
|
|
|
### Auto Reset ✅
|
|
- Reset snapshot setelah panen sore selesai
|
|
- Persiapan untuk hari berikutnya
|
|
|
|
---
|
|
|
|
## 📱 UI INDICATORS
|
|
|
|
Dashboard akan menampilkan status scheduler:
|
|
|
|
```
|
|
Status Scheduler Hari Ini:
|
|
|
|
🌅 Panen Pagi 🌆 Panen Sore
|
|
✅ Selesai (09:00) ⏳ Menunggu (15:00)
|
|
```
|
|
|
|
Riwayat akan otomatis update dengan:
|
|
- Total Produksi harian
|
|
- Per-kandang detail (pagi & sore)
|
|
- Delta values tercatat
|
|
|
|
---
|
|
|
|
## ✨ BONUS FITUR
|
|
|
|
### Manual Testing Buttons
|
|
```dart
|
|
Button: "Test: Trigger Panen Pagi"
|
|
Button: "Test: Trigger Panen Sore"
|
|
Button: "Reset Daily Snapshots"
|
|
```
|
|
(Tersedia di MAIN_DART_EXAMPLE.dart)
|
|
|
|
### Debug Logging
|
|
Console akan menampilkan:
|
|
```
|
|
✅ Morning capture triggered for all kandang
|
|
✅ Afternoon capture triggered for all kandang
|
|
✅ Panen Pagi recorded untuk Kandang 1: 45 telur
|
|
✅ Panen Sore recorded untuk Kandang 1: 55 telur (delta: 100 - 45)
|
|
```
|
|
|
|
### Firebase Backup
|
|
Semua data tersimpan di Firebase untuk:
|
|
- Historical analysis
|
|
- Recovery jika app crash
|
|
- Multi-device sync (future)
|
|
|
|
---
|
|
|
|
## 🔐 IMPORTANT NOTES
|
|
|
|
1. **Device harus online** saat jam 09:00 & 15:00
|
|
2. **Firebase connection harus aktif** untuk save data
|
|
3. **Background execution** berjalan even jika app minimized
|
|
4. **Battery optimization** bisa block scheduler (perlu user adjustment)
|
|
|
|
---
|
|
|
|
## 📞 SUPPORT
|
|
|
|
Jika ada error:
|
|
|
|
1. **Build error?**
|
|
```bash
|
|
flutter clean
|
|
flutter pub get
|
|
flutter run
|
|
```
|
|
|
|
2. **Scheduler tidak jalan?**
|
|
- Check: apakah `PanenScheduler.initialize()` dipanggil di main()?
|
|
- Check: AndroidManifest.xml sudah update?
|
|
- Check: Firebase connection active?
|
|
|
|
3. **Data tidak tersimpan?**
|
|
- Check: Firebase Realtime Database rules
|
|
- Check: `/riwayat/` path bisa di-write?
|
|
- Check: KandangProvider initialized?
|
|
|
|
4. **Delta calculation salah?**
|
|
- Check: Snapshot pagi tercatat di `_snapshotPagiHariIni`
|
|
- Check: `isPanenPagiRecordedToday()` return true
|
|
|
|
---
|
|
|
|
## 📚 DOKUMENTASI
|
|
|
|
| File | Konten |
|
|
|------|--------|
|
|
| `QUICK_START_SCHEDULER.md` | Setup cepat (recommended!) |
|
|
| `SCHEDULER_IMPLEMENTATION_GUIDE.md` | Detail teknis, customization, troubleshooting |
|
|
| `MAIN_DART_EXAMPLE.dart` | Contoh main.dart lengkap dengan UI |
|
|
| `PENJELASAN_DASHBOARD_RIWAYAT.md` | Cara kerja existing system |
|
|
|
|
---
|
|
|
|
## 🚀 NEXT STEPS
|
|
|
|
1. **Edit main.dart** sesuai QUICK_START_SCHEDULER.md
|
|
2. **Run `flutter pub get`**
|
|
3. **Build & test** di device
|
|
4. **Monitor console** untuk verify scheduler jalan
|
|
5. **Check Firebase** untuk verify data tersimpan
|
|
6. **Celebrate!** 🎉
|
|
|
|
---
|
|
|
|
**Estimated Setup Time:** 15-20 minutes
|
|
**Complexity Level:** Medium
|
|
**Result:** Fully automated egg collection system ✅
|