TKK_E32230814/lib/services/history_logging_service.dart

106 lines
2.7 KiB
Dart

import 'dart:async';
import 'package:flutter/foundation.dart';
import 'firebase_database_service.dart';
import 'automation_constants.dart';
/// Service untuk auto-logging data sensor ke Firebase history
/// Berjalan di background dan save snapshot setiap interval tertentu
class HistoryLoggingService {
static final HistoryLoggingService _instance =
HistoryLoggingService._internal();
factory HistoryLoggingService() => _instance;
HistoryLoggingService._internal();
final FirebaseDatabaseService _dbService = FirebaseDatabaseService();
Timer? _loggingTimer;
bool _isActive = false;
// Interval logging (gunakan constant)
Duration _loggingInterval = const Duration(
minutes: AutomationConstants.historyLoggingIntervalMinutes,
);
/// Start history logging service
void start({Duration? interval}) {
if (_isActive) {
debugPrint('📊 History logging already active');
return;
}
if (interval != null) {
_loggingInterval = interval;
}
_isActive = true;
debugPrint(
'📊 History logging started (interval: ${_loggingInterval.inMinutes} min)',
);
// Log immediately on start
_logCurrentData();
// Then log periodically
_loggingTimer = Timer.periodic(_loggingInterval, (timer) {
_logCurrentData();
});
}
/// Stop history logging service
void stop() {
_loggingTimer?.cancel();
_loggingTimer = null;
_isActive = false;
debugPrint('📊 History logging stopped');
}
/// Log current sensor data to Firebase history
Future<void> _logCurrentData() async {
try {
final sensorData = await _dbService.getSensorData();
if (sensorData.isNotEmpty) {
await _dbService.saveHistory(sensorData);
final now = DateTime.now();
debugPrint(
'📊 History logged: ${now.hour}:${now.minute.toString().padLeft(2, '0')} - '
'Temp: ${sensorData['suhu']}°C, Soil1: ${sensorData['soil_1']}%',
);
} else {
debugPrint('⚠️ No sensor data available to log');
}
} catch (e) {
debugPrint('❌ Error logging history: $e');
}
}
/// Manually trigger logging (useful for testing)
Future<void> logNow() async {
debugPrint('📊 Manual history log triggered');
await _logCurrentData();
}
/// Change logging interval
void setInterval(Duration newInterval) {
_loggingInterval = newInterval;
if (_isActive) {
// Restart with new interval
stop();
start(interval: newInterval);
}
debugPrint('📊 Logging interval changed to: ${newInterval.inMinutes} min');
}
/// Get current status
bool get isActive => _isActive;
Duration get interval => _loggingInterval;
/// Cleanup (call when app closes)
void dispose() {
stop();
}
}