TKK_E32231105/SMART_HARVEST_TRACKING_FINA...

9.7 KiB

🌾 TelurKu - Smart Harvest Tracking System FINAL

📊 Implementasi Lengkap: Sensor Data → Riwayat Panen

Semua masalah sudah diperbaiki! Sekarang aplikasi dapat:

  1. Capture sensor value saat jadwal panen
  2. Track "Panen Pagi" vs "Panen Sore"
  3. Support delta calculation (sensor reset detection)
  4. Tampilkan last harvest status di dashboard
  5. Tampilkan total harian di riwayat

🔄 Alur Kerja Lengkap

Skenario: 2x Panen Per Hari

JADWAL PANEN:
├─ 09:00 Panen Pagi (durasi 30 menit)
└─ 15:00 Panen Sore (durasi 30 menit)

SENSOR TRACKING:
├─ Sebelum Panen Pagi: infra1 = 0
│  ├─ 09:00: Auto-capture → snapshot = 45
│  └─ Save: "Panen Pagi: 45 telur"
│
├─ Setelah Panen Pagi: infra1 = 45 (jika tidak di-reset)
│  ├─ Jam 15:00: Auto-capture → snapshot = 100
│  ├─ hitung delta: 100 - 45 = 55
│  └─ Save: "Panen Sore: 55 telur"
│
└─ RESULT: Total Hari Ini = 45 + 55 = 100 ✅

Dashboard Overview

┌─────────────────────────────────┐
│  TOTAL TELUR HARI INI: 137 🥚   │  ← Real-time dari sensor (infra1+infra2)
└─────────────────────────────────┘

┌─────────────────────────────────┐
│  STATUS PANEN TERAKHIR          │
├─────────────────────────────────┤
│ Kandang1 (SORE)                 │
│ 55 telur @15:00 | 7/3           │  ← Last capture
│                                 │
│ Kandang2 (PAGI)                 │
│ 42 telur @09:00 | 7/3           │  ← Last capture
└─────────────────────────────────┘

┌─────────────────────────────────┐
│  STATUS KANDANG                 │
├─────────────────────────────────┤
│ Kandang1: 59 Telur (raw sensor) │  ← Real-time
│ Kandang2: 78 Telur (raw sensor) │  ← Real-time
└─────────────────────────────────┘

Riwayat View

┌─────────────────────────────────┐
│  TOTAL PRODUKSI (Range Tanggal) │
│  500 telur total | 24 pencatatan│  ← Auto-calculated
└─────────────────────────────────┘

DETAIL PER HARI:
─────────────────────────────────
7 Maret 2026:
├─ Kandang1 Pagi:  45 telur
├─ Kandang1 Sore:  55 telur
├─ Kandang2 Pagi:  42 telur
└─ Kandang2 Sore:  48 telur
   TOTAL: 190 telur ← Per hari summary

6 Maret 2026:
├─ Kandang1 Pagi:  43 telur
├─ Kandang1 Sore:  52 telur
├─ Kandang2 Pagi:  41 telur
└─ Kandang2 Sore:  45 telur
   TOTAL: 181 telur

🔧 Technical Details

Panen Model - Extended Fields

class Panen {
  final String id;
  final String kandangId;
  final String kandangNama;
  
  // Core
  final int jumlahTelur;          // Actual eggs (computed or captured)
  final DateTime tanggalPanen;
  final String jam;               // Time captured (09:00, 15:00)
  final String catatan;
  
  // NEW - Harvest Tracking
  final String? jenisPanen;       // 'pagi' atau 'sore'
  final int? panenSebelumnya;     // Previous harvest value (untuk delta)
  final int? sensorSnapshot;      // Raw sensor value saat capture
}

KandangProvider - Sensor Methods

// Get current sensor value berdasarkan kandang index
int getCurrentSensorValue(int kandangIndex)
   Returns: infra1Value (if index==0), infra2Value (if index==1)

// Capture snapshot saat jadwal panen
Future<void> captureSensorSnapshot({
  required String kandangId,
  required int kandangIndex,
  required String jenisPanen,     // 'pagi' atau 'sore'
  required String jam,            // '09:00' atau '15:00'
})
   Action: Log capture, trigger UI update for last harvest

PanenProvider - Data Methods

// Get last harvest untuk dashboard display
Panen? getLastHarvestStatus(String kandangId)
   Returns: Last panen record (with time, date, type)

// Get total panen per hari
int getTotalHarianSemuaKandang(DateTime date)
   Returns: Sum of all kandang for that day

// Group panen by date untuk riwayat
Map<DateTime, List<Panen>> getPanenHistoryGroupedByDate(String kandangId)
   Returns: Map<Date  [Panen, Panen, ...]>

// Add panen dari sensor dengan auto-delta
void addPanenFromSensor(
  String kandangId,
  String kandangNama,
  int sensorValue,
  String jenisPanen,
  String jam,
  {int? panenSebelumnya}  // For delta calculation
)

🎯 How to Use

Scenario 1: Manual Harvest Entry (Saat Ronda Pagi)

// User tap "Capture Pagi Panen" button in Kontrol page
// App auto-read sensor value (misal: 45 telur)

