511 lines
17 KiB
PHP
511 lines
17 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Illuminate\Support\Facades\File;
|
|
use Illuminate\Support\Facades\Log;
|
|
use Carbon\Carbon;
|
|
|
|
class HistoryController extends Controller
|
|
{
|
|
// Path relatif ke file Firebase JSON export
|
|
protected $firebaseJsonPath = 'public/reports/firebase_export.json';
|
|
|
|
// Path relatif untuk file history sensor lokal
|
|
protected $reportFilePath = 'public/reports/report.json';
|
|
|
|
/**
|
|
* Mendapatkan semua data history sensor
|
|
*/
|
|
public function getAll()
|
|
{
|
|
// Debug log
|
|
Log::info('HistoryController@getAll dipanggil');
|
|
|
|
// Inisialisasi array untuk menyimpan history
|
|
$history = [];
|
|
|
|
try {
|
|
// Periksa apakah file Firebase export ada
|
|
if (Storage::exists($this->firebaseJsonPath)) {
|
|
Log::info('File Firebase export ditemukan');
|
|
|
|
// Baca file JSON Firebase
|
|
$jsonData = Storage::get($this->firebaseJsonPath);
|
|
$firebaseData = json_decode($jsonData, true);
|
|
|
|
// Jika struktur Firebase terdeteksi, ambil data sensor dari situ
|
|
if ($firebaseData && isset($firebaseData['sensor'])) {
|
|
$timestamp = now()->toIso8601String();
|
|
|
|
// Jika ada timestamp di file Firebase, gunakan itu
|
|
if (isset($firebaseData['status']['last_seen'])) {
|
|
$today = Carbon::today()->format('Y-m-d');
|
|
$timestamp = Carbon::parse($today . ' ' . $firebaseData['status']['last_seen'])->toIso8601String();
|
|
}
|
|
|
|
// Tambahkan data sensor suhu
|
|
if (isset($firebaseData['sensor']['suhu'])) {
|
|
$history[] = [
|
|
'timestamp' => $timestamp,
|
|
'sensor' => 'suhu',
|
|
'newValue' => $firebaseData['sensor']['suhu']
|
|
];
|
|
}
|
|
|
|
// Tambahkan data sensor kelembaban
|
|
if (isset($firebaseData['sensor']['kelembaban'])) {
|
|
$history[] = [
|
|
'timestamp' => $timestamp,
|
|
'sensor' => 'kelembaban',
|
|
'newValue' => $firebaseData['sensor']['kelembaban']
|
|
];
|
|
}
|
|
|
|
// Tambahkan data sensor cahaya
|
|
if (isset($firebaseData['sensor']['cahaya'])) {
|
|
$history[] = [
|
|
'timestamp' => $timestamp,
|
|
'sensor' => 'cahaya',
|
|
'newValue' => $firebaseData['sensor']['cahaya']
|
|
];
|
|
}
|
|
|
|
// Tambahkan data sensor kelembapan tanah
|
|
if (isset($firebaseData['sensor']['kelembapan_tanah'])) {
|
|
$history[] = [
|
|
'timestamp' => $timestamp,
|
|
'sensor' => 'kelembapan_tanah',
|
|
'newValue' => $firebaseData['sensor']['kelembapan_tanah']
|
|
];
|
|
}
|
|
|
|
Log::info('Data sensor dari Firebase berhasil diambil');
|
|
}
|
|
}
|
|
|
|
// Periksa juga file history lokal jika ada
|
|
if (Storage::exists($this->reportFilePath)) {
|
|
Log::info('File history lokal ditemukan');
|
|
$localJsonData = Storage::get($this->reportFilePath);
|
|
$localHistory = json_decode($localJsonData, true) ?: [];
|
|
|
|
// Gabungkan data lokal dengan data dari Firebase
|
|
$history = array_merge($history, $localHistory);
|
|
|
|
// Urutkan berdasarkan timestamp terbaru
|
|
usort($history, function($a, $b) {
|
|
return strtotime($b['timestamp']) - strtotime($a['timestamp']);
|
|
});
|
|
|
|
Log::info('Data history lokal berhasil diambil dan digabungkan');
|
|
}
|
|
|
|
// Jika tidak ada data sama sekali, kembalikan array kosong
|
|
if (empty($history)) {
|
|
Log::info('Tidak ada data history yang ditemukan');
|
|
return response()->json([]);
|
|
}
|
|
|
|
Log::info('Total data history: ' . count($history));
|
|
return response()->json($history);
|
|
|
|
} catch (\Exception $e) {
|
|
Log::error('Error saat mengambil data history: ' . $e->getMessage());
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Terjadi kesalahan saat mengambil data history: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Mendapatkan data langsung dari Firebase (untuk testing)
|
|
*/
|
|
public function getFirebaseData()
|
|
{
|
|
try {
|
|
// Cek apakah file Firebase export ada
|
|
if (!Storage::exists($this->firebaseJsonPath)) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'File Firebase export tidak ditemukan'
|
|
], 404);
|
|
}
|
|
|
|
// Baca file JSON Firebase
|
|
$jsonData = Storage::get($this->firebaseJsonPath);
|
|
$firebaseData = json_decode($jsonData, true);
|
|
|
|
return response()->json([
|
|
'status' => 'success',
|
|
'data' => $firebaseData
|
|
]);
|
|
|
|
} catch (\Exception $e) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Terjadi kesalahan: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Mendapatkan data sensor terkini dengan status dan aksi
|
|
*/
|
|
public function getCurrentSensorData()
|
|
{
|
|
try {
|
|
// Cek apakah file Firebase export ada
|
|
if (!Storage::exists($this->firebaseJsonPath)) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'File Firebase export tidak ditemukan'
|
|
], 404);
|
|
}
|
|
|
|
// Baca file JSON Firebase
|
|
$jsonData = Storage::get($this->firebaseJsonPath);
|
|
$firebaseData = json_decode($jsonData, true);
|
|
|
|
// Periksa apakah data sensor ada
|
|
if (!isset($firebaseData['sensor'])) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Data sensor tidak ditemukan'
|
|
], 404);
|
|
}
|
|
|
|
// Siapkan data yang akan dikembalikan
|
|
$sensorData = [
|
|
'suhu' => [
|
|
'nilai' => $firebaseData['sensor']['suhu'] ?? null,
|
|
'status' => $this->getSuhuStatus($firebaseData['sensor']['suhu'] ?? null),
|
|
'aksi' => $this->getSuhuAksi($firebaseData['sensor']['suhu'] ?? null)
|
|
],
|
|
'kelembaban' => [
|
|
'nilai' => $firebaseData['sensor']['kelembapan_tanah'] ?? null,
|
|
'status' => $this->getKelembabanStatus($firebaseData['sensor']['kelembapan_tanah'] ?? null),
|
|
'aksi' => $this->getKelembabanAksi($firebaseData['sensor']['kelembapan_tanah'] ?? null)
|
|
],
|
|
'cahaya' => [
|
|
'nilai' => $firebaseData['sensor']['cahaya'] ?? null,
|
|
'status' => $this->getCahayaStatus($firebaseData['sensor']['cahaya'] ?? null),
|
|
'aksi' => $this->getCahayaAksi($firebaseData['sensor']['cahaya'] ?? null)
|
|
],
|
|
'connected' => $firebaseData['status']['connected'] ?? false,
|
|
'last_seen' => $firebaseData['status']['last_seen'] ?? null
|
|
];
|
|
|
|
return response()->json([
|
|
'status' => 'success',
|
|
'data' => $sensorData
|
|
]);
|
|
|
|
} catch (\Exception $e) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Terjadi kesalahan: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Menentukan status suhu berdasarkan nilai
|
|
*/
|
|
private function getSuhuStatus($value)
|
|
{
|
|
if ($value === null) return '--';
|
|
|
|
if ($value < 24) {
|
|
return 'Rendah';
|
|
} else if ($value >= 25 && $value <= 27) {
|
|
return 'Normal';
|
|
} else if ($value >= 28) {
|
|
return 'Tinggi';
|
|
}
|
|
|
|
return '--';
|
|
}
|
|
|
|
/**
|
|
* Menentukan aksi suhu berdasarkan nilai
|
|
*/
|
|
private function getSuhuAksi($value)
|
|
{
|
|
if ($value === null) return '--';
|
|
|
|
if ($value < 24) {
|
|
return 'Kipas Off';
|
|
} else if ($value >= 25 && $value <= 27) {
|
|
return 'Kipas Off';
|
|
} else if ($value >= 28) {
|
|
return 'Kipas On';
|
|
}
|
|
|
|
return '--';
|
|
}
|
|
|
|
/**
|
|
* Menentukan status kelembaban tanah berdasarkan nilai
|
|
*/
|
|
private function getKelembabanStatus($value)
|
|
{
|
|
if ($value === null) return '--';
|
|
|
|
if ($value < 40) {
|
|
return 'Kering';
|
|
} else if ($value >= 40 && $value < 50) {
|
|
return 'Cukup';
|
|
} else if ($value >= 50 && $value < 60) {
|
|
return 'Optimal';
|
|
} else if ($value >= 60 && $value <= 70) {
|
|
return 'Lembap';
|
|
} else if ($value > 70) {
|
|
return 'Sangat Lembap';
|
|
}
|
|
|
|
return '--';
|
|
}
|
|
|
|
/**
|
|
* Menentukan aksi kelembaban tanah berdasarkan nilai
|
|
*/
|
|
private function getKelembabanAksi($value)
|
|
{
|
|
if ($value === null) return '--';
|
|
|
|
if ($value < 40) {
|
|
return 'Pompa Air On';
|
|
} else {
|
|
return 'Pompa Air Off';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Menentukan status cahaya berdasarkan nilai
|
|
*/
|
|
private function getCahayaStatus($value)
|
|
{
|
|
if ($value === null) return '--';
|
|
|
|
if ($value < 8000) {
|
|
return 'Rendah';
|
|
} else if ($value >= 8001 && $value <= 11000) {
|
|
return 'Normal';
|
|
} else if ($value > 11001) {
|
|
return 'Tinggi';
|
|
}
|
|
|
|
return '--';
|
|
}
|
|
|
|
/**
|
|
* Menentukan aksi cahaya berdasarkan nilai
|
|
*/
|
|
private function getCahayaAksi($value)
|
|
{
|
|
if ($value === null) return '--';
|
|
|
|
if ($value < 8000) {
|
|
return 'Lampu On';
|
|
} else {
|
|
return 'Lampu Off';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Menyimpan data baru ke history
|
|
*/
|
|
public function store(Request $request)
|
|
{
|
|
// Validasi request
|
|
$request->validate([
|
|
'sensor' => 'required|string',
|
|
'newValue' => 'required|numeric',
|
|
'timestamp' => 'nullable|string'
|
|
]);
|
|
|
|
// Baca data yang ada
|
|
$history = [];
|
|
if (Storage::exists($this->reportFilePath)) {
|
|
$jsonData = Storage::get($this->reportFilePath);
|
|
$history = json_decode($jsonData, true) ?: [];
|
|
}
|
|
|
|
// Buat data baru
|
|
$newData = [
|
|
'timestamp' => $request->input('timestamp', now()->toIso8601String()),
|
|
'sensor' => $request->input('sensor'),
|
|
'newValue' => $request->input('newValue')
|
|
];
|
|
|
|
// Tambahkan data baru ke awal array (terbaru di atas)
|
|
array_unshift($history, $newData);
|
|
|
|
// Simpan kembali ke file
|
|
Storage::put($this->reportFilePath, json_encode($history, JSON_PRETTY_PRINT));
|
|
|
|
return response()->json([
|
|
'status' => 'success',
|
|
'message' => 'Data berhasil disimpan',
|
|
'data' => $newData
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Menyinkronkan data dari Firebase Export ke file history lokal
|
|
*/
|
|
public function syncFromFirebase()
|
|
{
|
|
try {
|
|
// Periksa apakah file Firebase export ada
|
|
if (!Storage::exists($this->firebaseJsonPath)) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'File Firebase export tidak ditemukan'
|
|
], 404);
|
|
}
|
|
|
|
// Baca file JSON Firebase
|
|
$jsonData = Storage::get($this->firebaseJsonPath);
|
|
$firebaseData = json_decode($jsonData, true);
|
|
|
|
// Periksa apakah data sensor ada
|
|
if (!isset($firebaseData['sensor'])) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Data sensor tidak ditemukan di file Firebase'
|
|
], 400);
|
|
}
|
|
|
|
// Baca data history yang ada
|
|
$history = [];
|
|
if (Storage::exists($this->reportFilePath)) {
|
|
$localJsonData = Storage::get($this->reportFilePath);
|
|
$history = json_decode($localJsonData, true) ?: [];
|
|
}
|
|
|
|
// Ambil timestamp
|
|
$timestamp = now()->toIso8601String();
|
|
if (isset($firebaseData['status']['last_seen'])) {
|
|
$today = Carbon::today()->format('Y-m-d');
|
|
$timestamp = Carbon::parse($today . ' ' . $firebaseData['status']['last_seen'])->toIso8601String();
|
|
}
|
|
|
|
// Tambahkan data sensor suhu
|
|
if (isset($firebaseData['sensor']['suhu'])) {
|
|
$history[] = [
|
|
'timestamp' => $timestamp,
|
|
'sensor' => 'suhu',
|
|
'newValue' => $firebaseData['sensor']['suhu']
|
|
];
|
|
}
|
|
|
|
// // Tambahkan data sensor kelembaban
|
|
// if (isset($firebaseData['sensor']['kelembaban'])) {
|
|
// $history[] = [
|
|
// 'timestamp' => $timestamp,
|
|
// 'sensor' => 'kelembaban',
|
|
// 'newValue' => $firebaseData['sensor']['kelembaban']
|
|
// ];
|
|
// }
|
|
|
|
// Tambahkan data sensor cahaya
|
|
if (isset($firebaseData['sensor']['cahaya'])) {
|
|
$history[] = [
|
|
'timestamp' => $timestamp,
|
|
'sensor' => 'cahaya',
|
|
'newValue' => $firebaseData['sensor']['cahaya']
|
|
];
|
|
}
|
|
|
|
// Tambahkan data sensor kelembapan tanah
|
|
if (isset($firebaseData['sensor']['kelembapan_tanah'])) {
|
|
$history[] = [
|
|
'timestamp' => $timestamp,
|
|
'sensor' => 'kelembapan_tanah',
|
|
'newValue' => $firebaseData['sensor']['kelembapan_tanah']
|
|
];
|
|
}
|
|
|
|
// Urutkan berdasarkan timestamp terbaru
|
|
usort($history, function($a, $b) {
|
|
return strtotime($b['timestamp']) - strtotime($a['timestamp']);
|
|
});
|
|
|
|
// Simpan kembali ke file
|
|
Storage::put($this->reportFilePath, json_encode($history, JSON_PRETTY_PRINT));
|
|
|
|
return response()->json([
|
|
'status' => 'success',
|
|
'message' => 'Data berhasil disinkronkan dari Firebase',
|
|
'data_count' => count($history)
|
|
]);
|
|
|
|
} catch (\Exception $e) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Terjadi kesalahan saat sinkronisasi: ' . $e->getMessage()
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Menghapus satu data dari history
|
|
*/
|
|
public function delete(Request $request)
|
|
{
|
|
$request->validate([
|
|
'index' => 'required|integer|min:0'
|
|
]);
|
|
|
|
$index = $request->input('index');
|
|
|
|
// Baca data yang ada
|
|
if (!Storage::exists($this->reportFilePath)) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'File history tidak ditemukan'
|
|
], 404);
|
|
}
|
|
|
|
$jsonData = Storage::get($this->reportFilePath);
|
|
$history = json_decode($jsonData, true) ?: [];
|
|
|
|
// Pastikan index valid
|
|
if (!isset($history[$index])) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Data dengan index tersebut tidak ditemukan'
|
|
], 404);
|
|
}
|
|
|
|
// Hapus data
|
|
array_splice($history, $index, 1);
|
|
|
|
// Simpan kembali ke file
|
|
Storage::put($this->reportFilePath, json_encode($history, JSON_PRETTY_PRINT));
|
|
|
|
return response()->json([
|
|
'status' => 'success',
|
|
'message' => 'Data berhasil dihapus'
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Menghapus semua data history
|
|
*/
|
|
public function clear()
|
|
{
|
|
// Hapus semua data dengan menyimpan array kosong
|
|
Storage::put($this->reportFilePath, json_encode([]));
|
|
|
|
return response()->json([
|
|
'status' => 'success',
|
|
'message' => 'Semua data history berhasil dihapus'
|
|
]);
|
|
}
|
|
}
|