244 lines
6.6 KiB
Markdown
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! 🌱
|