panenProvider.addPanenFromSensor(
  kandangId: 'kandang_1',
  kandangNama: 'Kandang 1',
  sensorValue: 45,        // Current sensor value
  jenisPanen: 'pagi',
  jam: '09:00',
);

// Save ke riwayat:
// - Panen(jenis='pagi', jumlahTelur=45, sensorSnapshot=45, ...)

Scenario 2: Sore Harvest (With Delta)

// Jam 15:00, sensor menunjukkan 100 (belum direset)
// App tahu panen pagi = 45, sekarang = 100
// Delta = 100 - 45 = 55 (actual sore harvest)

panenProvider.addPanenFromSensor(
  kandangId: 'kandang_1',
  kandangNama: 'Kandang 1',
  sensorValue: 100,       // Current sensor value
  jenisPanen: 'sore',
  jam: '15:00',
  panenSebelumnya: 45,    // Last panen value
);

// App auto-calc: 100 - 45 = 55
// Save ke riwayat:
// - Panen(jenis='sore', jumlahTelur=55, sensorSnapshot=100, panenSebelumnya=45, ...)

Scenario 3: Dashboard Display

// Dashboard otomatis update saat build
final lastHarvest = panenProvider.getLastHarvestStatus('kandang_1');

// Display:
// "Kandang1 (SORE): 55 telur @15:00"
// "7/3"

// Total Hari Ini:
// infra1Value (59) + infra2Value (78) = 137 telur

📋 API Reference

KandangProvider

Method Input Output Use Case
getCurrentSensorValue(idx) kandang index int Get raw sensor value
captureSensorSnapshot({...}) kandang, index, jenis, jam void Trigger capture
listenToSensors() - void Listen real-time
infra1Value - int Get infra1 value
infra2Value - int Get infra2 value

PanenProvider

Method Input Output Use Case
getLastHarvestStatus(id) kandang id Panen? Dashboard status
getTotalHarianSemuaKandang(date) date int Dashboard total
getPanenHistoryGroupedByDate(id) kandang id Map Riwayat grouping
addPanenFromSensor({...}) sensor data void Auto-capture panen
getTotalPanenHari(date, id) date, id int Per kandang total

🚀 Integration dengan Jadwal Panen

Untuk auto-capture saat jadwal panen:

// Di PenjadwalanProvider atau di Kontrol page
// Saat jam 09:00 tercapai:

if (DateTime.now().hour == 9 && DateTime.now().minute == 0) {
  final sensor = kandangProvider.infra1Value;
  panenProvider.addPanenFromSensor(
    kandangId: 'kandang_1',
    kandangNama: 'Kandang 1',
    sensorValue: sensor,
    jenisPanen: 'pagi',
    jam: '09:00',
  );
  
  // Atau manual trigger dari button di Kontrol page
}

🎨 UI Changes

Dashboard

  • "Total Telur Hari Ini" - from real-time sensor
  • "Status Panen Terakhir" - new card showing last harvest
  • "Status Kandang" - raw sensor values

Riwayat

  • "Total Produksi" - summary card with total eggs
  • "Detail Per Hari" - list of daily harvests

Kontrol (Optional Future Enhancement)

  • Button "Capture Panen Pagi" - manual trigger
  • Button "Capture Panen Sore" - manual trigger
  • Auto-suggest based on schedule time

📌 Key Improvements

Problem Solution
Mixing raw sensor vs harvest data Separate: sensor values vs captured panen
No delta support for sore harvest Implement delta calc: current - previous
Missing last harvest context Show jenis, waktu, tanggal di dashboard
No daily total in riwayat Add summary card at top
Can't differentiate pagi vs sore Add jenisPanen field + tracking

🔐 Data Integrity

Firebase (Real-time):
├─ data/infra1: 59 (current)
└─ data/infra2: 78 (current)

App Memory:
├─ kandangProvider.infra1Value: 59 (synced)
└─ kandangProvider.infra2Value: 78 (synced)

Storage (Riwayat):
├─ Panen(jenis='pagi', ...): 45 snapshot
├─ Panen(jenis='sore', ...): 55 snapshot  
└─ Total: 100 calculated

Checklist Implementasi

  • Panen model extended (jenisPanen, panenSebelumnya, sensorSnapshot)
  • KandangProvider: getCurrentSensorValue(), captureSensorSnapshot()
  • PanenProvider: getLastHarvestStatus(), addPanenFromSensor()
  • Dashboard: Show last harvest card
  • Riwayat: Show total produksi summary
  • All errors fixed & code compiles

Status: SIAP DIGUNAKAN!


📝 Next Steps (Optional)

  1. Auto-Capture: Setup scheduled task untuk auto-capture saat jadwal
  2. Manual Override: Button di Kontrol untuk manual capture
  3. Reset Confirmation: Konfirmasi user saat sensor di-reset ke 0
  4. Alerts: Notifikasi jika produksi drop drastis
  5. Sync to Cloud: Backup panen history ke Firebase

Sistem tracking sudah siap! Sekarang bisa bedain panen pagi vs sore dengan akurat! 🎉