MIF_E31221269/lib/background_service.dart

196 lines
7.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_background_service/flutter_background_service.dart';
import 'package:firebase_database/firebase_database.dart';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'dart:async'; // Import for Timer
import 'services/notification_service.dart'; // Import layanan notifikasi
String lastLcdStatus = ""; // Menyimpan status terakhir LCD
String lastSensorStatus = ""; // Menyimpan status terakhir Sensor
String lastWifiStatus = ""; // Menyimpan status terakhir WiFi
DateTime? lastSensorResponseTime; // Menyimpan waktu terakhir sensor merespon
Timer? wifiCheckTimer; // Timer untuk memeriksa koneksi WiFi berdasarkan respons sensor
void backgroundService() {
WidgetsFlutterBinding.ensureInitialized();
FlutterBackgroundService.initialize(onStart);
print("Background service initialized...");
print("Background service is running...");
// Inisialisasi Firebase Database
final DatabaseReference lcdRef = FirebaseDatabase.instance.ref().child('logs/lcd');
final DatabaseReference sensorRef = FirebaseDatabase.instance.ref().child('logs/sensor');
// Memulai timer untuk memeriksa koneksi WiFi setiap 30 detik
wifiCheckTimer = Timer.periodic(Duration(seconds: 30), (timer) {
checkWifiStatusBasedOnSensor();
});
// Inisialisasi layanan notifikasi untuk monitoring suhu dan kelembapan
NotificationService().initialize().then((_) {
print("✅ Layanan notifikasi suhu dan kelembapan berhasil diinisialisasi di background service");
});
lcdRef.onValue.listen((event) {
print("Listener untuk LCD dipanggil");
if (event.snapshot.value != null) {
if (event.snapshot.value is String) {
var value = event.snapshot.value as String;
print("Data LCD diterima: $value"); // Log data LCD
var parts = value.split(':'); // Memecah string menjadi bagian-bagian
if (parts.length > 1) {
var status = parts[1].trim(); // Mengambil status dari bagian kedua
print("Status LCD: $status");
if (status.contains("Initializing")) {
print("LCD Initialization Started");
if (lastLcdStatus != status) {
updateNotification("LCD Status", "Inisialisasi LCD dimulai", 1);
lastLcdStatus = status;
}
} else if (status.contains("Ready")) {
print("LCD Ready and Initialized");
if (lastLcdStatus != status) {
updateNotification("LCD Status", "LCD siap dan terinisialisasi", 1);
lastLcdStatus = status;
}
} else if (status.contains("Failed")) {
print("LCD Initialization Failed");
if (lastLcdStatus != status) {
updateNotification("LCD Status", "Inisialisasi LCD gagal - Periksa koneksi", 1);
lastLcdStatus = status;
}
} else if (status.contains("Lost")) {
print("LCD Connection Lost");
if (lastLcdStatus != status) {
updateNotification("LCD Status", "Koneksi LCD terputus - Periksa kabel", 1);
lastLcdStatus = status;
}
} else if (status.contains("Restored")) {
print("LCD Connection Restored");
if (lastLcdStatus != status) {
updateNotification("LCD Status", "Koneksi LCD dipulihkan", 1);
lastLcdStatus = status;
}
} else {
print("LCD Status not recognized: $status"); // Debugging line
}
} else {
print("Invalid LCD data format"); // Debugging line
}
} else {
print("Data LCD tidak dalam format String"); // Debugging line
}
} else {
print("Data LCD tidak ada");
}
});
sensorRef.onValue.listen((event) {
if (event.snapshot.value != null) {
// Update waktu terakhir sensor merespon
lastSensorResponseTime = DateTime.now();
print("Sensor merespon pada: $lastSensorResponseTime");
// Periksa status WiFi berdasarkan respons sensor
checkWifiStatusBasedOnSensor();
if (event.snapshot.value is String) {
var value = event.snapshot.value as String;
print("Data Sensor diterima: $value"); // Log data sensor
var parts = value.split(':'); // Memecah string menjadi bagian-bagian
if (parts.length > 1) {
var status = parts[1].trim(); // Mengambil status dari bagian kedua
print("Status Sensor: $status"); // Menambahkan log untuk status sensor
if (status == 'Failed to Read from DHT Sensor') {
print("Failed to Read from DHT Sensor");
if (lastSensorStatus != status) {
updateNotification("Sensor Status", "Gagal membaca dari sensor DHT", 2);
lastSensorStatus = status;
}
} else if (status == 'DHT Sensor Reading Successful') {
print("DHT Sensor Reading Successful");
if (lastSensorStatus != status) {
updateNotification("Sensor Status", "Pembacaan sensor DHT berhasil", 2);
lastSensorStatus = status;
}
} else {
print("Sensor Status not recognized: $status"); // Debugging line
}
} else {
print("Invalid Sensor data format"); // Debugging line
}
} else {
print("Data Sensor tidak dalam format String"); // Debugging line
}
} else {
print("Data Sensor tidak ada");
}
});
}
// Fungsi untuk memeriksa status WiFi berdasarkan respons sensor
void checkWifiStatusBasedOnSensor() {
if (lastSensorResponseTime == null) {
// Jika belum ada respons sensor sama sekali
if (lastWifiStatus != "Disconnected") {
updateNotification("WiFi Status", "WiFi terputus", 3);
lastWifiStatus = "Disconnected";
print("WiFi dianggap terputus karena belum ada respons sensor");
}
return;
}
// Hitung selisih waktu antara sekarang dan respons sensor terakhir
Duration timeSinceLastResponse = DateTime.now().difference(lastSensorResponseTime!);
print("Waktu sejak respons sensor terakhir: ${timeSinceLastResponse.inSeconds} detik");
// Jika sensor tidak merespon dalam 60 detik, anggap WiFi terputus
if (timeSinceLastResponse.inSeconds > 60) {
if (lastWifiStatus != "Disconnected") {
updateNotification("WiFi Status", "WiFi terputus", 3);
lastWifiStatus = "Disconnected";
print("WiFi dianggap terputus karena sensor tidak merespon selama 60 detik");
}
} else {
// Jika sensor merespon dalam 60 detik terakhir, anggap WiFi terhubung
if (lastWifiStatus != "Connected") {
updateNotification("WiFi Status", "WiFi terhubung", 3);
lastWifiStatus = "Connected";
print("WiFi dianggap terhubung karena sensor merespon dalam 60 detik terakhir");
}
}
}
void onStart() {
updateNotification("Service Status", "Background Service sedang berjalan...", 0);
// Inisialisasi layanan notifikasi untuk monitoring suhu dan kelembapan
NotificationService().initialize().then((_) {
print("✅ Layanan notifikasi suhu dan kelembapan berhasil diinisialisasi di onStart");
});
backgroundService();
}
void updateNotification(String title, String body, int notificationId) {
print("Menampilkan notifikasi: $title - $body");
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
const AndroidNotificationDetails androidPlatformChannelSpecifics = AndroidNotificationDetails(
'Jago',
'Notification',
channelDescription: 'Cek Notification!!!',
importance: Importance.max,
priority: Priority.high,
);
const NotificationDetails platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics);
flutterLocalNotificationsPlugin.show(
notificationId,
title, // Judul notifikasi yang relevan
body, // Isi notifikasi yang relevan
platformChannelSpecifics,
payload: 'item x',
);
}