TKK_E32230814/BUG_FIXES_REPORT.md

244 lines
6.6 KiB
Markdown

# Laporan Perbaikan Bug ApsGo
**Tanggal**: 26 Januari 2026
**Status**: ✅ SELESAI
## Ringkasan Bug yang Diperbaiki
### 1. 🔒 Bug Logout Tiba-tiba ke Landing Page
**Masalah**:
- Aplikasi terkadang logout secara tiba-tiba saat klik menu Kontrol atau menu lainnya
- User ter-redirect ke Landing Page tanpa sengaja
**Penyebab**:
- Tidak ada monitoring auth state di DashboardPage
- Ketika Firebase Auth token expired atau ada perubahan auth state, tidak ada handler yang tepat
- Navigation stack tidak terlindungi dengan baik
**Solusi**:
✅ Tambahkan `authStateChanges` listener di `initState()` DashboardPage
```dart
@override
void initState() {
super.initState();
// Monitor auth state untuk mencegah logout tidak terduga
_authService.authStateChanges.listen((user) {
if (user == null && mounted) {
// User logged out, redirect to login
Navigator.of(context).pushNamedAndRemoveUntil(
'/login',
(route) => false,
);
}
});
}
```
**File yang Diubah**:
- `lib/screens/dashboard_page.dart`
---
### 2. 💧 Bug Pompa Tidak Langsung Aktif Saat Soil Moisture Rendah
**Masalah**:
- Pompa terkadang tidak langsung aktif ketika soil moisture di bawah ambang bawah
- Delay response terlalu lama (10 detik)
- Cooldown period terlalu lama (5 menit)
**Penyebab**:
- Timer check sensor berjalan setiap 10 detik → terlalu lambat
- Cooldown 5 menit antar penyiraman → terlalu lama untuk kondisi kritis
- Kurang logging untuk debugging
**Solusi**:
**Interval Check**: Ubah dari 10 detik → **5 detik** (lebih responsif)
```dart
_sensorCheckTimer = Timer.periodic(
const Duration(seconds: 5), // Sebelumnya: 10 detik
(timer) => _checkSensorThreshold(),
);
```
**Cooldown Period**: Kurangi dari 5 menit → **2 menit**
```dart
if (diff.inMinutes < 2) { // Sebelumnya: 5 menit
debugPrint('⏳ POT $potNumber: Cooldown active (${2 - diff.inMinutes} min remaining)');
return;
}
```
**Tambah Logging Detail**:
- Log setiap check sensor dengan nilai threshold
- Log setiap trigger penyiraman
- Log progress penyiraman per 5 detik
- Log saat target tercapai
**Pastikan Flag Reset**: Tambah delay sebelum reset flag untuk memastikan cleanup selesai
```dart
await Future.delayed(const Duration(milliseconds: 500));
_isWateringActive[potKey] = false;
```
**Error Handling**: Tambahkan try-catch untuk matikan pompa saat error
```dart
} catch (e) {
debugPrint('❌ Error watering pot by sensor: $e');
// Matikan semua untuk safety
try {
await _dbService.setPompaAir(false);
await _dbService.setPot(potNumber, false);
} catch (cleanupError) {
debugPrint('❌ Error during cleanup: $cleanupError');
}
_isWateringActive[potKey] = false;
}
```
**File yang Diubah**:
- `lib/services/kontrol_automation_service.dart`
---
### 3. 🔌 Verifikasi Mapping Soil Sensor ke Mosfet
**Masalah yang Diperiksa**:
- Apakah soil_1 bisa mempengaruhi mosvet_3 dst
- Apakah mapping soil_x ke mosvet_y sudah benar
**Hasil Verifikasi**:
✅ Mapping sudah **BENAR**:
```
soil_1 (Pot 1) → mosvet_3 (Valve Pot 1)
soil_2 (Pot 2) → mosvet_4 (Valve Pot 2)
soil_3 (Pot 3) → mosvet_5 (Valve Pot 3)
soil_4 (Pot 4) → mosvet_6 (Valve Pot 4)
soil_5 (Pot 5) → mosvet_7 (Valve Pot 5)
```
**Catatan**:
- mosvet_1 = Pompa Air
- mosvet_2 = Pompa Nutrisi
- mosvet_3 s/d mosvet_7 = Valve Pot 1-5
**Perbaikan**:
✅ Tambah komentar dan logging untuk memperjelas mapping
```dart
// pot 1 → mosvet_3, pot 2 → mosvet_4, ... pot 5 → mosvet_7
debugPrint('💧 Starting watering: POT $potNumber (mosvet_${potNumber + 2})');
```
✅ Tambah logging tracking nilai soil sensor
```dart
debugPrint('🌡️ soil_$i = $soilValue (threshold: $batasBawah)');
debugPrint('⚠️ $soilKey ($soilValue) < batasBawah ($batasBawah) → Triggering watering for POT $i');
```
**File yang Diubah**:
- `lib/services/kontrol_automation_service.dart`
---
## Perubahan Detail
### File: `lib/screens/dashboard_page.dart`
**Perubahan**:
1. Import `AuthService`
2. Tambah instance `_authService`
3. Tambah `initState()` dengan auth state listener
### File: `lib/services/kontrol_automation_service.dart`
**Perubahan**:
1. ✅ Timer interval: 10s → 5s (line ~183)
2. ✅ Cooldown: 5 min → 2 min (line ~248)
3. ✅ Tambah logging detail di `_checkSensorThreshold()` (line ~217)
4. ✅ Tambah logging mapping pot (line ~254)
5. ✅ Tambah logging progress watering (line ~265)
6. ✅ Tambah delay sebelum reset flag (line ~283)
7. ✅ Improve error handling dengan cleanup (line ~286)
---
## Testing Checklist
Setelah update, pastikan test hal-hal berikut:
### Auth & Navigation
- [ ] Login dan navigate ke Dashboard
- [ ] Klik menu Kontrol → tidak logout
- [ ] Klik menu Histori → tidak logout
- [ ] Buka drawer dan klik menu → tidak logout
- [ ] Test dengan koneksi internet ON/OFF
- [ ] Test dengan token yang akan expired
### Sensor Automation
- [ ] Aktifkan mode Sensor
- [ ] Set soil moisture di bawah batas bawah (misal: 25%)
- [ ] Cek pompa aktif dalam **< 5 detik**
- [ ] Cek valve pot yang tepat aktif (soil_1 mosvet_3, dst)
- [ ] Cek log di console untuk tracking
- [ ] Test dengan multiple pot di bawah threshold bersamaan
- [ ] Test cooldown period (2 menit)
### Edge Cases
- [ ] Test saat Firebase disconnect
- [ ] Test saat sensor data tidak valid (0, null, string)
- [ ] Test saat automation service crash
- [ ] Test multiple user logout/login
---
## Logging untuk Debugging
Untuk monitor aktivitas, cek console log dengan pattern:
**Sensor Mode**:
```
🌡️ Sensor Mode: Started
🌡️ Checking thresholds: batas_bawah=30, batas_atas=80
🌡️ soil_1 = 25 (threshold: 30)
⚠️ soil_1 (25) < batasBawah (30) → Triggering watering for POT 1
💧 Starting watering: POT 1 (mosvet_3)
🌡️ Target: soil_1 should reach >= 80 (currently: 25)
💧 POT 1 watering: 5s, soil_1: 35
💧 POT 1 watering: 10s, soil_1: 50
✅ POT 1 reached target: 80 >= 80
✅ Sensor Mode: Watering completed for POT 1 (15s)
```
**Cooldown**:
```
⏳ POT 1: Cooldown active (1 min remaining)
```
**Errors**:
```
❌ Error watering pot by sensor: [error message]
❌ Error during cleanup: [error message]
```
---
## Rekomendasi Lanjutan
1. **Tambah UI Indicator**: Tampilkan status automation (active/inactive) di Dashboard
2. **Notification**: Push notification saat pompa aktif otomatis
3. **History Log**: Simpan log automation ke Firebase untuk review
4. **Manual Override**: Button untuk force stop automation
5. **Sensor Calibration**: UI untuk kalibrasi sensor soil moisture
---
## Kontak
Jika masih ada masalah setelah update ini, catat:
1. Timestamp kejadian
2. Screenshot console log
3. Nilai sensor saat kejadian
4. Action yang dilakukan user
Happy Gardening! 🌱