# Changelog - Perbaikan Status dan Notifikasi

## Tanggal: 25 Juni 2026

### Masalah yang Diperbaiki

1. **Status Pengeringan Tetap Berjalan Meskipun Alat Terputus**
   - Sebelumnya: Aplikasi tidak mendeteksi ketika ESP32 terputus saat pengeringan berlangsung
   - Sekarang: Sistem mendeteksi timeout (10 detik tanpa data) dan memberikan warning

2. **Notifikasi Terlalu Banyak**
   - Sebelumnya: Notifikasi muncul untuk setiap perubahan status (dimulai, ikan terdeteksi, berjalan, selesai)
   - Sekarang: Notifikasi hanya muncul untuk **Pengeringan Selesai**

### Perubahan Detail

#### 1. Dashboard Screen (dashboard_screen.dart)

**Deteksi Timeout:**
- Menambahkan variabel `_lastDataReceived` untuk tracking waktu data terakhir
- Menambahkan `_timeoutCheckTimer` yang mengecek setiap 2 detik
- Jika tidak ada data > 10 detik saat pengeringan:
  - Menampilkan pesan "Koneksi ke alat terputus"
  - Relay UI dimatikan
  - Status pengeringan tetap dipertahankan untuk konsistensi

**Reset Status:**
- Ketika menerima status `READY` atau `CONNECTED`:
  - Reset `modePengeringan` = false
  - Reset `pengeringanSelesai` = false
  - Reset `beratTersimpan` = false

**Notifikasi:**
- Menghapus notifikasi untuk status `START` (pengeringan dimulai)
- Menghapus notifikasi untuk status `BERJALAN` (ikan terdeteksi)
- **Mempertahankan** notifikasi untuk status `SELESAI` (pengeringan selesai)

#### 2. Dashboard Screen With API (dashboard_screen_with_api.dart)

**Notifikasi:**
- Menghapus notifikasi untuk status `READY` (pengeringan dimulai)
- Menghapus notifikasi untuk status `BERJALAN` (ikan terdeteksi)
- **Mempertahankan** notifikasi untuk status `SELESAI` (pengeringan selesai)

#### 3. Notification Service (notification_service.dart)

**Method yang Dihapus:**
- `notifyPengeringanDimulai()` - pengeringan dimulai
- `notifyIkanTerdeteksi(double berat)` - ikan terdeteksi
- `notifyPengeringanBerjalan(double berat, double target)` - pengeringan berjalan

**Method yang Dipertahankan:**
- `notifyPengeringanSelesai(double beratAkhir)` - pengeringan selesai ✅
- `notifySuhuTinggi(double suhu)` - peringatan suhu tinggi
- `notifyKoneksiTerputus()` - koneksi terputus
- `notifyKoneksiTersambung()` - koneksi tersambung

#### 4. Notification Manager (notification_manager.dart)

**Method yang Dihapus:**
- `notifyPengeringanDimulai()` - pengeringan dimulai
- `notifyIkanTerdeteksi(double berat)` - ikan terdeteksi
- `notifyPengeringanBerjalan(double berat, double target)` - pengeringan berjalan

**Method yang Dipertahankan:**
- `notifyPengeringanSelesai(double beratAkhir)` - pengeringan selesai ✅

### Cara Kerja Deteksi Timeout

```dart
// Timer berjalan setiap 2 detik
_timeoutCheckTimer = Timer.periodic(const Duration(seconds: 2), (timer) {
  // Cek apakah sudah > 10 detik tanpa data
  if (_lastDataReceived != null && 
      DateTime.now().difference(_lastDataReceived!) > Duration(seconds: 10) &&
      modePengeringan) {
    
    // Tampilkan warning
    lastStatusMessage = 'Koneksi ke alat terputus - Status mungkin tidak akurat';
    
    // Matikan relay di UI
    heater = false;
    fanIn = false;
    lamp = false;
    exhaust = false;
    
    // Status pengeringan tetap dipertahankan
  }
});
```

### Testing

**Skenario 1: Alat Terputus Saat Pengeringan**
1. Mulai pengeringan
2. Cabut koneksi WiFi ESP32 atau matikan alat
3. ✅ Setelah 10 detik, aplikasi menampilkan warning
4. ✅ Relay di UI otomatis OFF
5. ✅ Status pengeringan tetap ditampilkan

**Skenario 2: Notifikasi**
1. Mulai pengeringan
2. ❌ TIDAK ada notifikasi "Pengeringan Dimulai"
3. Ikan terdeteksi
4. ❌ TIDAK ada notifikasi "Ikan Terdeteksi"
5. Pengeringan selesai
6. ✅ Muncul notifikasi "Pengeringan Selesai"

### Catatan

- Timeout 10 detik dipilih karena ESP32 mengirim data setiap 1 detik
- 10 detik memberikan buffer yang cukup untuk network latency
- Status pengeringan tidak direset otomatis untuk menghindari kehilangan informasi
- User harus manual reset dengan tombol RESET setelah koneksi pulih

### Backward Compatibility

Perubahan ini **tidak mempengaruhi**:
- Backend server
- ESP32 firmware
- MQTT communication
- Database structure
- API endpoints

Perubahan **hanya di aplikasi Flutter** untuk:
- Deteksi timeout
- Filtering notifikasi
