196 lines
7.9 KiB
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',
|
|
);
|
|
} |